티스토리 뷰

우리나라 임신, 출산, 육아관련 최대 커뮤니티는 바로 네이버의 '맘스홀릭 베이비'라는 카페이다.

이 곳의 '임신 준비 질문 방 > 임신 중 질문 방' 이라는 게시판의 데이터를 활용하도록 한다.

모든 경우의 수를 다 계산한 완벽한 코드는 아니라고 생각한다. 그리고 자동입력방지 문자 입력하는 부분은 수기로 해야하니 완벽히 자동화 된 것도 아니다. 그래도 내 목적에 맞게 데이터 모으기에는 맞게 짰다.(마지막 페이지까지 긁는데 몇 시간 걸리더라... 10시간 넘게 걸렸던 것 같은데.) 동작 방식을 완벽히 아는 것도 아니다. 작년에 웹 만들어보겠다고 사부작 거리던 시절이 있어 코드의 어느 부분에 tag를 저렇게 집어 넣으면 돌아가겠구나 싶어서 블로그 찾아보면서 만들었다.  그래도 내 필요에 의해 수정했다.

그래도 코드 설명은 주석으로ㅎ

from selenium import webdriver
from bs4 import BeautifulSoup as bs
import csv
 
driver = webdriver.Chrome(executable_path = "C:\chromedriver.exe")
driver.implicitly_wait(3)

# Create csv file
total_list = ['말머리', '제목', '내용'] # column name in csv
f = open('preg_quest.csv', 'w', encoding = 'ansi', newline='') # make new file if file doesn't exist
wr = csv.writer(f)
wr.writerow([total_list[0], total_list[1], total_list[2]])
f.close()
 
# Login Page
driver.get('https://nid.naver.com/nidlogin.login')
driver.find_element_by_name('id').send_keys('ID')
driver.find_element_by_name('pw').send_keys('PWD')
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 = cafe main page url
base_url = 'https://cafe.naver.com/imsanbu/ArticleList.nhn?search.clubid=10094499'
 
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로는 몇개의 데이터를 모았는지 알 수 있음

donaricano-btn

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함