
1.普通爬虫
- 普通爬虫正常处理完 scrapy 流程后修改 settings 配置文件即可。
- 在 redis 中会出现存储的 item,和链接指纹,下次指纹相同的 url 将不会再次请求
- item 的作用只是帮你在 redis 中存储一份数据
- 通用爬虫原理相同(写完流程修改配置文件即可)
- 需要在 redis 中存储 item,需要将 redis 的中间件加入管道,否则就只会存储链接指纹
- 增加了 redis 的普通爬虫,支持断点续传,增量爬取
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
SCHEDULER_PERSIST = True
DUPEFILTER_DEBUG = True
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 400,
}
REDIS_HOST = '192.168.229.128'
REDIS_PORT = 6379
REDIS_PARAMS = {
'password': 'redis',
'db': 11
}
REDIS_URL = "redis://:redis@192.168.229.128:6379/11"
REDIS_ENCODING = 'utf-8'
2.分布式爬虫
- 1.在处理完正常爬取流程后,将 settings 配置文件修改为上面通用配置文件
- 2.修改 scrapy 爬虫继承的类
- 1.from scrapy_redis.spiders import RedisSpider
- 2.如果是通用爬虫,就继承 RedisCrawlSpider
- 2.没有了 start_urls 属性,取而代之的是 redis_key = ‘name’
- 后面的 name 表示在 redis 中可以被共享的队列名
- 之后进入到要启动的爬虫文件位置
- 启动指令为:scrapy runspider pa.py
- 最后面的 pa.py 为爬虫文件的文件名
- 如果日志文件等级太高将不会有任何输出
- scrapy 将在队列内 pop 出一个 url 进行爬取
- 4.配置文件中修改好 redis 数据库的信息
- 5.在 redis 内执行 lpush redis_keys 的名字 需要爬取的 url
- 完毕!
传参
- 但有时候并不是只传一个 url 过去就好了,还需要传递一些参数什么。
- 可以进行以下操作
from json import loads
def make_request_from_data(self, data):
data = loads(data)
yield scrapy.Request(url=data['url'], callback=self.parse, method='GET', cb_kwargs={'value': int(data['value'])})
lpush redis-key '{"url":"https://www.xxx.com","value":5}'
3.主机端
- 之后可以再写一个 scrapy 只负责抓取 url,写入 redis 中,实现分布式。
注意事项:
- 这里导入 item 不要使用..item,会导致启动分布式爬虫的时候报错
- 推荐:from spider.items import SpiderItem
- redis 链接时中文乱码:redis-cli –raw -h ip -p 端口