python beutifulsoup 크롤링 중 데이터를 받아오지 못합니다. selenium 이용해서 자바스크립트 포함된 웹페이지 크롤링 하는 법좀 알려주세요!

조회수 3388회

https://mensaar.de/#/menu/sb

위의 웹페이지에서 식단 데이터를 가져와서 출력하고 싶은데 잘 안되네요.. 제가 쓴 코드는 아래와 같습니다.

//#encoding = utf-8

import urllib.request
from urllib.request import urlopen
from bs4 import BeautifulSoup

url = "https://mensaar.de/#/menu/sb/"
html=urlopen(url).read()
soup = BeautifulSoup(html, 'html.parser')

meal_list=soup.findAll("div")
print (meal_list)

테스트 용으로 모든 div태그를 출력해 보는데 결과값이 아래와 같이 많이 생략된 채로 나옵니다.

[<div class="navbar-header">
<button class="navbar-toggle" data-target="#mensaar-navbar-collapse" data-toggle="collapse" type="button">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>, <div class="container-fluid">
<div class="collapse navbar-collapse" id="mensaar-navbar-collapse">
<ul class="nav navbar-nav">
<li data-match-route="^/$"><a class="mensaar-brand" data-ng-click="collapseNavbar()" href="#/">MenSaar.de</a></li>
<li data-match-route="^/menu(/\w+)?$" data-ng-cloak=""><a data-ng-click="collapseNavbar()" href="#/menu">Speiseplan</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a data-match-route="^/privacy$" data-ng-click="collapseNavbar()" href="#/privacy">Datenschutz</a></li>
<li><a href="http://www.studentenwerk-saarland.de/de/Impressum-(2)/Impressum">Impressum</a></li>
</ul>
</div>
</div>, <div class="collapse navbar-collapse" id="mensaar-navbar-collapse">
<ul class="nav navbar-nav">
<li data-match-route="^/$"><a class="mensaar-brand" data-ng-click="collapseNavbar()" href="#/">MenSaar.de</a></li>
<li data-match-route="^/menu(/\w+)?$" data-ng-cloak=""><a data-ng-click="collapseNavbar()" href="#/menu">Speiseplan</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a data-match-route="^/privacy$" data-ng-click="collapseNavbar()" href="#/privacy">Datenschutz</a></li>
<li><a href="http://www.studentenwerk-saarland.de/de/Impressum-(2)/Impressum">Impressum</a></li>
</ul>
</div>, <div data-ng-view="" id="view"></div>]

Process finished with exit code 0

검색 해 보니 자바스크립트가 포함된 페이지의 경우 따로 처리를 해 주어야 데이터를 온전히 가져올 수 있다고 하는데 혹시 해결 방법을 아시는 분 계시면 답변 부탁드립니다...!

1 답변

  • 페이지 로딩이 완료되면 ajax로 데이터를 불러옵니다. 이런 부분은 당연히도 별도의 처리를 해야 합니다.

    즉 요청 url은 하나이나 그 url 안에서 다른 url들을 호출합니다.

    그 호출되는 url을 일일이 호출하여 얻은 값을 조합해서 하나의 페이지를 만들어야 합니다.

    그러나 그렇게 하면 번거롭기 때문에 웹브라우져를 이용하여 url를 호출하고 리턴값(html)을 이용하는 방법을 사용하기도 합니다.

    대표적인 방법이 selenium webdriver 을 사용하는 방법입니다.

    원리는 단순한데 자동으로 웹브라우져를 실행하여 url을 호출하여 화면에 브라우징을 합니다. 브라우징된 html 코드를 얻을 수 있습니다.

    그렇게 얻은 html을 beautifulsoap 를 이용해서 파싱하면 됩니다.

    from selenium import webdriver
    from bs4 import BeautifulSoup
    
    driver = webdriver.PhantomJS() # 브라우져를 phantomjs 을 사용함. ie, firefox, chrome 도 가능함
    driver.get('https://mensaar.de/#/menu/sb')
    bs = BeautifulSoup(driver.page_source, 'html5lib')
    print(bs.findAll("div"))
    
    • 오... 구체적인 답변 감사합니다! 한 번 시도해 보겠습니다. 거의 처음 시작하는거라 어려운 점이 많네요... 알 수 없는 사용자 2017.5.5 21:24

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

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

(ಠ_ಠ)
(ಠ‿ಠ)