첫번째 크롤링 예제이다. 네이버 블로그에 검색어 입력 후에 나오는 블로그들을 크롤링하고 저장해본다.
검색어를 입력하고 스크롤까지 누르기 때문에 Selenium 모듈을 사용한다. (사실 selenium만 배운상태...)
selenium의 장점은 다음 블로그를 참조하였다.
https://www.hanumoka.net/2020/07/05/python-20200705-python-selenium-install-start/
Selenium 설치하기 및 크롤링 예제
들어가기python으로 크롤링을 할 때, 크롤링 대상인 웹 페이지에 동적인 동작을 곁들여서 크롤링을 할 수 있게 도와주는 라이브러리가 있는데, 그것이 selenium 이다. selenium 장점 웹 드라이버를 사
www.hanumoka.net
0. 모듈과 라이브러리 로딩
#Step 0. 필요한 모듈과 라이브러리를 로딩합니다.
import sys # 시스템
import os # 시스템
import pandas as pd # 판다스 : 데이터분석 라이브러리
import numpy as np # 넘파이 : 숫자, 행렬 데이터 라이브러리
from bs4 import BeautifulSoup # html 데이터를 전처리
from selenium import webdriver # 웹 브라우저 자동화
from selenium.webdriver.common.keys import Keys
import chromedriver_autoinstaller # 크롬 드라이버 자동설치
import time # 서버와 통신할 때 중간중간 시간 지연. 보통은 1초
from tqdm import tqdm_notebook # for문 돌릴 때 진행상황을 %게이지로 알려준다.
# 워닝 무시
import warnings
warnings.filterwarnings('ignore')
검색어로 입력할 단어를 input 함수로 미리 작성해 놓는다.
query_txt = input('1.크롤링할 키워드는 무엇입니까?: ')
1.크롤링할 키워드는 무엇입니까?: 구로디지털단지 맛집
query_txt
'구로디지털단지 맛집'
1. 크롬 웹 브라우저 실행
앞으로 작성하는 크롤러도 같은 코드로 실행한다.
# Step 1. 크롬 웹브라우저 실행
chrome_path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(chrome_path)
# 사이트 주소는 네이버
driver.get('http://www.naver.com')
time.sleep(2) # 2초간 정지
2. 네이버 검색창에 '검색어' 검색
검색 창이 있는 사이트에서 자주 쓰일만한 코드라고 생각된다. 물론 검색 창의 동작방식이 사이트 마다 상이할 수 있다.
# Step 2. 네이버 검색창에 "검색어" 검색
element = driver.find_element_by_id("query")
element.send_keys(query_txt) # query_txt는 위에서 입력한 키워드
element.submit() # 검색어 제출
time.sleep(1)
F12 개발자도구에서 창에서 엘리먼트 선택하기 (Ctrl+Shift+C) 로 검색창 확인 id = query 가 있으므로 id로 요소를 찾아서 셀레니움 언어로 가져온다.
view 클릭하기
- a 태그안에 링크가 있으므로 링크 텍스트 VIEW 클릭하기
- driver.find_element_by_link_text("VIEW").click( )
# 'VIEW' 클릭
driver.find_element_by_link_text("VIEW").click( )
time.sleep(1)
# '옵션' 클릭
driver.find_element_by_link_text("옵션").click( )
time.sleep(1)
검색옵션 확인 (기간 설정하기)
- 기간 선택하기 : 리스트로 가져온 후 선택하는 코드
- .option .txt : 부모클래스 .option을 가져온 뒤 한칸띄고 자식클래스 .txt를 가져오므로 .option .txt 작성
item_li = driver.find_elements_by_css_selector('.option .txt')
for i in range(0, len(item_li)):
print(item_li[i].text)
전체
블로그
카페
관련도순
최신순
전체
1시간
1일
1주
1개월
3개월
6개월
1년
직접입력옵션펼치기
item_li[11].click()
6개월
스크롤 다운 함수 작성
- execute_script(script, *args) : 동기 처리하는 자바스크립트를 실행
# 스크롤을 밑으로 내려주는 함수
def scroll_down(driver):
driver.execute_script("window.scrollTo(0, 99999999)")
time.sleep(1)
# n: 스크롤할 횟수 설정
n = 1 # 스크롤 1번 당 글 30개씩 화면에 보여짐
i = 0
while i < n: # 이 조건이 만족되는 동안 반복 실행
scroll_down(driver) # 스크롤 다운
i = i+1
3. 블로그 글 url들 수집 / URL_raw 크롤링 시작
- 미리 빈 url, 블로그 제목을 담을 리스트를 생성 - 셀레니움으로 클래스를 통해 가져온 뒤 셀레니움 형식 첫번쨰 블로그 으로 나타낸 모습 → 텍스트로 다시 변환한 결과
- article_raw[0].get_attribute('href') : get_attribute를 이용해 가져온 클래스의 url 링크를 출력
# 블로그 글 url들 수집
url_list = []
title_list = []
# URL_raw 크롤링 시작
articles = ".api_txt_lines.total_tit"
article_raw = driver.find_elements_by_css_selector(articles)
article_raw[0]
<selenium.webdriver.remote.webelement.WebElement (session="a66371a22495294be5e71052d4b2e898", element="5eabeb40-d9cb-4067-8642-b6b7ab77a87f")>
article_raw[0].text
'[구로디지털단지/구디 맛집] 속초오징어어시장 - 2021.10.31'
article_raw[0].get_attribute('href')
'https://blog.naver.com/deamsgod?Redirect=Log&logNo=222570323810'
- 블로그 제목은 공통적으로 <a> 태그안에 각각의 링크로 걸려있고 클래스도 공통적으로 ".api_txt_lines.total_tit" 이다.
- 스크롤 다운 함수를 통해 나타낸 모든 블로그 제목들을 elements 함수로 다 가져온다.
for문으로 반복문 수행
- 클래스로 가져온 셀레니움 방식의 url 주소들을 href를 통해 url 링크만 뽑아서 만들어 놓은 리스트에 append 한다
- 텍스트를 통해 블로그 제목으로 변환한뒤 마찬가지로 append로 빈 리스트에 하나씩 집어 넣는다
# 크롤링한 url 정제 시작
for article in article_raw:
url = article.get_attribute('href')
url_list.append(url)
time.sleep(1)
# 제목 크롤링 시작
for article in article_raw:
title = article.text
title_list.append(title)
print(title)
print("")
print('url갯수: ', len(url_list))
print('title갯수: ', len(title_list))
[구로디지털단지/구디 맛집] 속초오징어어시장 - 2021.10.31
구로디지털단지 맛집 숯불구이 전문점 성공관
만족했던 구로디지털단지역 맛집 공유
......
url갯수: 60
title갯수: 60
4. pandas 데이터프레임으로 만들기
- 수집된 url_list, title_list로 판다스 데이터프레임 만들기
df = pd.DataFrame({'url':url_list, 'title':title_list})
df
엑셀 파일로 저장하기
# 저장하기
df.to_excel("blog_url.xlsx", encoding='utf-8-sig')
※ 전체 코드
#Step 0. 필요한 모듈과 라이브러리를 로딩합니다.
import sys # 시스템
import os # 시스템
import pandas as pd # 판다스 : 데이터분석 라이브러리
import numpy as np # 넘파이 : 숫자, 행렬 데이터 라이브러리
from bs4 import BeautifulSoup # html 데이터를 전처리
from selenium import webdriver # 웹 브라우저 자동화
from selenium.webdriver.common.keys import Keys
import chromedriver_autoinstaller
import time # 서버와 통신할 때 중간중간 시간 지연. 보통은 1초
from tqdm import tqdm_notebook # for문 돌릴 때 진행상황을 %게이지로 알려준다.
# 워닝 무시
import warnings
warnings.filterwarnings('ignore')
query_txt = input('1.크롤링할 키워드는 무엇입니까?: ')
query_txt
# Step 1. 크롬 웹브라우저 실행
# pip install chromedriver_autoinstaller
chrome_path = chromedriver_autoinstaller.install()
driver = webdriver.Chrome(chrome_path)
# 사이트 주소는 네이버
driver.get('http://www.naver.com')
time.sleep(2) # 2초간 정지
# Step 2. 네이버 검색창에 "검색어" 검색
element = driver.find_element_by_id("query")
element.send_keys(query_txt) # query_txt는 위에서 입력한 키워드
element.submit()
# 'VIEW' 클릭
driver.find_element_by_link_text("VIEW").click( )
time.sleep(1)
# '블로그' 클릭
driver.find_element_by_link_text("블로그").click( )
time.sleep(1)
# '옵션' 클릭
driver.find_element_by_link_text("옵션").click( )
time.sleep(1)
# 검색옵션 확인
item_li = driver.find_elements_by_css_selector('.option .txt')
for i in range(0, len(item_li)):
print(item_li[i].text)
print(item_li[11].text)
item_li[11].click()
# 스크롤 다운
# driver.execute_script("window.scrollTo(0, 500)")
# time.sleep(2)
# 스크롤을 밑으로 내려주는 함수
def scroll_down(driver):
driver.execute_script("window.scrollTo(0, 99999999)")
time.sleep(1)
# n: 스크롤할 횟수 설정
n = 1 # 스크롤 1번 당 글 30개씩 화면에 보여짐
i = 0
while i < n: # 이 조건이 만족되는 동안 반복 실행
scroll_down(driver) # 스크롤 다운
i = i+1
time.sleep(1)
url_list = [] # url 담을 빈 리스트
title_list = [] #블로그 제목 담을 빈 리스트
# URL_raw 크롤링 시작
articles = ".total_area .api_txt_lines.total_tit"
article_raw = driver.find_elements_by_css_selector(articles)
article_raw[0] # 첫번째 요소로 크롤링 작동 확인
article_raw[0].text # 첫번째 요소 text로 변환
article_raw[0].get_attribute('href') # 첫번째 요소의 url 가져오기
# 크롤링한 url 정제 시작
for article in article_raw:
url = article.get_attribute('href')
url_list.append(url)
time.sleep(1)
# 제목 크롤링 시작
for article in article_raw:
title = article.text
title_list.append(title)
print(title)
print("")
print('url갯수: ', len(url_list))
print('title갯수: ', len(title_list))
url_list # 수집된 url 확인
title_list # 수집된 블로그 제목 확인
# 수집된 url_list, title_list로 판다스 데이터프레임 만들기
df = pd.DataFrame({'url':url_list, 'title':title_list})
df
'Data Science > python' 카테고리의 다른 글
[python] selenium 웹크롤러 정리 (0) | 2022.01.02 |
---|---|
[python] selenium 네이버 블로그 크롤링(2) (0) | 2022.01.02 |
[python] 딕셔너리(dictionary) (0) | 2021.12.25 |
[python] 튜플(Tuple) (0) | 2021.12.25 |
[python] 리스트 정렬하기 list.sort(), sorted(list) (0) | 2021.12.25 |