강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của mma31612
mma31612

câu hỏi đã được viết

Bài giảng phát triển chương trình tự động hóa blog (Python + Selenium)

[Trường hợp ngoại lệ] Hãy phát triển tính năng tự động tạo nhóm lân cận 1

서로 이웃 추가 버튼 클릭 시 Mac 오류

Đã giải quyết

Viết

·

587

1

스크린샷 2022-10-25 오후 11.25.13.png

안녕하세요.

강의듣고 공부중에 Mac OS에서 Windows에서 나지 않던 위와 같은 오류가 나서 문의드립니다.

서로이웃 신청 버튼 클릭 시

.click()

블로그 접속 불가라는 탭이 하나 생성되는데요. 이유를 알 수 있을까요?

감사합니다.

seleniumpython

Câu trả lời 3

2

lread90님의 프로필 이미지
lread90
Người chia sẻ kiến thức

아ㅏㅏㅏㅏㅏ 드디어 찾았다 !!!

 

[문제 해결방법]


image

 

보내주신 코드 185번째 라인을 봐주셔요

os_Platform이 Darwin인데 ~ Keys.CONTROL !!!!!이 되어있습니다

184번째줄에 잘 작성해주신것처럼

185번째줄 코드를 Keys.CONTROL => Keys.COMMAND로 고쳐주시면 됩니다

 

[문제원인]

Control 키가 눌러져있는 상태로 OK 버튼을 누르셨는데, OK 버튼은 <a> 태그가 아닌지라 특정 링크로 연결되는 곳이 없어서, 갈곳잃은 브라우저는 오류페이지를 뱉어냈던겁니다 : )

 

mma31612님의 프로필 이미지
mma31612
Người đặt câu hỏi

와ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ

이런대박실수를.. 확인감사합니다 :)

1

lread90님의 프로필 이미지
lread90
Người chia sẻ kiến thức

퇴근해서 한번씩 실행해보는데 별걸 다 확인했네요..

혹시, 네이버 측에서 .click()으로하면 봇을 차단하나? 도 확인해보고 했었는데
문제 원인을 찾아서 다행입니다

 

차후에, 고급 크롤링으로 가시면
ActionChain을 활용해서

ActionChains(driver).scroll()
ActionChains(driver).move_to_element()
ActionChains(driver).move_by_offset() 등등 다양한 기능으로 개발하시게 될겁니다 !

 

혹시, 왕고고님은 이런 셀레니움 고급과정(사람처럼 활동하는 크롤러 개발)에 관심이 있으실까요 ?

mma31612님의 프로필 이미지
mma31612
Người đặt câu hỏi

넵. 관심있습니다!

lread90님의 프로필 이미지
lread90
Người chia sẻ kiến thức

셀레니움 고급 클래스 이름으로 한번 강의 만들어 보겠습니다 ..!

답변 감사합니다 ㅎㅎㅎ

0

lread90님의 프로필 이미지
lread90
Người chia sẻ kiến thức

안녕하세요 수강생 왕고고님 : )

서로이웃 신청 버튼 클릭시에 발생한 에러가 현재도 계속 지속적으로 발생되나요?

 

프로그램 코드도 함께 첨부해주시면 빠르게 도와드리겠습니다 !

mma31612님의 프로필 이미지
mma31612
Người đặt câu hỏi

안녕하세요!  코드 첨부해드립니다. 


from tkinter import E
import pyperclip
import time
from selenium import webdriver
import chromedriver_autoinstaller
import data.loginInfo as loginData
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import platform
import random

chromedriver_autoinstaller.install()
# print(platform.system())
os_Platform = platform.system()

# pipenv install chromedriver-autoinstaller
driver = webdriver.Chrome()

# ******************************************1. 로그인 시작*********************************************
def login_Driver(driver):

    driver.get(
        "https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com"
    )

    print(loginData.naverId)
    my_id, my_pw = loginData.naverId, loginData.naverPassword
    id_Selector = "#id"
    pw_Selector = "#pw"
    loginBtn_Selector = "#log\.login"

    id_input = driver.find_element(By.CSS_SELECTOR, id_Selector)
    pw_input = driver.find_element(By.CSS_SELECTOR, pw_Selector)
    loginBtn = driver.find_element(By.CSS_SELECTOR, loginBtn_Selector)

    id_input.click()
    time.sleep(0.3)
    pyperclip.copy(loginData.naverId)
    time.sleep(0.3)

    if os_Platform == "Darwin":
        ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
            Keys.CONTROL
        ).perform()
    else:
        ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
            Keys.CONTROL
        ).perform()

    pw_input.click()
    time.sleep(0.3)
    pyperclip.copy(my_pw)
    time.sleep(0.3)
    if os_Platform == "Darwin":
        ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
            Keys.CONTROL
        ).perform()
    else:
        ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
            Keys.CONTROL
        ).perform()
    time.sleep(0.5)
    loginBtn.click()


