인프런 커뮤니티 질문&답변

박수영님의 프로필 이미지
박수영

작성한 질문수

블로그 자동화 프로그램 개발 강의 (파이썬 + 셀레니움)

[모듈화] 개발한 기능을 함수화 시켜봅시다(리팩토링)

-모듈화 강의 듣고있는데 아래 코드를 실행해보니 에러메시지가 뜹니다. FileNotFoundError: [Errno 2] No such file or directory: './already_done.txt'

해결된 질문

작성

·

249

1

-모듈화 강의 듣고있는데

아래 코드를 실행해보니 에러메시지가 뜹니다.

FileNotFoundError: [Errno 2] No such file or directory: './already_done.txt'

행성했던 모든 파일 venv 폴더안에 들어있는데 왜이런메시지가 뜰까요?

 

 

from ast import keyword
from tokenize import maybe
import pyperclip,time
import chromedriver_autoinstaller
import my_data
chromedriver_autoinstaller.install()

from selenium import webdriver
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
options = webdriver.ChromeOptions()
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options)

def login(driver):
    driver.get("https://nid.naver.com/nidlogin.login?mode=form&url=https%3A%2F%2Fwww.naver.com")
    time.sleep(3)
    my_id, my_pw = my_data.id, my_data.pw
    # 1.element의 send_keys함수 사용시 네이버 로그인 캡챠가
    # id_input.send_keys("아이디 입력하기 여기")

    # 2. pyperclip.copy~
    # 아이디 입력하는 구간
    id_selector = "#id"
    id_input = driver.find_element(By.CSS_SELECTOR, id_selector)
    id_input.click()
    time.sleep(0.3)
    pyperclip.copy(my_id) 
    # ctrl + c 복사기능이 실행됨
    time.sleep(0.3)
    ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform() # ctrl + v 기능이 실행됨

    time.sleep(0.5)
    #비밀번호 입력하는 구간
    pw_selector = "#pw"
    pw_input = driver.find_element(By.CSS_SELECTOR, pw_selector)
    pw_input.click()
    time.sleep(0.3)
    pyperclip.copy(my_pw) 
    # ctrl + c 복사기능이 실행됨
    time.sleep(0.3)
    ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform() # ctrl + v 기능이 실행됨
    time.sleep(0.5)

    #로그인버튼 클릭하는 구간
    login_btn_selector = "#log\.login"
    login_btn = driver.find_element(By.CSS_SELECTOR, login_btn_selector)
    login_btn.click()
    time.sleep(0.5)

'''3강. 서이추 신청할 블로거들의 아이디 추출하는 기능'''
def extract_blog_id(driver, keyword, max_count=50):
    search_link = f"https://search.naver.com/search.naver?query={keyword}=&where=blog&sm=tab_opt"
    driver.get(search_link)
    time.sleep(2)

    #우선, 스크롤을 계정이 200개 추출될 만큼 밑으로 내린다
    max_count = 50

    #스크롤해서 추출할 블로거들의 포스팅을 더 불러오게 한다.
    postings_selector = "#_view_review_body_html > div > more-contents > div > ul > li"
    postings = driver.find_elements(By.CSS_SELECTOR, postings_selector)
    cur_posting_count = len(postings)
    while cur_posting_count < max_count:
        driver.execute_script("window.scrollBy(0,500);") #스크롤하는경우
        time.sleep(0.2)
        postings = driver.find_elements(By.CSS_SELECTOR, postings_selector) #
        cur_posting_count = len(postings)
    print("현재 ul 태그가 가지고 있는 li태그의 개수",cur_posting_count)

    #블로거의 계정을 추출
    blog_ids = []
    for idx in range(1, max_count + 1):
        
        title_selector = f"#sp_blog_{idx} > div > div > a"
        title_a_tag = driver.find_element(By.CSS_SELECTOR, title_selector)
        blog_link = title_a_tag.get_attribute("href")
        data = blog_link.split("/")
        target_blog_id = data[-2]
        blog_ids.append(target_blog_id)
    print(blog_ids)
    

    #추출한 블로거 계정 중복을 제거하기
    blog_ids = list(set(blog_ids)) #A집합
    
    #이미 이웃신청을 건 블로거의 계정을 제거
    visited_accounts=[] #B집합
    with open('./already_done.txt',"r") as f:
        _visited_accounts = f.readlines()
        for account in _visited_accounts:
            account = account.rstrip()
            visited_accounts.append(account)
    blog_ids = list(set(blog_ids) - set(visited_accounts))

    #추출한 블로거 계정을 텍스트 파일에 추가하기
    with open('./blog_id.txt',"a") as f:
        for blog_id in blog_ids:
            f.write(f"{blog_id}\n")
