[python] selenium 네이버 블로그 크롤링(1)

첫번째 크롤링 예제이다. 네이버 블로그에 검색어 입력 후에 나오는 블로그들을 크롤링하고 저장해본다.

검색어를 입력하고 스크롤까지 누르기 때문에 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