前言
需求:scrapy爬取网页速度十分缓慢,在目标网站良好的情况下三天才跑了80w条数据,参考其他爬虫的速度,一天抓取1000w条数据是没有问题的,scrapy性能需要优化。
思路:经过各种搜索,scrapy提高性能核心逻辑是提高并发数量,最简单的实现方式可以通过调整settings的‘CONCURRENT_REQUESTS’等参数或者使用分布式爬虫来提速。除此之外代码也要尽量少用循环。本人的简单优化主要通过以下方式
settings中设置CONCURRENT_REQUESTS
scrapy默认CONCURRENT_REQUESTS 为16,可以将CONCURRENT_REQUESTS 的数量增加。要注意download_delay会影响到并发的效果,大概是由于每个request的处理要在download_delay时间之后。具体见链接scrapy中CONCURRENT_REQUESTS与DOWNLOAD_DELAY的联系
DEPTH_PRIORITY = 1
SCHEDULER_DISK_QUEUE = 'scrapy.squeues.PickleFifoDiskQueue'
SCHEDULER_MEMORY_QUEUE = 'scrapy.squeues.FifoMemoryQueue'
spider中的循环优化
尽量减少循环的层数,另外参考python优化的原则,在循环中少用"."的方法。
lowerlist = ['this', 'is', 'lowercase']
upper = str.upper
upperlist = []
append = upperlist.append
for word in lowerlist:
append(upper(word))
print(upperlist)
中间价的优化
当时写了一个简单的中间件用来记录请求失败的url,将中间件删掉后速度有所提升。
异步导出数据
具体没尝试过故此只放链接在次
[异步导出数据]http://www.cnblogs.com/ruoniao/p/6906344.html
参考文章
提升 Python 程序性能的 6 个技巧
Scrapy爬虫入门教程十三 Settings(设置)
【Scrapy爬虫系列2】性能调优