티스토리 뷰
우리나라 임신, 출산, 육아관련 최대 커뮤니티는 바로 네이버의 '맘스홀릭 베이비'라는 카페이다.
이 곳의 '임신 준비 질문 방 > 임신 중 질문 방' 이라는 게시판의 데이터를 활용하도록 한다.
모든 경우의 수를 다 계산한 완벽한 코드는 아니라고 생각한다. 그리고 자동입력방지 문자 입력하는 부분은 수기로 해야하니 완벽히 자동화 된 것도 아니다. 그래도 내 목적에 맞게 데이터 모으기에는 맞게 짰다.(마지막 페이지까지 긁는데 몇 시간 걸리더라... 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로는 몇개의 데이터를 모았는지 알 수 있음
'CS > Data Science' 카테고리의 다른 글
[Tableau] MySQL Server와 연결하는 다양한 방법 (0) | 2021.05.26 |
---|---|
[ML hands-on] Tensorflow for Poets 2 (꽃 이미지 분류) (0) | 2019.06.09 |
[0.78468]Kaggle(캐글) : Titanic 생존자 예측(Logistic Regression) (0) | 2019.05.30 |
임산부를 위한 챗봇(3) - Text Preprocessing(1) (4) | 2019.04.04 |
임산부를 위한 챗봇(1) 아이디어 (0) | 2019.04.01 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 데이터분석
- 커넥트재단
- RxSwift
- 코테
- 프로그래머스
- 개발자인턴
- 운영체제
- 코딩테스트
- SWIFT
- ios
- firebase
- nosql
- 졸업작품
- 소프트웨어역량시험
- TableView
- 보안
- 컴퓨터공학
- swacademy
- 인턴
- 부스트캠프2020
- 컴과졸작
- 삼성
- 소프트웨어아카데미
- 삼성소프트웨어아카데미
- OS
- 부스트캠프
- 알고리즘
- C++
- 컴공졸작
- 부캠
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함