我最近在学习Python,并且正在着手构建一个网页抓取器。它的唯一用途是从博彩网站获取数据并将这些数据放入Excel。
大部分的问题都是可以解决的,我有一个很好的小混乱。然而,我在一个问题上遇到了巨大的障碍。如果一个网站加载了一个马的表格,并列出了当前的投注价格,这些信息并不在任何源文件中。线索是,这些数据有时是实时的,这些数字显然是从某个远程服务器上更新的。我PC上的HTML只是有一个洞,他们的服务器正在推送我需要的所有有趣的数据。
现在我对动态网页内容的经验很低,所以这件事是我有麻烦得到我的头周围。
我认为Java或Javascript是一个关键,这经常弹出。
scraper只是一个几率比较引擎。有些站点有API,但我需要它来支持那些没有的站点。我使用的是Python 2.7的scrapy库
如果这个问题过于开放,我很抱歉。简而言之,我的问题是:如何使用Scrapy来抓取这些动态数据,以便我可以使用它?以便我可以实时抓取这些投注赔率数据?
9条答案
按热度按时间ckocjqey1#
下面是一个简单的
scrapy
示例,其中包含一个 AJAX 请求。所有的消息都是通过 AJAX 请求加载的,我的目标是获取这些消息及其所有属性(作者、日期......):
当我分析网页的源代码时,我无法看到所有这些消息,因为网页使用 AJAX 技术,但我可以使用Mozilla Firefox的Firebug(或其他浏览器中的等效工具)来分析在网页上生成消息的HTTP请求:
它不会重新加载整个页面,而只会重新加载页面中包含消息的部分。为此,我在页面底部单击了任意数量的页面:
我观察了负责消息正文的HTTP请求:
完成后,我分析了请求的头(我必须引用这个URL,我将从源页面提取var部分,见下面的代码):
指令集
和表单数据内容的请求(HTTP方法是“Post”):
响应的内容是一个JSON文件:
指令集
它提供了我要的所有信息。
从现在起,我必须把这一切知识都落实在舍雷里.让我们为这个目的定义蜘蛛:
在
parse
函数中,我有对第一个请求的响应。在RubiGuessItem
中,我有包含所有信息的JSON文件。lg40wkob2#
基于Webkit的浏览器(如Google Chrome或Safari)有内置的开发者工具。在Chrome中,你可以打开它
Menu->Tools->Developer Tools
。Network
标签允许你查看每个请求和响应的所有信息:在图片的底部,您可以看到我已经将请求过滤到
XHR
-这些是由javascript代码发出的请求。在分析请求和响应之后,您可以从您的网络爬虫模拟这些请求并提取有价值的数据。在许多情况下,获取数据比解析HTML更容易,因为这些数据不包含表示逻辑,并且被格式化为可由javascript代码访问。
Firefox也有类似的扩展名,它被称为firebug。有些人会认为Firebug甚至更强大,但我喜欢Webkit的简单性。
xxhby3vn3#
很多时候,当抓取时,我们会遇到一些问题,页面上呈现的内容是用Javascript生成的,因此Scrapy无法抓取这些内容(例如 AJAX 请求,jQuery疯狂)。
然而,如果你使用Scrapy沿着Web测试框架Selenium,那么我们就可以抓取普通Web浏览器中显示的任何内容。
需要注意的事项:
参考:http://snipplr.com/view/66998/
jxct1oxe4#
另一个解决方案是实现下载处理程序或下载处理程序中间件。(有关下载中间件的更多信息,请参见scrapy docs)以下是一个使用selenium和headless phantomjs webdriver的示例类:
middlewares.py
脚本中定义类。JsDownload()
类添加到settings.py
内的变量DOWNLOADER_MIDDLEWARE
:your_spider.py
中集成HTMLResponse
。解码响应主体将获得您想要的输出。可选附加组件:
我希望能够告诉不同的spider使用哪个中间件,所以我实现了这个 Package 器:
要使 Package 器工作,所有spider必须至少具有:
为了包括中间件:
优点:
以这种方式而不是在蜘蛛中实现它的主要优点是,你最终只需要发出一个请求。下载处理程序处理请求,然后将响应传递给蜘蛛,然后蜘蛛在其parse_page函数中发出一个全新的请求--这是对同一内容的两个请求。
zlhcx6iw5#
我 使用 了 一 个 自 定义 的 下载 中间 件 , 但 不是 很 满意 , 因为 我 没有 设法 使 缓存 与 它 一起 工作 。
一 种 更 好 的 方法 是 实现 自 定义 下载 处理 程序 。
有 一 个 工作 示例 here 。 它 看 起来 像 这样 :
中 的 每 一 个
Suppose your scraper is called "scraper". If you put the mentioned code inside a file called handlers.py on the root of the "scraper" folder, then you could add to your settings.py:
格式
瞧 , JS 解析 的 DOM , 带有 零碎 的 缓存 、 重试 等 。
qlfbtfca6#
如何使用Scrapy来抓取这些动态数据以便使用它呢?
我想知道为什么没有人只使用Scrapy发布解决方案。
查看Scrapy团队SCRAPING INFINITE SCROLLING PAGES的博客文章。这个示例抓取了使用无限滚动的http://spidyquotes.herokuapp.com/scroll网站。
我们的想法是使用浏览器的开发工具并注意 AJAX 请求,然后根据该信息创建Scrapy请求。
4smxwvx57#
从外部url(即API)生成的数据调用HTML响应作为POST方法。
zwghvu4y8#
是,Scrapy可以抓取动态网站,即通过javaScript呈现的网站。
有两种方法来破坏这些网站。
第一、
你可以使用
splash
来呈现Javascript代码,然后解析呈现的HTML。你可以在这里找到文档和项目Scrapy splash, git第二、
正如每个人所说,通过监视
network calls
,是的,你可以找到获取数据的api调用,并在你的scrapy spider中模拟该调用,这可能会帮助你获得所需的数据。6ss1mwsb9#
我使用Selenium和Firefox web驱动程序来处理 AJAX 请求。如果你需要爬行器作为守护进程,它不是那么快,但比任何手动解决方案都要好。我写了一个简短的教程here供参考