Scrapy-Redis结合后请求获取数据的方法示例

  

  

通常我们在一个站站点进行采集的时候,如果是小站的话我们使用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结合后请求获取数据的方法示例