是否可以使用 Scrapy 从使用 AJAX 的网站抓取动态内容?

我最近一直在学习Python,并且正在投入到构建Web抓取器中。这根本不是什么花哨的东西;它的唯一目的是从博彩网站获取数据,并将这些数据放入Excel中。

大多数问题都是可以解决的,我周围有一个很好的小混乱。然而,我在一个问题上遇到了一个巨大的障碍。如果网站加载马匹表并列出当前投注价格,则此信息不在任何源文件中。线索是,这些数据有时是实时的,数字显然是从某个远程服务器更新的。我PC上的HTML只是有一个洞,他们的服务器正在推送我需要的所有有趣数据。

现在我对动态Web内容的经验很低,所以这件事是我很难弄清楚的事情。

我认为Java或Javascript是一个关键,这经常弹出。

刮刀只是一个赔率比较引擎。有些网站有API,但我需要那些没有API的网站。我正在使用Python 2.7的废料库

如果这个问题过于开放,我很抱歉。简而言之,我的问题是:如何使用purpery来抓取这些动态数据,以便我可以使用它?这样我就可以实时抓取这个投注赔率数据了吗?


答案 1

下面是一个具有 AJAX 请求的简单示例。让我们看看网站 rubin-kazan.ruscrapy

所有消息都加载 AJAX 请求。我的目标是获取这些消息及其所有属性(作者,日期等):

enter image description here

当我分析页面的源代码时,我无法看到所有这些消息,因为网页使用AJAX技术。但是我可以使用Mozilla Firefox的Firebug(或其他浏览器中的等效工具)来分析在网页上生成消息的HTTP请求:

enter image description here

它不会重新加载整个页面,而只会重新加载页面中包含消息的部分。为此,我单击底部任意数量的页面:

enter image description here

我观察到负责消息正文的HTTP请求:

enter image description here

完成后,我分析了请求的标头(我必须引用这个URL,我将从var部分从源页面中提取,请参阅下面的代码):

enter image description here

以及请求的表单数据内容(HTTP方法是“Post”):

enter image description here

以及响应的内容,这是一个 JSON 文件:

enter image description here

它提供了我正在寻找的所有信息。

从现在开始,我必须在刮擦中实现所有这些知识。让我们为此定义蜘蛛:

class spider(BaseSpider):
    name = 'RubiGuesst'
    start_urls = ['http://www.rubin-kazan.ru/guestbook.html']

    def parse(self, response):
        url_list_gb_messages = re.search(r'url_list_gb_messages="(.*)"', response.body).group(1)
        yield FormRequest('http://www.rubin-kazan.ru' + url_list_gb_messages, callback=self.RubiGuessItem,
                          formdata={'page': str(page + 1), 'uid': ''})

    def RubiGuessItem(self, response):
        json_file = response.body

在函数中,我有第一个请求的响应。在我有JSON文件与所有信息。parseRubiGuessItem


答案 2

基于Webkit的浏览器(如Google Chrome或Safari)具有内置的开发人员工具。在Chrome中,您可以打开它。该选项卡允许您查看有关每个请求和响应的所有信息:Menu->Tools->Developer ToolsNetwork

enter image description here

在图片的底部,您可以看到我已经将请求过滤到 - 这些是由javascript代码发出的请求。XHR

提示:每次加载页面时都会清除日志,在图片底部,黑点按钮将保留日志。

分析请求和响应后,您可以模拟来自 Web 爬网程序的这些请求并提取有价值的数据。在许多情况下,获取数据比解析HTML更容易,因为该数据不包含表示逻辑,并且格式化为由javascript代码访问。

Firefox也有类似的扩展,它被称为firebug。有些人会争辩说firebug更强大,但我喜欢webkit的简单性。