1.有时候我们爬取数据跑了半天,突然报错了,例如网络中断,我们想继续爬取,不需程序从头开始爬取,可以采取下面的方案
要启用一个爬虫的持久化,运行以下命令:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
然后,你就能在任何时候安全地停止爬虫(按Ctrl-C或者发送一个信号)。恢复这个爬虫也是同样的命令:
scrapy crawl somespider -s JOBDIR=crawls/somespider-1
2.pipline项目管道文件中,我们经常不止定义一个下载管道,就需要我们在setting里面ITEM_PIPELINES设置优先级,级别高的优先执行,级别低的后执行,但是级别高的process_item方法里面必须要teturn item 否则级别低的管道获取不到item。
3.定时执行多个爬虫任务,
在main.py里面写以下代码
import time
import os
while True:
print('the first spider')
os.system("scrapy crawl human -o human.json")
print('the second spider')
os.system("scrapy crawl nbgov -o nbgov.json")
time.sleep(86400)# 24hours
4.Scrapy的默认Downloader Middleware的设置如下:
'scrapy.downloadermiddlewares.robotstxt.RobotsTxtMiddleware': 100,
'scrapy.downloadermiddlewares.httpauth.HttpAuthMiddleware': 300,
'scrapy.downloadermiddlewares.downloadtimeout.DownloadTimeoutMiddleware': 350,
'scrapy.downloadermiddlewares.defaultheaders.DefaultHeadersMiddleware': 400,
'scrapy.downloadermiddlewares.useragent.UserAgentMiddleware': 500,
'scrapy.downloadermiddlewares.retry.RetryMiddleware': 550,
'scrapy.downloadermiddlewares.ajaxcrawl.AjaxCrawlMiddleware': 560,
'scrapy.downloadermiddlewares.redirect.MetaRefreshMiddleware': 580,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 590,
'scrapy.downloadermiddlewares.redirect.RedirectMiddleware': 600,
'scrapy.downloadermiddlewares.cookies.CookiesMiddleware': 700,
'scrapy.downloadermiddlewares.httpproxy.HttpProxyMiddleware': 750,
'scrapy.downloadermiddlewares.stats.DownloaderStats': 850,
'scrapy.downloadermiddlewares.httpcache.HttpCacheMiddleware': 900,
要使得我们自定义的CookiesMiddleware生效,它在内置的CookiesMiddleware之前调用。内置的CookiesMiddleware的优先级为700,所以这里我们设置一个比700小的数字即可。
要使得我们自定义的ProxyMiddleware生效,它在内置的HttpProxyMiddleware之前调用。内置的HttpProxyMiddleware的优先级为750,所以这里我们设置一个比750小的数字即可。
5.scrapy如果在保存数据的时候报错
InvalidDocument: Cannot encode object:
那么可能是你的item中的数据有对象,比如numpy, 将数据的数字转为int或者float,或者其他的转为str,将数据变为非对象就可以了