본문 바로가기

프로그래밍/파이썬

파이썬으로 웹 크롤링하기(3) 동적 페이지

이전까지의 크롤링은 정적으로 변하거나 한 페이지만 크롤링을 하였다.
예를 들어 다음 페이지를 눌렀는데 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 파일들이다.

다음번에는 최대 페이지 까지 크롤링을 해보자.