해결된 질문
작성
·
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
상태가 되어야합니다 : )