• 카테고리

    질문 & 답변
  • 세부 분야

    기타 (개발 · 프로그래밍)

  • 해결 여부

    해결됨

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

22.10.25 23:29 작성 조회수 372

1

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

안녕하세요.

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

서로이웃 신청 버튼 클릭 시

.click()

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

감사합니다.

답변 3

·

답변을 작성해보세요.

2

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

 

[문제 해결방법]


image

 

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

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

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

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

 

[문제원인]

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

 

왕고고님의 프로필

왕고고

질문자

2022.11.01

와ㅏㅏㅏㅏㅏㅏㅏㅏㅏㅏ

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

1

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

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

 

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

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

 

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

왕고고님의 프로필

왕고고

질문자

2022.11.01

넵. 관심있습니다!

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

답변 감사합니다 ㅎㅎㅎ

0

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

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

 

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

왕고고님의 프로필

왕고고

질문자

2022.10.27

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


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()