Beautifulsoup和AJAX表格问题
我正在写一个脚本,用来抓取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 个回答
光靠BeautifulSoup是没办法的,因为它不会帮你执行JavaScript代码。
如果你不想自己去解析那些JavaScript,也不想手动去调用AJAX获取数据的话,使用selenium可能会更有效。
当你尝试用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的计数器加一。