# 通用爬虫
> 译者:[OSGeo 中国](https://www.osgeo.cn/)
碎片默认值针对爬行特定站点进行了优化。这些站点通常由一个残缺的 Spider 来处理,尽管这不是必需的或必需的(例如,有一些普通的 Spider 来处理任何向它们抛出的给定站点)。
除了这种“集中的爬行”之外,还有另一种常见的爬行类型,它覆盖了大量(可能是无限的)域,并且只受时间或其他任意约束的限制,而不是在域被爬行到完成或没有更多的请求执行时停止。这些被称为“宽爬虫”,是搜索引擎使用的典型爬虫。
这些是一些常见的特性,通常在广泛的爬行中发现:
* 它们对许多域(通常是无边界的)而不是一组特定的站点进行爬网
* 它们不一定要对域进行爬网直至完成,因为这样做是不切实际的(或不可能的),而是按已爬网的时间或页数限制爬网。
* 它们在逻辑上更简单(而不是具有许多提取规则的非常复杂的spider),因为数据通常在单独的阶段进行后处理。
* 它们同时对多个域进行爬网,这使得它们可以通过不受任何特定站点约束的限制来实现更快的爬网速度(每个站点的爬行速度都很慢,以尊重礼貌,但许多站点是并行进行的)
如上所述,Scrapy的默认设置是针对重点爬行而不是广泛爬行而优化的。然而,由于其异步体系结构,Scrapy非常适合执行快速的广泛爬行。本页总结了在使用Scrapy进行宽范围爬行时需要记住的一些事情,以及为实现高效的宽范围爬行而调整Scrapy设置的具体建议。
## 增加并发性
Concurrency是并行处理的请求数。存在全局限制和每个域限制。
scrapy中的默认全局并发限制不适用于并行地对许多不同的域进行爬网,因此您需要增加它。增加多少将取决于您的爬虫有多少CPU可用。一个好的起点是 `100` 但最好的方法是做一些试验,并确定零碎的进程在什么样的并发性上限制了CPU。为了获得最佳性能,您应该选择CPU使用率为80-90%的并发性。
要增加全局并发性,请使用:
```py
CONCURRENT_REQUESTS = 100
```
## 增加Twisted IO线程池的最大大小
目前scrapy使用线程池以阻塞方式进行DNS解析。如果并发性级别更高,则爬行速度可能会变慢,甚至无法达到DNS解析程序超时。增加处理DNS查询的线程数的可能解决方案。将更快地处理DNS队列,从而加快建立连接和整体爬行。
要增加最大线程池大小,请使用:
```py
REACTOR_THREADPOOL_MAXSIZE = 20
```
## 设置您自己的DNS
如果您有多个爬行进程和单个中心DNS,它会像DOS攻击DNS服务器一样,导致整个网络速度减慢,甚至阻塞您的机器。要避免这种情况,请使用本地缓存设置您自己的DNS服务器,并向某些大型DNS(如OpenDNS或Verizon)上游设置。
## 降低日志级别
当进行广泛的爬行时,你通常只对你得到的爬行率和发现的任何错误感兴趣。当使用 `INFO` 日志级别。为了保存CPU(和日志存储要求),不应使用 `DEBUG` 在生产中进行大型通用爬虫时的原木水平。使用 `DEBUG` 不过,在开发(广泛的)爬虫时,级别可能很好。
要设置日志级别,请使用:
```py
LOG_LEVEL = 'INFO'
```
## 禁用Cookie
禁用cookies,除非 _really_ 需要。在进行广泛的爬行时,通常不需要cookie(搜索引擎爬行器忽略它们),它们通过节省一些CPU周期和减少零碎爬行器的内存占用来提高性能。
要禁用cookie,请使用:
```py
COOKIES_ENABLED = False
```
## 禁用重试
重试失败的HTTP请求会大大降低爬行速度,特别是当站点原因响应速度非常慢(或失败)时,会导致超时错误,该错误会被多次不必要地重试,从而阻止爬行器容量被重新用于其他域。
要禁用重试,请使用:
```py
RETRY_ENABLED = False
```
## 减少下载超时
除非您是从一个非常慢的连接爬行(这不应该是广泛爬行的情况),否则请减少下载超时,以便快速丢弃卡住的请求并释放处理下一个请求的容量。
要减少下载超时,请使用:
```py
DOWNLOAD_TIMEOUT = 15
```
## 禁用重定向
考虑禁用重定向,除非您有兴趣跟踪它们。在进行广泛的爬行时,保存重定向并在以后的爬行中重新访问站点时解决重定向是很常见的。这也有助于保持每个爬网批处理的请求数不变,否则重定向循环可能会导致爬网程序在任何特定域上投入过多的资源。
要禁用重定向,请使用:
```py
REDIRECT_ENABLED = False
```
## 启用“Ajax可爬行页”的爬行
一些页面(根据2013年的经验数据,高达1%)宣称自己是 [ajax crawlable](https://developers.google.com/webmasters/ajax-crawling/docs/getting-started) . 这意味着它们提供了内容的纯HTML版本,通常只能通过Ajax提供。页面可以用两种方式表示:
1. 通过使用 `#!` 在url中-这是默认方式;
2. 通过使用一个特殊的元标签-这种方式在“主”、“索引”网站页面上使用。
废料处理(1)自动;处理(2)启用 [AjaxCrawlMiddleware](downloader-middleware.html#ajaxcrawl-middleware) ::
```py
AJAXCRAWL_ENABLED = True
```
在进行广泛的爬行时,通常会对许多“索引”网页进行爬行;AjaxCrawl中间件有助于正确地对它们进行爬行。它在默认情况下是关闭的,因为它有一些性能开销,启用它进行聚焦爬行没有什么意义。
- 简介
- 第一步
- Scrapy at a glance
- 安装指南
- Scrapy 教程
- 实例
- 基本概念
- 命令行工具
- Spider
- 选择器
- 项目
- 项目加载器
- Scrapy shell
- 项目管道
- Feed 导出
- 请求和响应
- 链接提取器
- 设置
- 例外情况
- 内置服务
- Logging
- 统计数据集合
- 发送电子邮件
- 远程登录控制台
- Web服务
- 解决具体问题
- 常见问题
- 调试spiders
- Spider 合约
- 常用做法
- 通用爬虫
- 使用浏览器的开发人员工具进行抓取
- 调试内存泄漏
- 下载和处理文件和图像
- 部署 Spider
- AutoThrottle 扩展
- Benchmarking
- 作业:暂停和恢复爬行
- 延伸 Scrapy
- 体系结构概述
- 下载器中间件
- Spider 中间件
- 扩展
- 核心API
- 信号
- 条目导出器
- 其余所有
- 发行说明
- 为 Scrapy 贡献
- 版本控制和API稳定性