Beautifulsoup和AJAX表格问题

0 投票
4 回答
8585 浏览
提问于 2025-04-16 17:08

我正在写一个脚本,用来抓取Team Liquid网站上国际星际争霸2比赛的数据。(http://www.teamliquid.net/tlpd/sc2-international/games)

不过我遇到了一个问题。我让我的脚本循环访问所有页面,但我觉得Team Liquid网站在表格中使用了一种叫AJAX的技术来更新数据。现在,当我使用BeautifulSoup时,无法获取到正确的数据。

我循环访问这些页面:

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-1-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-2-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-3-1-DESC

http://www.teamliquid.net/tlpd/sc2-international/games#tblt-948-4-1-DESC

等等……

当你自己打开这些链接时,会看到不同的页面,但我的脚本每次都只获取到同一个第一页。我觉得这可能是因为在打开其他页面时,会有一个加载的动画,稍微等一下后,表格才会更新到正确的比赛数据。所以我猜BeautifulSoup运行得太快了,需要等到加载和更新表格的过程完成。

所以我想知道:我该如何确保获取到更新后的表格数据?

我现在使用这段代码来获取表格的内容,然后把内容放到一个.csv文件中:

html = urlopen(url).read().lower()
bs = BeautifulSoup(html)
table = bs.find(lambda tag: tag.name=='table' and tag.has_key('id')
                and tag['id']=="tblt_table") 
rows = table.findAll(lambda tag: tag.name=='tr')

4 个回答

2

对于那些通过AJAX和JavaScript动态生成内容的网站,我使用过PhantomJS。它不需要打开浏览器,因为它本身就是一个可以完全通过脚本控制的网页浏览器。PhantomJS运行速度快,并且原生支持多种网页标准,比如DOM处理、CSS选择器、JSON和Canvas。

如果你不是JavaScript高手,可以看看CasperJS,它是建立在PhantomJS之上的。CasperJS让你定义完整的导航场景变得简单,并提供了一些很有用的高级功能。

这里有一个关于CasperJS如何工作的例子:

CasperJs和Jquery的链式选择

2

光靠BeautifulSoup是没办法的,因为它不会帮你执行JavaScript代码。

如果你不想自己去解析那些JavaScript,也不想手动去调用AJAX获取数据的话,使用selenium可能会更有效。

10

当你尝试用AJAX抓取一个网站时,最好先看看这个网站的JavaScript代码到底在做什么。很多情况下,它只是获取XML或HTML,这样抓取起来比那些不使用AJAX的内容还要简单。你只需要查看一些源代码。

在你的例子中,这个网站会自己从一个特殊的URL获取表格的HTML代码(而不是刷新整个页面),然后动态地把它替换到浏览器的DOM中。查看一下http://www.teamliquid.net/tlpd/tabulator/ajax.js,你会看到这个URL的格式是这样的:

http://www.teamliquid.net/tlpd/tabulator/update.php?tabulator_id=1811&tabulator_page=1&tabulator_order_col=1&tabulator_order_desc=1&tabulator_Search&tabulator_search=

所以你需要做的就是直接用BeautifulSoup抓取这个URL,并在每次想要下一页的时候,把tabulator_page的计数器加一。

撰写回答