파이썬 공부/기초

알라딘 중고서점 가격 스크래핑(파이썬)

시도하고 시도 2021. 12. 21. 18:36

알라딘 중고서점 가격 일괄 스크래핑

알라딘 중고서점 검색 결과

1. 원하는 책 제목 검색

2. 다섯가지 종류의 가격과 책 표지, 제목을 긁어서

3. 엑셀에 표현.

(표지) 책제목                    새책     eBook   알라딘   광활..    판매자 중고

(그림) 혼자공부하는 파이썬 16300원 14400원 11400원 12000원 13000원

(그림) .........

 

# 가격만 가져오는 프로그램

import urllib.request as req
from bs4 import BeautifulSoup

page_num = 1
'''
엑셀 파일을 생성하는 부분 추가될 곳
'''
while True:
    url = "https://www.aladin.co.kr/search/wsearchresult.aspx?SearchTarget=Used&KeyWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&KeyRecentPublish=0&OutStock=0&ViewType=Detail&SortOrder=11&CustReviewCount=0&CustReviewRank=0&KeyFullWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&KeyLastWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&CategorySearch=&chkKeyTitle=&chkKeyAuthor=&chkKeyPublisher=&ViewRowCount=25&page={}".format(
        page_num)
    html_code = req.urlopen(url)
    soup = BeautifulSoup(html_code, "html.parser")
    # title = soup.select("a.bo3>b")
    # print(title) #출력결과: [<b>혼자 공부하는 파이썬</b>, <b>Do it! 점프 투 파이썬</b>, <b>이것이 취업을 위한 코딩 테스트다 with 파이썬</b>,...]
    books = soup.find_all("div",{"class":"ss_book_box"})
    for book in books:
        # price = book.find_all("a", {"class":"bo_used"}).find_all 판매분류와 가격이 한번에 뽑힌다.
        price = book.select("tr>td>a.bo_used")
        print(price)
    # page_num += 1
    # if len(title) == 0:
    break

위 코드는 얼핏보면 가격만 잘 긁어오는 것처럼 보이지만, 알고보면 엉터리 코드다.

첫번째 책에 가격이 다섯가지 종류가 있는데, 나중에 제목과 가격을 출력할 때 이를 고려하지 않고,

책1, 책1의 가격1

책2, 책1의 가격2

책3, 책1의 가격3 

...

이런 식으로 출력이 된다. 오류가 나지 않아도 확인을 해보면 쉽게 알 수 있다.

 

데이터를 다룰때는 내가 할애할 에너지의 30%정도는 남겨두고, 1차 완성 후에 직접 실행하며 결함이 없는지 확인하는 과정도 중요하다.

 

문제는, 이거를 고치다가 참 많은 오류가 났다.

 

가격을 틀리지 않고 제대로 가져온 코드는 여기에 있다.

 

import urllib.request as req
from bs4 import BeautifulSoup
import openpyxl
import os

page_num = 1

# 엑셀 파일 만들거나 가져오기
filename = './알라딘 중고서점.xlsx'
if not os.path.exists(filename):
    wb = openpyxl.Workbook()
    wb.active.title = "알라딘 중고서점"
    wb.save(filename)
else:
    wb = openpyxl.load_workbook(filename)

sheet = wb.active


url = "https://www.aladin.co.kr/search/wsearchresult.aspx?SearchTarget=Used&KeyWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&KeyRecentPublish=0&OutStock=0&ViewType=Detail&SortOrder=11&CustReviewCount=0&CustReviewRank=0&KeyFullWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&KeyLastWord=%ED%8C%8C%EC%9D%B4%EC%8D%AC&CategorySearch=&chkKeyTitle=&chkKeyAuthor=&chkKeyPublisher=&ViewRowCount=25&page={}".format(
    page_num)
html_code = req.urlopen(url)
soup = BeautifulSoup(html_code, "html.parser")
books = soup.find_all("div",{"class":"ss_book_box"})
for i, book in enumerate(books):
    # price = book.find_all("a", {"class":"bo_used"}).find_all 판매분류와 가격이 한번에 뽑힌다.
    price = book.select("table > tr > td")[2].select("table.usedtable01 > tr > td")
    for index, seller in enumerate(price):
        print(seller.string)
        sheet.cell(row=i+1, column=index+1, value=seller.string)
    # print(books)
    # print(title)
    # price = soup.select("a.bo_used>b")

    # for i, j in zip(title, price):
    #     # print(i.string, j.string)
    #     f.write(i.string+","+j.string+"\n")
    # page_num += 1
    # if len(title) == 0:
    # break
wb.save(filename)
wb.close()
# for page_num in range(1,5):
#     html_code = req.urlopen(url.format(page_num))

 

중고서점 가격 일괄 스크래핑