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

조회수 22958회

파이썬 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을 읽어오세요.

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)