def initialize():
     with open('./blog_id.txt',"w") as f:
       f.write("")

def add_buddy_send(drier):  
    f = open('./blog_id.txt',"a")
    blog_ids = f.readlines()
    f.close()

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

        # 0.에러상황: 서로 이웃 신청 버튼 자제차 없음: 이미 이웃 신청한 상태
        both_add_buddy_btn_selector = "#bothBuddyRadio"
        try:
            # 0-1 버튼이 존재할 때
            both_add_buddy_btn = driver.find_element(By.CSS_SELECTOR,both_add_buddy_btn_selector)
        except Exception as e:
            # 0-2 버튼이 존재하지 않을 때
            print(e)
            continue

        # 0-1 버튼이 존재할 때
        # 1.서로 이웃 신청을 받는 사람인가?
        both_add_buddy_btn_selector = "#bothBuddyRadio"
        both_add_buddy_btn = driver.find_element(By.CSS_SELECTOR,both_add_buddy_btn_selector)
        disabled = both_add_buddy_btn.get_attribute("disabled")
        if disabled == "true":
            continue
        
        # 2-1아 이제 정상이니까, 서로 이웃 신청 멘트를 작성하고 
        both_add_buddy_btn.click()
        time.sleep(1)

        comment_selector = "#buddyAddForm > fieldset > div > div.set_detail_t1 > div.set_detail_t1 > div > textarea"
        comment_box = driver.find_element(By.CSS_SELECTOR, comment_selector)
        comment_box.click()
        comment_box.clear()
        comment_box.click()

        time.sleep(0.3)

        comment = "안녕하세요. 초보블로거에용.... 블로그 잘보고갑니당"
        pyperclip.copy(comment) 
        time.sleep(0.3)
        ActionChains(driver).key_down(Keys.CONTROL).send_keys("v").key_up(Keys.CONTROL).perform() # ctrl + v 기능이 실행됨
        time.sleep(0.5)

        # 2-2 서이추 버튼을 누르는 기능을 개발
        add_buddy_btn_selector = "body > ui-view > div.head.type1 > a.btn_ok"
        add_buddy_btn = driver.find_element(By.CSS_SELECTOR, add_buddy_btn_selector)
        add_buddy_btn.click()
        
        #이웃신청을 건 유저를 리스트에 추가한다.
        with open('./already_done.txt',"a") as f:
            f.write(f"{blog_id}\n")

        # 0.5초 딜레이로 이웃을 계속 신청하는 것은 이상함. 사람이 아님
        time.sleep(7)

driver = webdriver.Chrome(options=options)
initialize()     
login(driver)

#여러개의 키워드에서 이웃을 추출
keywords = ["배민원","배달창업"]
for keyword in keywords:
    extract_blog_id(driver, keyword, max_count=10)

add_buddy_send(driver)

는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

답변 1

0

김지유님의 프로필 이미지
김지유
지식공유자

생성하신 파일은 venv/ 폴더 하위가 아니라, venv 폴더와 같은 위치(레벨)에 있어야합니다

 

[변경전 / 현재] venv/already_done.text 라면

[변경후]
Blog_Automization
ㄴvenv
ㄴ already_done.txt

상태가 되어야합니다 : )

 

박수영님의 프로필 이미지
박수영

작성한 질문수

질문하기