【问题标题】:Beautifulsoup and AJAX-table problemBeautifulsoup 和 AJAX 表问题
【发布时间】:2011-08-20 06:35:36
【问题描述】:

我正在制作一个脚本,用于抓取国际星际争霸 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')

【问题讨论】:

  • 以后你应该考虑使用lxmlhtml5lib 而不是BeautifulSoup。使用 lxml 以提高速度,使用 html5lib 进行强大的解析。

标签: python beautifulsoup


【解决方案1】:

当您尝试使用 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&tabulator_page=1&tabulator_order_col=1&tabulator_order_desc=1&tabulator_Search&tabulator_search=

因此,您只需使用 BeautifulSoup 直接抓取此 URL,并在每次需要下一页时推进 tabulator_page 计数器。

【讨论】:

  • 感谢您的详细回复,我研究了 .js 文件,现在了解发生了什么。但是,当我在浏览器中打开您的 URI 时,什么也没有返回。这可能与他们使用 GET 请求有关吗? http.open('GET', url + 参数, true); (网址是teamliquid.net/tlpd/tabulator/update.php? 参数是tabulator_id=1811&tabulator_page=1&tabulator_order_col=1&tabulator_order_desc=1&tabulator_Search&tabulator_search=)
  • 不,GET 请求是您的浏览器通常使用的。这个页面以前对我有用,现在不工作了……很奇怪。
  • 现在可以使用:仅当您自己打开带有表格的页面然后复制数字并将 tabulator_id=xxxx 替换为您的数字时才有效。我猜你的 1811 是某种特定的会话!感谢您的帮助。
【解决方案2】:

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

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

这是一个关于 CasperJS 工作原理的示例:

CasperJs and Jquery with chained Selects

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多