scrapy官网概要(四)之不同的应用场景

作者:清一

类别:数据处理及人工智能   

发布时间:2019/11/18 16:38:22   更新时间:2019/11/18 16:43:57


通用实践

脚本运行scrapy是通常做法

普通获取数据够用了。

多进程

多并发

避免被禁

一些网站实施了某些措施,以防止机器人以不同程度的复杂程度对其进行爬网。绕开这些措施可能是困难而棘手的,有时可能需要特殊的基础结构。如有疑问,请考虑联系商业支持

处理这些类型的网站时,请牢记以下建议:

* 从浏览器中的一系列知名用户中轮流使用您的用户代理(四处搜索以获取它们的列表)

* 禁用cookie(请参阅参考资料COOKIES_ENABLED),因为某些网站可能会使用cookie来发现机器人行为

* 使用下载延迟(2或更高)。参见DOWNLOAD_DELAY设置。

* 如果可能,请使用Google缓存来获取页面,而不要直接访问这些网站

* 使用旋转IP池。例如,免费的Tor项目或类似ProxyMesh的付费服务。开源替代方案是scrapoxy,您可以将自己的代理附加到超级代理。

* 使用可以在内部规避禁令的高度分散的下载器,因此您可以专注于解析干净的页面。此类下载器的一个示例是 Crawlera

如果仍然无法阻止您的爬虫被禁用,请考虑与商业支持联系 。

广域爬虫(搜索引擎的)

Scrapy默认值已针对爬网特定站点进行了优化。这些站点通常由单个Scrapy蜘蛛处理,尽管这不是必需的,也不是必需的(例如,有通用的蜘蛛可以处理向其投掷的任何给定站点)。

除了这种“集中爬网”之外,还有另一种常见的爬网类型,它涵盖大量(可能是无限的)域,并且仅受时间或其他任意约束的限制,而不是在对域进行爬网完成或完成时停止没有更多的执行请求时。这些被称为“广泛爬网”,是搜索引擎采用的典型爬网程序。

这些是广泛的爬网中经常发现的一些常见属性:

*他们抓取了许多域(通常是无限制的),而不是一组特定的站点

*它们并不一定要完全爬网域,因为这样做是不切实际的(或不可能的),而是通过时间或爬网的页面数来限制爬网

*它们的逻辑更简单(与具有许多提取规则的非常复杂的蜘蛛相反),因为数据通常在单独的阶段进行后处理

*它们会同时爬网许多域,这使它们不受任何特定站点限制的限制而实现了更快的爬网速度(每个站点缓慢爬网以尊重礼貌,但许多站点是并行爬网的)

如上所述,Scrapy默认设置针对焦点爬网(而不是广泛爬网)进行了优化。但是,由于其异步体系结构,Scrapy非常适合执行快速的广泛爬网。

选择动态加载的内容

当您将某些网页加载到Web浏览器中时,它们会显示所需的数据。但是,当您使用Scrapy下载它们时,无法使用选择器到达所需的数据。

发生这种情况时,推荐的方法是 找到数据源并从中提取数据。

如果您未能做到这一点,并且仍然可以从Web浏览器通过DOM访问所需的数据,请参阅 预渲染JavaScript

 

对于复杂的前端框架代码,提取通过restful动态加载的数据,需要对前端代码进行分析。

——这也就是为什么说,restful api对搜索引擎(爬虫)不友好。

部署

本节介绍了部署Scrapy蜘蛛以使其定期运行时所具有的不同选项。在(早期)开发阶段,在本地计算机上运行Scrapy蜘蛛非常方便,但是当您需要执行长时间运行的蜘蛛或移动蜘蛛以连续进行生产时,就没有那么多了。这就是部署Scrapy Spider的解决方案的地方。

部署Scrapy蜘蛛的流行选择是:

Scrapyd(开源)

Scrapy Cloud(基于云)

Scrapyd

Scrapyd是运行Scrapy Spider的开源应用程序。它提供了带有HTTP API的服务器,该服务器能够运行和监视Scrapy蜘蛛。

要将Spider部署到Scrapyd,可以使用scrapyd-client软件包提供的scrapyd-deploy工具。请参阅scrapyd-deploy文档以获取更多信息。

Scrapyd由一些Scrapy开发人员维护。

 

安装命令

scrapyd,这是运行爬虫的服务器端

pip install scrapyd

 

scrapy-client,它允许我们将本地的scrapy项目打包发送到scrapyd 这个服务端

pip install scrapyd-client

限速扩展(AutoThrottle extension)

这是基于Scrapy服务器和要爬网的网站的负载自动限制爬网速度的扩展。

基准测试

Scrapy带有一个简单的基准测试套件,该套件可生成本地HTTP服务器并以最大可能的速度对其进行爬网。基准测试的目的是了解Scrapy在您的硬件中的性能,以便为比较提供通用的基准。它使用一个简单的蜘蛛,什么都不做,只跟随链接。

scrapy bench

暂停和回复(jobs)

有时,对于大型网站,希望暂停爬网并在以后能够恢复它们。

Scrapy通过提供以下功能来立即支持此功能:

* 将计划的请求保留在磁盘上的调度程序

* 一个重复的过滤器,可将访问的请求持久保存在磁盘上

* 一种扩展,可在批次之间保持某些蜘蛛状态(键/值对)持久

中间件

下载程序中间件

下载器中间件是一个挂钩Scrapy的请求/响应处理的框架。这是一个轻量级的低级系统,用于全局更改Scrapy的请求和响应。

要激活下载程序中间件组件,请将其添加到 DOWNLOADER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序。

spider中间件

Spider中间件是Scrapy的Spider处理机制的一个挂钩框架,您可以在其中插入自定义功能,以处理发送到Spider进行处理的响应以及处理从Spider生成的请求和项目。

要激活Spider中间件组件,请将其添加到 SPIDER_MIDDLEWARES设置中,这是一个dict,其键为中间件类路径,其值为中间件顺序。

扩展

扩展框架提供了一种将自己的自定义功能插入Scrapy的机制。

扩展只是在初始化扩展时在Scrapy启动时实例化的常规类。

扩展设置

扩展程序使用Scrapy设置来管理其设置,就像其他任何Scrapy代码一样。

扩展名通常会在其设置前添加自己的名称,以避免与现有(和将来)扩展名冲突。举例来说,假设的扩展来处理谷歌的Sitemaps会使用类似的设置 GOOGLESITEMAP_ENABLED,GOOGLESITEMAP_DEPTH等。

信号

Scrapy广泛使用信号来通知某些事件。您可以在Scrapy项目中捕获某些信号(例如,使用扩展名)来执行其他任务,或者扩展Scrapy以添加开箱即用时未提供的功能。

即使信号提供了多个参数,捕获它们的处理程序也不需要接受所有参数-信号分配机制将仅传递处理程序接收的参数。

您可以通过Signals API连接到信号(或发送自己的 信号)

数据导出原理


本文属于原创文章,未经许可,任何媒体、公司或个人不得刊发或转载。

本文网址:https://www.pyfield.com/blog/?id=44