BeautifulSoup으로 웹크롤링 할때 데이터를 못 읽어오는건 어떻게 해결할수있을까요?


파이썬 BeautifulSoup을 이용해 웹 크롤링을 하려고 하는데요.

def scrapy():
    url = 'http://cu.bgfretail.com/product/product.do?category=product&depth2=4&sf=N'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text, 'lxml')

    prodList = soup.find_all("div",   {"class", "prodListWrap"})
    print (prodList)

이런 식으로 편의점의 상품을 받아올수있나 테스트를 해보고있는데 출력을 하면 [] 라는 결과만 나옵니다. 아마 prodListWrap 클래스가 동적으로 생성되서 받아오지 못하는것 같은데 이런 경우는 어떻게 해결 할 수 있을까요?

  • 2016년 05월 28일에 작성됨

조회수 1032


1 답변


좋아요
0
싫어요
채택취소하기

Javascript를 disable하고 올려주신 URL을 열면 나오는 페이지를 확인해 보면 Javascript로 동적으로 불러오기 때문인지 확인할 수 있습니다. 상품목록이 안나오는걸 보면 말씀하신 이유가 맞네요.

selenium을 설치하면(pip install selenium) 다음과 같이 사용할 수 있습니다.

from bs4 import BeautifulSoup
from selenium import webdriver
driver = webdriver.Firefox()
driver.get('http://cu.bgfretail.com/product/product.do?category=product&depth2=4&sf=N')

html = driver.page_source
soup = BeautifulSoup(html)
prodList = soup.find_all("p", {"class": "prodPrice"})
print(len(prodList))

이렇게 하면 파이어폭스에서 url을 open하고, 자바스크립트 로딩까지 끝난 다음에 html을 읽어오기 때문에 총47개의 상품을 읽어 올 수 있네요.(자바스크립트가 동작 안한 상태에서는 4개였어요)

상품 가격("class" : "productPrice") 말고 원하는 class로 읽어오시면 되겠습니다.


그리고 추가로 올려주신 상품목록 페이지의 경우 '더보기'를 계속 눌러야 전체 목록을 불러올 수 있는데요. '더보기'에는 nextPage라는 자바스크립트 함수로 구현되어 있네요.

driver.execute_script("nextPage(1);")
sleep(3)

다음과 같은 코드를 이용하면 더보기를 누르고 3초 기다리는 동작을 시뮬레이션 할 수 있습니다. 더보기를 더이상 로드되는 상품이 없을때까지 한 다음에 html을 읽어오세요.

  • 2016년 05월 29일에 수정됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.
  • 2016년 05월 29일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 감사합니다 덕분에 해결했어요    cg   2016.5.29 10:29     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close