Scrapy——更改配置提升性能
1. 增加并发
并发是指同时处理的request的数量。其有全局限制和局部(每个网站)的限制。
Scrapy默认的全局并发限制对同时爬取大量网站的情况并不适用,因此您需要增加这个值。 增加多少取决于您的爬虫能占用多少CPU。 一般开始可以设置为 100 。不过最好的方式是做一些测试,获得Scrapy进程占取CPU与并发数的关系。 为了优化性能,您应该选择一个能使CPU占用率在80%-90%的并发数。
在setting.py
文件中写上CONCURRENT_REQUESTS = 100
,scrapy中默认的并发数是32
2. 增大线程池
scrapy通过一个线程池来进行DNS查询,增大这个线程池一般也可以提高scrapy性能。
REACTOR_THREADPOOL_MAXSIZE = 20
3. 降低log级别
当进行通用爬取时,一般您所注意的仅仅是爬取的速率以及遇到的错误。 Scrapy使用 INFO log级别来报告这些信息。为了减少CPU使用率(及记录log存储的要求), 在生产环境中进行通用爬取时您不应该使用 DEBUG log级别。 不过在开发的时候使用 DEBUG 应该还能接受。setting.py
文件中设置LOG_LEVEL = 'INFO'
4. 禁止cookie
除非您 真的 需要,否则请禁止cookies。在进行通用爬取时cookies并不需要, (搜索引擎则忽略cookies)。禁止cookies能减少CPU使用率及Scrapy爬虫在内存中记录的踪迹,提高性能。COOKIES_ENABLED = False
5. 禁止重试
对失败的HTTP请求进行重试会减慢爬取的效率,尤其是当站点响应很慢(甚至失败)时, 访问这样的站点会造成超时并重试多次。这是不必要的,同时也占用了爬虫爬取其他站点的能力。
RETRY_ENABLED = False
6. 减少下载超时
如果您对一个非常慢的连接进行爬取(一般对通用爬虫来说并不重要), 减小下载超时能让卡住的连接能被快速的放弃并解放处理其他站点的能力。
DOWNLOAD_TIMEOUT = 15
,其中15是设置的下载超时时间
7. 禁止重定向
除非您对跟进重定向感兴趣,否则请考虑关闭重定向。 当进行通用爬取时,一般的做法是保存重定向的地址,并在之后的爬取进行解析。 这保证了每批爬取的request数目在一定的数量, 否则重定向循环可能会导致爬虫在某个站点耗费过多资源。
REDIRECT_ENABLED = False
8. 设置延迟
DOWMLOAD_DELY=3
,设置延迟下载可以避免被发现
9. 启用调试工具
9.1 命令行调试
-
scrapy shell url 查看网页,不过这种方式可能对于要请求头的网页不行,对于一般的网页还是可以的
-
scrapy view shell 用来查看动态加载的网页,如果查看的网页用了动态加载,那么用这个命令行打开的网页就是不完整的,肯定缺少了什么
9.2 编辑器中的调试
from scrapy.shell import inspect_response def paser(self,response): inspect_response(response,self) #当程序运行到这里就会跳出终端,并且在终端出现调试命令,当然这个可以随便写在哪里
10. 自动调整爬虫负载
scrapy有一个扩展可以自动调节服务器负载,它通过一个算法来确定最佳的爬虫延时等设置。它的文档在这里。
相关配置如下,点击链接可以跳转到对应文档。
AUTOTHROTTLE_ENABLED
AUTOTHROTTLE_START_DELAY
AUTOTHROTTLE_MAX_DELAY
AUTOTHROTTLE_TARGET_CONCURRENCY
AUTOTHROTTLE_DEBUG
CONCURRENT_REQUESTS_PER_DOMAIN
CONCURRENT_REQUESTS_PER_IP
DOWNLOAD_DELAY
11. 暂停和恢复爬虫
初学者最头疼的事情就是没有处理好异常,当爬虫爬到一半的时候突然因为错误而中断了,但是这时又不能从中断的地方开始继续爬,但是这里有一个方法可以暂时的存储你爬的状态,当爬虫中断的时候继续打开后依然可以从中断的地方爬,不过虽说持久化可以有效的处理,但是要注意的是当使用cookie临时的模拟登录状态的时候要注意cookie的有效期
只需要在setting.py
中JOB_DIR=file_name
其中填的是你的文件目录,注意这里的目录不允许共享,只能存储单独的一个spider的运行状态,如果你不想在从中断的地方开始运行,只需要将这个文件夹删除即可
当然还有其他的方法:scrapy crawl somespider -s JOBDIR=crawls/somespider-1
,这个是在终端启动爬虫的时候调用的,可以通过ctr+c
中断,恢复还是输入上面的命令。