通常我们在一个站站点进行采集的时候,如果是小站的话我们使用scrapy本身就可以满足。
但是如果在面对一些比较大型的站点的时候,单个scrapy就显得力不从心了。
要是我们能够多个Scrapy一起采集该多好啊人多力量大。
很遗憾Scrapy官方并不支持多个同时采集一个站点,虽然官方给出一个方法:
* *将一个站点的分割成几部分交给不同的scrapy去采集* *
似乎是个解决办法,但是很麻烦诶!毕竟分割很麻烦的哇
下面就改轮到我们的额主角Scrapy-Redis登场了!
能看到这篇文章的小伙伴肯定已经知道什么是Scrapy以及Scrapy-Redis了,基础概念这里就不再介绍。默认情况下Scrapy-Redis是发送得到请求获取数据的,对于某些使用后请求的情况需要重写make_request_from_data函数即可,但奇怪的是居然没在网上搜到简洁明了的答案,或许是太简单了?。
这里我以httpbin.org这个网站为例,首先在settings.py中添加所需配置,这里需要根据实际情况进行修改:
调度器=" scrapy_redis.scheduler。调度器“#启用复述,调度存储请求队列 SCHEDULER_PERSIST=True #不清除复述队列,这样可以暂停/恢复爬取 DUPEFILTER_CLASS=" scrapy_redis.dupefilter。RFPDupeFilter“#确保所有的爬虫通过复述,去重 SCHEDULER_QUEUE_CLASS=' scrapy_redis.queue.SpiderPriorityQueue ' REDIS_URL="复述://127.0.0.1:6379 "
# - * -编码:utf - 8 - * 进口scrapy 从scrapy_redis。蜘蛛进口RedisSpider 类HpbSpider (RedisSpider): name=' hpb ' redis_key=' test_post_data ' def make_request_from_data(自我、数据): ”““请求返回一个实例的数据来自复述。 默认情况下,“数据”是一个编码的URL。你可以重写这个方法 提供自己的信息解码。 参数 ---------- 数据:字节 消息从复述。 ”“” 返回scrapy.FormRequest (" https://www.httpbin.org/post ", formdata=https://www.yisu.com/zixun/{“数据”:数据},回调=self.parse) def解析(自我,反应): 打印(response.body)
这里为了简单直接进行输出,真实使用时可以结合管道写数据库等。
然后启动爬虫程序scrapy爬hpb,由于我们还没向test_post_data中写数据,所以启动后程序进入等待状态,然后模拟向队列写数据:
进口复述, rd=redis.Redis(127.0.0.1,端口=6379,德国联邦铁路(db)=0) 在范围内(1000):_ rd.lpush (test_post_data, _)
此时可以看到爬虫已经开始获取程序了:
2019-05-06 16:30:21 (hpb)调试:读8请求“test_post_data”
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
2019-05-06 16:30:21 [scrapy.core。发动机调试:爬(200)& lt;文章https://www.httpbin.org/post>(推荐人:没有)
b {\ n “参数”:{}\ n “数据”:“\ n “文件”:{}\ n “形式”:{\ n ,,“数据”:“0”\ n }\ n “标题”:{\ n ,,“接受”:“text/html、application/xhtml + xml应用程序/xml; q=0.9 */*; q=0.8 ", \ n ,,“接受编码”:“gzip、缩小”、\ n ,,“接收语言”:“en”, \ n ,,“内容长度”:“6”,\ n ,,“内容类型”:“应用程序/x-www-form-urlencoded \ n ,,“主机”:“www.httpbin.org”, \ n ,,“用户代理”:“Scrapy/1.5.1 (+ https://scrapy.org)”\ n }\ n json: null, \ n “起源”:“1.2.3.48 1.2.3.48”\ n " url ": " https://www.httpbin.org/post " \ n} \ n '
b {\ n “参数”:{}\ n “数据”:“\ n “文件”:{}\ n “形式”:{\ n ,,“数据”:“1”\ n }\ n “标题”:{\ n ,,“接受”:“text/html、application/xhtml + xml应用程序/xml; q=0.9 */*; q=0.8 ", \ n ,,“接受编码”:“gzip、缩小”、\ n ,,“接收语言”:“en”, \ n ,,“内容长度”:“6”,\ n ,,“内容类型”:“应用程序/x-www-form-urlencoded \ n ,,“主机”:“www.httpbin.org”, \ n ,,“用户代理”:“Scrapy/1.5.1 (+ https://scrapy.org)”\ n }\ n json: null, \ n “起源”:“1.2.3.48 1.2.3.48”\ n " url ": " https://www.httpbin.org/post " \ n} \ n 'Scrapy-Redis结合后请求获取数据的方法示例