안녕하세요. 아시겠지만, 홈페이지마다 긁어오는 형식이 다른 웹 크롤링 공부를 하던 도중 카페도 다를가 해서 예제를 찾아보고 다른 카페에 적용하던 도중 오류가 생겨 질문 드립니다. 해당코드는 이렇습니다.
from selenium import webdriver
from bs4 import BeautifulSoup as bs
import csv
driver = webdriver.Chrome(executable_path = "/Users/GB-OFC-006/Downloads/python/chromedriver.exe")
driver.implicitly_wait(3)
total_list = ['말머리', '제목', '내용']
f = open('preg_quest.csv', 'w', encoding = 'ansi', newline='')
wr = csv.writer(f)
wr.writerow([total_list[0], total_list[1], total_list[2]])
f.close()
driver.get('https://nid.naver.com/nidlogin.login')
driver.find_element_by_name('id').send_keys('gustj258')
driver.find_element_by_name('pw').send_keys('****')
driver.find_element_by_css_selector('#frmNIDLogin > fieldset > input').click()
time.sleep(15) #자동입력방지 문자는 직접 입력
driver.find_element_by_css_selector('#frmNIDLogin > fieldset > input').click()
base_url = 'https://cafe.naver.com/onlysealure/'
cnt = 0 # number of collected data
page = 0 # position of current page
while page < 1000 : # Naver cafe's max page
page = page + 1
quest_urls = []
try :
# add personal conditions
# &search.menuid = : 게시판 번호(카페마다 상이)
# &search.page = : 데이터 수집 할 페이지 번호
# &userDisplay = 50 : 한 페이지에 보여질 게시글 수
driver.get(base_url + '&search.menuid=392&search.page='+ str(page) +'&userDisplay=50')
driver.switch_to.frame('cafe_main') #iframe으로 프레임 전환
quest_list = driver.find_elements_by_css_selector('div.inner_list > a.article') #이 태그 부분 카페마다 다르다던데....
quest_urls = [ i.get_attribute('href') for i in quest_list ]
print(len(quest_urls))
for quest in quest_urls :
try : #게시글이 삭제되었을 경우가 있기 때문에 try-exception
driver.get(quest)
driver.switch_to.frame('cafe_main')
soup = bs(driver.page_source, 'html.parser')
#제목 추출
title = soup.select('div.tit-box span.b')[0].get_text()
#내용 추출
content_tags = soup.select('#tbody')[0].select('p')
content = ' '.join([ tags.get_text() for tags in content_tags ])
#말머리 추출
try : # 말머리 없는 글도 있으니까
tag = soup.select('div.tit-box span.head')[0].get_text()
temp_list = [tag, title, content]
f = open('preg_quest.csv', 'a+', encoding = 'ansi', newline='')
wr = csv.writer(f)
wr.writerow(temp_list)
f.close()
cnt = cnt + 1
except : # 말머리 없으면 next
pass
except : # chrome alert창 처리해줌
driver.switch_to_alert.accpet()
driver.switch_to_alert
driver.switch_to_alert.accpet()
except :
pass
print([page, cnt]) #page로는 진행상황을 알 수 있고 cnt로는 몇개의 데이터를 모았는지 알 수 있음
원본은 임산부 카페였고, 바다낚시 카페를 적용해서 해봤더니
데이터는 입력안되고 빈공간으로 출력되더라구요 ㅠㅠ
왜그런지 알수 있을까요??
도와주세요 코딩 고수여러분!!
출처: https://sueaty.tistory.com/36 상업적으로는 절대 사용하지 않습니다.