我最近一直在学习 Python,并且正在着手构建一个网络爬虫。这一点都不花哨。它的唯一目的是从博彩网站获取数据并将这些数据放入 Excel。
大部分问题都是可以解决的,但我遇到了一些麻烦。但是,我在一个问题上遇到了巨大的障碍。如果一个网站加载了一张马匹表格并列出了当前的投注价格,则此信息不在任何源文件中。线索是这些数据有时是实时的,数字显然是从某个远程服务器更新的。我 PC 上的 HTML 有一个漏洞,他们的服务器正在推送我需要的所有有趣数据。
现在我对动态网络内容的体验很低,所以这件事让我难以理解。
我认为 Java 或 Javascript 是一个关键,这经常弹出。
爬虫只是一个赔率比较引擎。有些网站有 API,但对于那些没有的网站,我需要它。我在 Python 2.7 中使用了 scrapy 库
如果这个问题过于开放,我深表歉意。简而言之,我的问题是:如何使用scrapy来抓取这些动态数据,以便我可以使用它?这样我就可以实时抓取这些投注赔率数据?
最佳答案
这是一个带有 AJAX 请求的 scrapy
的简单示例。让我们看看网站rubin-kazan.ru .
所有消息都使用 AJAX 请求加载。我的目标是获取这些消息及其所有属性(作者、日期、...):
当我分析页面的源代码时,我看不到所有这些消息,因为该网页使用了 AJAX 技术。但我可以使用 Mozilla Firefox 中的 Firebug(或其他浏览器中的等效工具)来分析在网页上生成消息的 HTTP 请求:
它不会重新加载整个页面,而只会重新加载包含消息的页面部分。为此,我单击底部的任意数量的页面:
我观察到负责消息正文的 HTTP 请求:
完成后,我分析请求的 header (我必须引用我将从 var 部分的源页面中提取的此 URL,请参见下面的代码):
以及请求的表单数据内容(HTTP方式为“Post”):
以及响应的内容,是一个JSON文件:
它提供了我正在寻找的所有信息。
从现在开始,我必须在scrapy中实现所有这些知识。让我们为此目的定义蜘蛛:
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
在 parse
函数中,我有第一个请求的响应。
在 RubiGuessItem
我有包含所有信息的 JSON 文件。
https://stackoverflow.com/questions/8550114/