Beautifulsoup和AJAX表问题

时间:2011-05-06 15:03:57

标签: python beautifulsoup

我正在制作一个脚本,用于刮擦国际星际争霸2游戏Team Liquid数据库的游戏。 (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 等...

当您自己打开这些页面时,您会看到不同的页面,但是我的脚本每次都会保持相同的第一页。我认为这是因为当打开其他页面时,您会看到一些加载的东西,只需少量时间将游戏表更新到正确的页面。所以我想beatifulsoup是快速的,需要等待表的加载和更新。

所以我的问题是:如何确保更新表格?

我现在使用此代码获取表的内容,之后我将内容放在.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 个答案:

答案 0 :(得分:7)

当您尝试使用AJAX废弃网站时,最好查看javascript代码实际执行的操作。在许多情况下,它只是检索XML或HTML,这比非AJAXy内容更容易抓取。它只需要查看一些源代码。

在您的情况下,站点自己从特殊URL中检索表控件的HTML代码(而不是刷新整个页面),并在浏览器DOM中动态替换它。查看http://www.teamliquid.net/tlpd/tabulator/ajax.js,您会看到此网址的格式如下:

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计数器。

答案 1 :(得分:2)

你不能只用BeautifulSoup;它不会为你执行javascript。

假设您不想尝试自己解析相关的javascript并调用AJAX为获取数据而进行的调用,那么selenium可能会更幸运。

答案 2 :(得分:1)

对于通过AJAX和Javascript使用动态内容的网站,我使用了PhantomJS。它不需要打开浏览器,因为它本身就是一个完全可编写脚本的Web浏览器。 PhantomJS速度​​很快,包括对DOM处理,CSS选择器,JSON和Canvas等各种Web标准的本机支持。

如果您不是JavaScript忍者,您应该看CasperJS,它是通过PhantomJS编写的。它简化了定义完整导航场景的过程,并提供了有用的高级功能。

这是一个关于CasperJS如何运作的例子:

CasperJs and Jquery with chained Selects

答案 3 :(得分:0)

似乎您的问题的原因是BeautifulSoup和urllib都无法在页面内执行javascript。

也许,您应该使用selenium在真实浏览器中打开页面,然后在准备好时提取html并使用BeautifulSoup解析它。