반응형



네이버 베스트셀러 주간 순위에 있는 책의 정보를 가져오는 예제입니다. 

첫페이지에 있는 25권의 책목록에서 링크를 추출하여 각 추출된 링크로 접속하여 책이름, 저자, 가격 정보등을 출력합니다. 


최초 작성 2018. 9. 9

최종 업데이트 2020. 2. 8




urlopen 함수를 사용하여 네이버에서 베스트셀러 목록을 가져올 때  "HTTP Error 500" 에러가 발생했던 문제를 해결했습니다. 

본 포스트를 작성시에는 문제 없었는데 어느 순간부터인가 안되기 시작한 듯합니다. 


기존에 사용하던 urlopen을 대신에 셀레륨(selenium)을 사용합니다. 

코드를 실행시키면 코드에서 지정한 웹브라우저를 실제로 띄운 상태에서 웹크롤링이 이루어집니다.


# 실행하기 위해 필요한 패키지 목록입니다. 

# pip install selenium webdriver-manager beautifulsoup4

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup


url = "https://book.naver.com/bestsell/bestseller_list.nhn"

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.implicitly_wait(30)


# 네이버의 베스트셀러 웹페이지를 가져옵니다.
driver.get(url)
bsObject = BeautifulSoup(driver.page_source, 'html.parser')



# 책의 상세 웹페이지 주소를 추출하여 리스트에 저장합니다.
book_page_urls = []
for index in range(0, 25):
    dl_data = bsObject.find('dt', {'id':"book_title_"+str(index)})
    link = dl_data.select('a')[0].get('href')
    book_page_urls.append(link)



# 메타 정보와 본문에서 필요한 정보를 추출합니다.
for index, book_page_url in enumerate(book_page_urls):

    driver.get(book_page_url)
    bsObject = BeautifulSoup(driver.page_source, 'html.parser')


    title = bsObject.find('meta', {'property':'og:title'}).get('content')
    author = bsObject.find('dt', text='저자').find_next_siblings('dd')[0].text.strip()
    image = bsObject.find('meta', {'property':'og:image'}).get('content')
    url = bsObject.find('meta', {'property':'og:url'}).get('content')

    dd = bsObject.find('dt', text='가격').find_next_siblings('dd')[0]
    salePrice = dd.select('div.lowest strong')[0].text
    originalPrice = dd.select('div.lowest span.price')[0].text

    print(index+1, title, author, image, url, originalPrice, salePrice)





관련 포스트


[Python/웹 크롤링(Web Crawling) 강좌] - 파이썬 웹 크롤링(Web Crawling) 강좌 - 1. 웹페이지 긁어오기


[Python/웹 크롤링(Web Crawling) 강좌] - 파이썬 웹 크롤링(Web Crawling) 강좌 - 2. 교보문고 베스트셀러 책이름, 저자, 가격 출력하기


[Python/웹 크롤링(Web Crawling) 강좌] - 웹크롤링 강좌 - 기상청의 동네예보 가져오기



반응형

포스트 작성시에는 문제 없었지만 이후 문제가 생길 수 있습니다.
댓글로 알려주시면 빠른 시일내에 답변을 드리겠습니다.

여러분의 응원으로 좋은 컨텐츠가 만들어집니다.
지금 본 내용이 도움이 되었다면 유튜브 구독 부탁드립니다. 감사합니다 : )

유튜브 구독하기


제가 쓴 책도 한번 검토해보세요.

  1. 2019.06.20 12:07

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.06.20 16:05 신고

      HTTP 500은 서버쪽 에러로 알고 있습니다. 웹 주소를 변경해서 해보세요

  2. 나그네 2019.11.14 00:38

    유익한 포스팅 감사합니다.
    저도 HTTP 500에러가 나오네요. 올려주신 앞의 예제들은 잘 실행됐습니다. 그리고 url도 직접 크롬에 입력하면 잘 되네요. html = urlopen('https://book.naver.com/bestsell/bestseller_list.nhn')
    다음과 같은 로그를 얻었는데 혹시 무엇이 잘못됐는지 알 수 있을까요?

    ---------------------------------------------------------------------------
    HTTPError Traceback (most recent call last)
    <ipython-input-4-accdd42a613f> in <module>
    4
    5 # 네이버의 베스트셀러 웹페이지를 가져옵니다.
    ----> 6 html = urlopen('https://book.naver.com/bestsell/bestseller_list.nhn')
    7 bsObject = BeautifulSoup(html, "html.parser")
    8

    ~\Anaconda3\lib\urllib\request.py in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    220 else:
    221 opener = _opener
    --> 222 return opener.open(url, data, timeout)
    223
    224 def install_opener(opener):

    ~\Anaconda3\lib\urllib\request.py in open(self, fullurl, data, timeout)
    529 for processor in self.process_response.get(protocol, []):
    530 meth = getattr(processor, meth_name)
    --> 531 response = meth(req, response)
    532
    533 return response

    ~\Anaconda3\lib\urllib\request.py in http_response(self, request, response)
    639 if not (200 <= code < 300):
    640 response = self.parent.error(
    --> 641 'http', request, response, code, msg, hdrs)
    642
    643 return response

    ~\Anaconda3\lib\urllib\request.py in error(self, proto, *args)
    567 if http_err:
    568 args = (dict, 'default', 'http_error_default') + orig_args
    --> 569 return self._call_chain(*args)
    570
    571 # XXX probably also want an abstract factory that knows when it makes

    ~\Anaconda3\lib\urllib\request.py in _call_chain(self, chain, kind, meth_name, *args)
    501 for handler in handlers:
    502 func = getattr(handler, meth_name)
    --> 503 result = func(*args)
    504 if result is not None:
    505 return result

    ~\Anaconda3\lib\urllib\request.py in http_error_default(self, req, fp, code, msg, hdrs)
    647 class HTTPDefaultErrorHandler(BaseHandler):
    648 def http_error_default(self, req, fp, code, msg, hdrs):
    --> 649 raise HTTPError(req.full_url, code, msg, hdrs, fp)
    650
    651 class HTTPRedirectHandler(BaseHandler):

    HTTPError: HTTP Error 500: Internal Server Error

  3. 1 2019.12.24 02:19

    첫 페이지 말고 여러 페이지를 한 번에 크롤링할 방법은 없을까요?

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2019.12.24 19:06 신고

      구글에서 아래 키워드로 검색하면 예제들이 있습니다.

      웹크롤링 페이지 번호

  4. 2020.01.06 12:19

    비밀댓글입니다

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.01.06 20:51 신고

      코드 문제라기 보다는 서버쪽 사정으로 네이버 베스트셀러 URL에서 가져오는게 안되는 듯합니다.

  5. 2020.01.06 12:43

    비밀댓글입니다

  6. beck_pro 2020.02.17 17:38

    베스트셀러 목록에 할인가격이 아예 없으면 오류 걸리네요 어떻게 해결하죠

    • Favicon of https://webnautes.tistory.com BlogIcon webnautes 2020.02.17 19:35 신고

      salePrice = dd.select('div.lowest strong')[0].text 부분을 제거하거나 못찾은 경우에대한 에러처리를 추가하면 될듯합니다

  7. 손영규 2020.03.24 21:16

    잘되네요... 아직 초보라 맛만 ^^

  8. 곽자섭 2020.06.10 19:42

    저도 아직 초보인데...재밌네요^^
    실행도 잘되고..ㅋ

+ Recent posts