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))