# ******************************************2. 블로그 아이디 추출*********************************************
def extract_blog_id(driver, keyword, max_count=100):
    search_link = f"https://search.naver.com/search.naver?query={keyword}&nso=&where=blog&sm=tab_opt"

    # sp_blog_1 > div > div > a

    driver.get(search_link)
    # 스크롤 내림 진행
    # _view_review_body_html > div > more-contents > div > ul
    max_count = 100
    postings_selector = "#_view_review_body_html > div > more-contents > div > ul > li"
    postings = driver.find_elements(By.CSS_SELECTOR, postings_selector)
    current_line = len(postings)
    blog_id_list = []

    while current_line < max_count:
        time.sleep(0.2)
        driver.execute_script("window.scrollBy(0,500);")
        postings = driver.find_elements(By.CSS_SELECTOR, postings_selector)
        current_line = len(postings)

        # # 선택된 블로그 정보 파싱
        # blogtitle_selector = f"#sp_blog_{current_line} > div > div > a"
        # title_a_tag = driver.find_element(By.CSS_SELECTOR, blogtitle_selector)
        # blog_url = title_a_tag.get_attribute("href")
        # blog_id = blog_url.split("/")[-2]
        # blog_id_list.append(blog_id)
        # print(f"{blog_id}, URL : {blog_url}")

    # ID, URL 추출
    time.sleep(1.5)
    for idx in range(1, max_count):
        blogtitle_selector = f"#sp_blog_{idx} > div > div > a"
        title_a_tag = driver.find_element(By.CSS_SELECTOR, blogtitle_selector)
        blog_url = title_a_tag.get_attribute("href")
        blog_id = blog_url.split("/")[-2]
        blog_id_list.append(blog_id)
        # print(f"{blog_id}")

    # 추출된 블로거 계정 중복 제거

    visited_account = []
    # 이웃신청을 건 블로거의 계정 제거
    with open("./already_done.txt", "r") as f:
        _visited_account = f.readlines()
        for v_account in _visited_account:
            v_account = v_account.rstrip()
            visited_account.append(v_account)

    # 추가할 블로그 계정 중 이미 이웃신청건 계정을 제거
    blog_ids = list(set(blog_id_list) - set(visited_account))
    print(blog_ids)
    with open("./blog_id_list.txt", "a") as f:
        for blogid in blog_id_list:
            f.write(f"{blogid}\n")


# ******************************************3. 서로이웃 추가*********************************************
def initialize():
    with open("./blog_id_list.txt", "w") as f:
        f.write("")


def add_buddy_send(driver):
    f = open("./blog_id_list.txt", "r")
    blog_ids = f.readlines()
    f.close()
    # print(blog_ids)

    blog_ids = list(set(blog_ids))

    for blog_id in blog_ids:
        blog_id = blog_id.replace("\n", "")
        add_buddy_link = f"https://m.blog.naver.com/BuddyAddForm.naver?blogId={blog_id}"
        driver.get(add_buddy_link)
        time.sleep(2)

        #
        both_add_buddy_btn_selector = "#bothBuddyRadio"

        # 0. 이미 서로이웃 신청 한 상황
        try:
            # 버튼이 존재할때
            both_add_buddy_btn = driver.find_element(
                By.CSS_SELECTOR, both_add_buddy_btn_selector
            )
        except Exception as e:
            # 버튼이 존재하지 않을때
            print(e)
            continue
        both_add_buddy_btn = driver.find_element(
            By.CSS_SELECTOR, both_add_buddy_btn_selector
        )
        disabled = both_add_buddy_btn.get_attribute("disabled")
        # 1. 서로이웃 가능 확인 diabled = None, True
        if disabled == "true":
            continue

        both_add_buddy_btn.click()
        time.sleep(random.randrange(3, 7) / 10)

        # 2. 정상 실행 시작
        # 2-1. 서로 이웃 멘트 작성
        comments = "안녕하세요. 앞으로 서로이웃으로 친하게 지냈으면 좋겠습니다. "
        pyperclip.copy(comments)
        comment_selector = "#buddyAddForm > fieldset > div > div.set_detail_t1 > div.set_detail_t1 > div > textarea"

        comment_area = driver.find_element(By.CSS_SELECTOR, comment_selector)
        comment_area.click()
        comment_area.clear()
        comment_area.click()

        time.sleep(random.randrange(3, 7) / 10)
        if os_Platform == "Darwin":
            ActionChains(driver).key_down(Keys.COMMAND).send_keys("v").key_up(
                Keys.CONTROL
            ).perform()
        else:
            ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(
                Keys.CONTROL
            ).perform()
        time.sleep(0.5)
        # 2-2. 서로이웃 추가 클릭

        time.sleep(0.5)
        ok_btn_selector = "body > ui-view > div.head.type1 > a.btn_ok"
        ok_btn = driver.find_element(By.CSS_SELECTOR, ok_btn_selector)
        ok_btn.click()

        time.sleep(0.5)

        # 이미 추가한 블로그 아이디 리스트에 추가
        with open("./already_done.txt", "a") as f:
            f.write(f"{blog_id}\n")

        time.sleep(random.randrange(6, 8))


initialize()
login_Driver(driver)
# 여러개의 키워드에서 이웃을 추출
keywords = ["자동화 수익", "패시브 인컴"]
try:

    for keyword in keywords:
        extract_blog_id(driver, keyword, max_count=90)
    add_buddy_send(driver)
except Exception as e:
    print(f"Add_Buddy_Send Error : {e}")

input()
Hình ảnh hồ sơ của mma31612
mma31612

câu hỏi đã được viết

Đặt câu hỏi