웹 크롤링 질문드립니다.

조회수 893회

안녕하세요. 아시겠지만, 홈페이지마다 긁어오는 형식이 다른 웹 크롤링 공부를 하던 도중 카페도 다를가 해서 예제를 찾아보고 다른 카페에 적용하던 도중 오류가 생겨 질문 드립니다. 해당코드는 이렇습니다.

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 상업적으로는 절대 사용하지 않습니다.

  • 데이터는 입력안되고 빈공간으로 출력되더라구요 ㅠㅠ 왜그런지 알수 있을까요?? 알 수 없는 사용자 2020.7.28 16:33

1 답변

  • driver.find_element_by_css_selector('#frmNIDLogin > fieldset > input').click()

    이거 제가 해당 실행환경에 있어서 DOM을 확인한건 아니지만 자동입력방지 입력하는거 같은데 이거 로그인 여러번 실패하지 않는 이상 안뜨는걸로 알아요.

    그러니깐 frmNIDLogin > fieldset > input 항목이 없다고 드는거 같은데요

    이거 수정하신다 해도 원활이 될거 같지 않은데...

    html css 대충이라도 살펴보시고 천천히 해보시는거 추천드리고 robots.txt 규칙에 맞게 크롤링 해주세요...

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)