-
파이썬,셀레니움으로 에브리타임 핫 게시판 크롤링 하기코딩 2020. 4. 7. 22:37
https://brunch.co.kr/@carpediem7760/12
과정에 대해서는 위의 링크에 있으니 읽으시면 이해가 더 쉽게 될 것입니다.
파이썬의 셀레니움을 이용해서 에브리타임의 핫 게시판의 글들을 가져오고 엑셀(공감수, 제목, 내용, url) or 형태소 분석 하는 코드로 나누었습니다.
저는 주피터 노트북으로 작업했습니다.
사용한 라이브러리: BeautifulSoup, Selenium, requests,konlpy,openpyx
아래는 크롤링한 정보를 토대로 엑셀로 공감수, 제목, 내용, url로 저장하는 방법입니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778#엑셀 저장화from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom urllib.request import urlopenfrom bs4 import BeautifulSoupimport timefrom konlpy.tag import Kkmaimport openpyxl#라이브러리 불러오기kma = Kkma()excel_file = openpyxl.Workbook()excel_sheet = excel_file.active#엑셀 파일로 저장하기 위한 작업 startchromedriver ='C:\dev_python\Webdriver\chromedriver.exe'driver = webdriver.Chrome(chromedriver)#selenium 라이브러리 기본 작업driver.get('https://everytime.kr/login')#크롤링 할 홈페이지 가져오기driver.find_element_by_name("userid").send_keys("내 아이디")#태그의 네임이 userid 인 element 가져오고 "내 아이디" 입력driver.find_element_by_name("password").send_keys("비밀번호")#태그의 네임이 password 인 element 가져오고 "비밀번호" 입력driver.find_element_by_tag_name("input").send_keys(Keys.RETURN)#로그인 버튼 찾고 클릭time.sleep(2)driver.find_element_by_xpath('//*[@id="container"]/div[3]/div[2]/div/h3/a').click()time.sleep(2)driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a').click()time.sleep(1)#핫게시판으로 가능 경로로 이동하기def next_page():driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()time.sleep(0.5)res = driver.page_sourcesoup = BeautifulSoup(res,"html.parser")data_name = soup.select('#container > div.wrap.articles > article > a > h2')data_num = soup.select('.vote')data_text = soup.select('#container > div.wrap.articles > article > a > p')data_url = soup.select('#container > div.wrap.articles > article > a')#함수 next_page 생성, 핫 게시판에서 (공감수, 제목, 내용, url) 찾고 저장할 준비for num,name,text,url in zip(data_num,data_name,data_text,data_url):excel_sheet.append([int(num.get_text()),name.get_text(),text.get_text(),'https://everytime.kr'+url.get('href')])#num,name,text,url 이라는 폴더에 (공감수, 제목, 내용, url) 각각 넣고 튜플로 저장driver.find_element_by_xpath('//*[@id="sheet"]/ul/li[3]/a').click()# 2페이지에 뜨는 광고창 1번 끄기time.sleep(0.5)for page_roof in range(30):next_page()# next_page를 page_roof라는 폴더에 넣고 30번 반복excel_file.save('everytime crawing.xlsx')# everytime crawing 라는 엑셀 파일에 저장excel_file.close()driver.quit()cs 실행 결과는 이렇습니다.
다음은 형태소로 나누는 작업입니다.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475#엑셀 저장화from selenium import webdriverfrom selenium.webdriver.common.keys import Keysfrom urllib.request import urlopenfrom bs4 import BeautifulSoupimport timefrom konlpy.tag import Kkmaimport openpyxl#라이브러리 불러오기kma = Kkma()#형태소 라이브러리를 kma로 칭함chromedriver ='C:\dev_python\Webdriver\chromedriver.exe'driver = webdriver.Chrome(chromedriver)#selenium 라이브러리 기본 작업driver.get('https://everytime.kr/login')#크롤링 할 홈페이지 가져오기id_every = driver.find_element_by_name("userid")#태그의 네임이 userid 인 element 가져오기id_every.send_keys("내 아이디^ㅇ^")#userid에 아이디 입력pwd_every = driver.find_element_by_name("password")#태그의 네임이 password 인 element 가져오기pwd_every.send_keys("비~밀번호")#password에 비밀번호 입력login_btn =driver.find_element_by_tag_name("input")login_btn.send_keys(Keys.RETURN)#로그인 버튼 찾고 클릭time.sleep(2)driver.find_element_by_xpath('//*[@id="container"]/div[3]/div[2]/div/h3/a').click()time.sleep(2)driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a').click()time.sleep(1)#핫게시판으로 가능 경로로 이동하기def next_page():driver.find_element_by_css_selector('#container > div.wrap.articles > div.pagination > a.next').click()time.sleep(0.5)res = driver.page_sourcesoup = BeautifulSoup(res,"html.parser")data = soup.select('#container > div.wrap.articles > article > a > p')for datas in data:print(datas.get_text())#엑셀 코드와는 다르게 내용만 가져오는 함수를 만들었습니다.driver.find_element_by_xpath('//*[@id="sheet"]/ul/li[3]/a').click()time.sleep(0.5)for page_roof in range(30):next_page()#30 번 반복page_tex = page_roof()#page_roof는 page_tex에 포함word = kma.nouns(page_tex)#단어로 변환print(word)cs 단어로 분할한 결과물입니다. 이것을 빈도수에 맞게 나열해볼까요?
123456789101112131415161718#빈도수 내림차순from collections import Countercount = Counter(word)tag_count= []tags = []for n,c in count.most_common(1000):dics = {'tag':n, 'count':c}if len(dics['tag']) >= 2 and len(tags)<=49:tag_count.append(dics)tags.append(dics['tag'])for tag in tag_count:print("{:<14}".format(tag['tag']),end='\t')print("{}".format(tag['count']))cs 빈도수로 나눈 결과 값입니다!
궁금하신 것이 있다면 댓글 남겨주세요!