如何抓取通过JavaScript获取的网页表格内容?
我想从一个网站上抓取一个看起来像这样的表格:
<table class="table table-hover data-table sort display">
<thead>
<tr>
<th class="Column1">
</th>
<th class="Column2">
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="item in filteredList | orderBy:columnToOrder:reverse">
<td>{{item.Col1}}</td>
<td>{{item.Col2}}</td>
</tr>
</tbody>
</table>
这个网站似乎是用某种JavaScript框架搭建的,它通过网络服务从后台获取表格内容。
问题是,如果数据不是以数字格式呈现,我们该如何抓取表格数据呢?上面的代码中内容被包裹在{{ }}
里。这是否意味着这个网站无法抓取?有什么解决办法吗?谢谢。
我正在使用Python和BeautifulSoup4。
3 个回答
2
你可以打开Chrome浏览器,加载你想要查看的网站。然后打开控制台,找到“网络”这个标签。在顶部勾选“保留日志”。接着刷新网站,这样所有的内容都会加载到日志里。现在你就能看到页面上“filteredList”数据的来源了。这样在你的抓取工具里,你也知道这些数据是从哪里来的,可以把它们包含进去。数据很可能是json格式的……你可以随意获取和处理这些数据……
3
你可以试试使用 import.io(https://import.io)——我们的连接器、提取器和爬虫都支持从用 JavaScript 渲染的页面获取数据。如果没有具体的 URL,我不能确定你的能否正常工作,但我觉得应该没问题(看起来是用 AngularJS 渲染的,这应该没问题)。
顺便说一下,如果你还没发现,我在 import.io 工作——如果你有具体的问题,可以随时问我。
3
通常来说,当网页上有JavaScript内容时,BeautifulSoup这个工具就不太适用了。我会用selenium来处理。你可以试试这个方法,看看你得到的HTML内容是否可以抓取:
from selenium import webdriver
driver = webdriver.Firefox()
driver.get(url)
driver.set_window_position(0, 0)
driver.set_window_size(100000, 200000)
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
time.sleep(5) # wait to load
# now print the response
print driver.page_source
到这个时候,你可以用BeautifulSoup从driver.page_source
中提取数据。注意:你需要安装selenium和Firefox浏览器。