美化组和AJAX表问题

2024-06-11 00:03:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个脚本,刮队的国际星际争霸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 等。。。

当你自己打开这些页面时,你会看到不同的页面,但是我的脚本每次都会得到相同的第一页。我认为这是因为当你打开其他页面时,你会看到一些加载的东西在很短的时间内用游戏更新到正确的页面。所以我猜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')

Tags: 脚本http游戏nettagwwwtable页面
3条回答

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

如果您不想自己解析相关的javascript并调用AJAX将要进行的获取数据的调用,那么使用selenium可能会更幸运。

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

如果你不是一个JavaScript忍者,你应该看看CasperJS,它是在PhantomJS上写的。它简化了定义全导航场景的过程,并提供了有用的高级功能。

下面是CasperJS工作原理的示例:

CasperJs and Jquery with chained Selects

当您试图使用AJAX废弃一个站点时,最好看看javascript代码实际做了什么。在许多情况下,它只是检索XML或HTML,这比非AJAXy内容更容易擦掉。它只需要看一些源代码。

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

http://www.teamliquid.net/tlpd/tabulator/update.php?tabulator_id=1811&制表符页面=1制表符顺序列=1&制表符顺序描述=1&制表符搜索制表符搜索=

所以你所需要做的就是直接用BeautifulSoup刮取这个URL,每次你想要下一个页面的时候就提前使用制表器页面计数器。

相关问题 更多 >