scrapy-redis

修改setting.py文件

# 1(必须). 使用了scrapy_redis的去重组件,在redis数据库里做去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 2(必须). 使用了scrapy_redis的调度器,在redis里分配请求
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 3(必须). 在redis中保持scrapy-redis用到的各个队列,从而允许暂停和暂停后恢复,也就是不清理redis queues
SCHEDULER_PERSIST = True

# 4(必须). 通过配置RedisPipeline将item写入key为 spider.name : items 的redis的list中,供后面的分布式处理item
# 这个已经由 scrapy-redis 实现,不需要我们写代码,直接使用即可
ITEM_PIPELINES = {
    'project.pipelines.Mypipeline': 100
}

# 5(必须). 指定redis数据库的连接参数
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379

# 6.如果不启用则按scrapy默认的策略
#  -1. 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue'
#  -2. 可选的 按先进先出排序(FIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderQueue'
#  -3. 可选的 按后进先出排序(LIFO)
# SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderStack'

# 7. LOG等级
#LOG_LEVEL = 'DEBUG'

  

spider.py

from scrapy_redis.spiders import RedisSpider

class ExampleSpider(RedisSpider):
    name = 'example'
    redis_key = 'example:start_urls'

 scrapy-redis 默认为get请求,那么post请求如何处理。其实这是考到你会不会变通,知识点就是中间件的process_request,正则匹配需要post请求的url规则,自行使用requests发起请求,返回 scrapy.http.HtmlResponse对象即可。相当于自行实现了download下载器

实现Post

查看RedisSpider源码,重写make_request_form_data即可,start_urls的post请求。若要实现自由post请自行实现中间件,判断url规则即可。

class MySpider(RedisSpider):
    name = 'myspider'
    redis_key = "myspider:start_urls"

    def make_request_from_data(self, data):

        data = json.loads(data)
        url = data.get('url')
        form_data = data.get('form_data')
        logging.info("start page {}".format(form_data.get('Page')))
        return scrapy.FormRequest(url=url, formdata=form_data, callback=self.parse)

  

insert_start_urls.py

import json
import redis

r = redis.Redis()

def insert_start_urls():
    key = "myspider:start_urls"
    url = "http://www.baidu.com"
    formdata = {
        "":""
    }
    for i in range(100):
        result = {
            "url":url,
            "form_data":formdata
        }
        r.rpush(key,json.dumps(result))

  

原文地址:https://www.cnblogs.com/zenan/p/10329389.html