分布式爬虫
Scrapy_Redis在scrapy的基础上实现了更多,更强大的功能具体有:
1.request去重,
2.爬虫持久化,
3.轻松实现分布式,
爬虫分布式可以提高效率,
改成分布式爬虫,需要修改的四组组件:
Scheduler
Duplication Filter
item Pipeline 数据处理的管道,默认数据会存储到redis
Base Spider
通过redis可以实现调度器队列和指纹集合。
在多台主机上同时运行爬虫任务协同爬取,而协同爬取的前提就是共享爬取队列。这样各台主机就不需要各自维护爬取队列,而是从共享爬取队列存取Request。
但是各台主机还是有各自的Scheduler和Downloader,所以调度和下载功能分别完成。如果不考虑队列存取性能消耗,爬取效率还是会成倍提高。
redis
为了维护爬虫队列(队列不能重复用到了集合)
我们用redis数据库进行存储,(列表 、集合 、有序集合、哈希表 、 字符串)
1.在settings中设置,自定义去重组件:
DUPEFITER_CLASS = "scrapy_redis.dupfilter.REPDupeFilter"
2.设置SCHEDULER,使用scrapy_reddis的调度器组件.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
3.不清除redis的请求记录,允许暂停和停止爬取
SCHEDULER_PERSIST = True
4.设置请求任务的队列模式.
#SpiderPriorityQueue 是scrapy_redis框架默认的队列模式(有自己的优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# SpiderQueue 是请求的队列模式(FifoQueue),先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# SpiderStack 是请求的队列模式(LifoQueue),后进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
5.设置redis数据库的ip和端口
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
6.激活redis管道
'scrapy_redis.pipelines.RedisPipeline': 400,
通用爬虫用:
from scrapy_redis.spiders import RedisCrawlSpider
聚焦爬虫:
from scrapy_redis.spiders import RedisSpider
部署
需要导包:
import scrapyd
scrapyd-client
开启部署命令 scrapyd
本地部署:
scrapyd-deploy -p <项目名称>
制定版本部署:
scrapyd-deploy -p <项目名称> --version <版本号>
远程部署:
购买linux服务器后登录服务器:ssh ubuntu@端口