BeautifulSoup으로 웹크롤링 할때 데이터를 못 읽어오는건 어떻게 해결할수있을까요?
조회수 22419회
파이썬 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 클래스가 동적으로 생성되서 받아오지 못하는것 같은데 이런 경우는 어떻게 해결 할 수 있을까요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
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을 읽어오세요.
댓글 입력