ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 파이썬 웹 크롤링(Web Crawling) 강좌 - 3. 네이버 베스트셀러 책이름, 저자, 가격 출력하기
    Python/웹 크롤링(Web Crawling) 강좌 2020. 2. 8. 15:13



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

    첫페이지에 있는 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)



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

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

    유튜브 구독하기


    댓글 11

    • 2019.06.20 12:07


      비밀댓글입니다

    • 나그네 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

    • 1 2019.12.24 02:19


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

    • 2020.01.06 12:19


      비밀댓글입니다

    • 2020.01.06 12:43


      비밀댓글입니다

    • 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 부분을 제거하거나 못찾은 경우에대한 에러처리를 추가하면 될듯합니다

Designed by Tistory.