프로그래밍/파이썬
파이썬으로 웹 크롤링하기(3) 동적 페이지
터렛짓는다
2021. 3. 23. 17:15
이전까지의 크롤링은 정적으로 변하거나 한 페이지만 크롤링을 하였다.
예를 들어 다음 페이지를 눌렀는데 URL 주소가 변하지 않고 그대로라면 이전 방식으로는 크롤링을 할 수 없다.
이러한 상황에서 크롤링을 하기 위해서는 chromedirver와 파이썬 라이브러리인 selenium이 필요하다.
우선 교보문고의 국내도서 -> 소설 -> 베스트셀러 경로로 들어가보자.
첫 페이지의 URL은 http://www.kyobobook.co.kr/categoryRenewal/categoryMain.laf?perPage=20&mallGb=KOR&linkClass=01&menuCode=002이다.
다음 페이지로 넘겨보아도 URL은 http://www.kyobobook.co.kr/categoryRenewal/categoryMain.laf?perPage=20&mallGb=KOR&linkClass=01&menuCode=002로 변하지 않는 것을 볼 수 있다.
우선 chromedriver를 자신의 chrome과 맞는 버전으로 다운로드한다.
-소스코드
import requests
from bs4 import BeautifulSoup
import pandas as pd
from selenium import webdriver
from openpyxl import Workbook
import os
import time
def get_data(url):
name = list()
author = list()
price = list()
options = webdriver.ChromeOptions()
chromedriver_path = (r'C:/Users/eco/Desktop/공부/크롤링/chromedriver.exe') #chromedrive
options.add_argument('headless') #크롬드라이버 창 숨기기
driver = webdriver.Chrome(os.path.join(os.getcwd(), chromedriver_path), options=options)
driver.maximize_window()
driver.get(url)
html = requests.get(url).text
soup = BeautifulSoup(html, 'html.parser')
for n in range(1, 8):
#페이지가 변하면 페이지 정보 다시 받아오기
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
time.sleep(1)
#제목 정보 크롤링
for anchor in soup.select("div.info_area > div.detail > div.title > a > strong"):
name.append(anchor.get_text())
#가격 정보 크롤링
for anchor in soup.select("div.info_area > div.detail > div.price > strong.sell_price"):
price.append(anchor.get_text())
#작가 정보 크롤링
for anchor in soup.select("div.info_area > div.detail > div.pub_info > span.author"):
author.append(anchor.get_text())
driver.find_element_by_xpath('//*[@id="eventPaging"]/div/ul/li[{num}]/a'.format(num=n)).click() #페이지 번호 클릭
li = list()
#데이터 갯수만큼 반복
for i in range(0, len(name)):
li.append([name[i], author[i], price[i]]) #크롤링한 데이터 하나의 리스트안에 삽입
return li
url = 'http://www.kyobobook.co.kr/categoryRenewal/categoryMain.laf?perPage=20&mallGb=KOR&linkClass=01&menuCode=002'
data = get_data(url)
df = pd.DataFrame(data, columns=['제목', '작가', '가격'])
df.to_csv("data_csv.csv", header=False, index=False, encoding='euc-kr') #df.to_csv("경로/파일명.csv", header=1행(제목, 작가, 가격), index=(번호))
df.to_excel("data_xlsx.xlsx")
우선 국내도서 페이지는 8 페이지 까지 존재하므로 8 페이지 까지 크롤링을 하였다.
우선 결과 엑셀파일과 csv 파일들이다.
다음번에는 최대 페이지 까지 크롤링을 해보자.