前言:本案例将分为三篇。
第一篇,使用scrapy框架来实现爬取中国红娘相亲网站。
第二篇,使用scrapy-redis 简单的方式爬取中国红娘相亲网站。(使用redis存储数据,请求具有持续性,但不具备分布式)
第三篇,使用scrapy-redis 分布式的方法爬取中国红娘相亲网站。
(1)祭出scrapy-redis 的框架图
在这里,假设你已经了解scrapy-redis的基础了,也安装了redis 和 scrapy-redis 的第三方类库,并安装了redis数据库。
这里我们引入scrapy-redis 官方提供的例子,作为我们的参考。
官方地址:https://github.com/rmax/scrapy-redis
这个github工程就是 scrapy-redis 的源码,其中example-project 就是官方提供的示例。我们将这个工程都下载下来。
(2)分析官方示例中的dmoz.py 和 settings.py 文件
【1】settings.py 文件
settings 文件定义了新的一些规则:
# 修改request去重 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter" # 修改调度器 SCHEDULER = "scrapy_redis.scheduler.Scheduler" # 允许暂停, redis数据不会丢失 SCHEDULER_PERSIST = True # 默认的请求队列顺序 SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue" #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue" #SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
在ITEM_PIPELINES 的设置增加一个对redis 的支持
# scrapy_redis 将数据存放到 redis
ITEM_PIPELINES = {
'example.pipelines.ExamplePipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400,
}
其他的配置并没有变化。
【2】dmoz.py
这个文件和我们自己创建 crawlspider 没有什么不一样的地方,但是执行这个爬虫会将爬取的数据存放到redis 数据库中。
我们可以尝试执行一下这个爬虫:
scrapy crawl dmoz
这个网址我们的网络可能不支持。我们可以修改一下,供我们测试一下。
#!/usr/bin/env Python # coding=utf-8 from scrapy.linkextractors import LinkExtractor from scrapy.spiders import CrawlSpider, Rule from example.items import ExampleItem # 不支持redis 分布式 class DmozSpider(CrawlSpider): """Follow categories and extract links.""" name = 'dmoz' allowed_domains = ['baidu.com'] # start_urls = ['http://www.dmoz.org/'] # # rules = [ # Rule(LinkExtractor( # restrict_css=('.top-cat', '.sub-cat', '.cat-item') # ), callback='parse_directory', follow=True), # ] # # def parse_directory(self, response): # for div in response.css('.title-and-desc'): # yield { # 'name': div.css('.site-title::text').extract_first(), # 'description': div.css('.site-descr::text').extract_first().strip(), # 'link': div.css('a::attr(href)').extract_first(), # } start_urls = ['http://www.baidu.com/'] rules = [ Rule(LinkExtractor(allow="/"), callback='parse_directory', follow=True), ] def parse_directory(self, response): item = ExampleItem() yield item
将这个内容替换dmoz.py 的内容就可,再次执行一下,可以看到爬虫程序一直在执行。
在执行这个爬虫之前,请确保你的redis 数据库服务已经开启。
官方案例的setting设置中并没有对redis 数据库进行设置,那就是默认的。
redis 默认连接ip 127.0.0.1 端口 6379
我们使用 redis-Deskesktop-manager 这个软件,查看一下我们redis数据库
其中items 就是我们爬取到的数据。我们可以看下pipelines.py 中,保存就是这些信息。
这里不多说明,等我再理解理解这个框架,再解释其中的原理。可以先看看其他博主的文章。
从这个运行结果,我们知道了数据将会被保存到redis 中,并以json 的格式存储。
但是这个项目并不能实现分布式,但是redis存放的请求具有持续性,我们可以暂停整个爬虫项目,再开启,也不会有什么影响,再次开启的爬虫,依然会从redis中拿到请求,去爬取数据。不会因为停止爬虫项目,从头开始爬取。
(3)改造第一篇中实现的普通的scrapy 项目。
在settings.py 中在追加那几个配置,仅修改setting 即可。
#修改为 scrapy-redis
# 指定使用scrapy-redis的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 指定使用scrapy-redis的去重
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 默认的 按优先级排序(Scrapy默认),由sorted set实现的一种非FIFO、LIFO方式。
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 添加redis 远程连接的地址
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
ITEM_PIPELINES = {
'hongniang.pipelines.HongniangPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 400
}
其中redis 数据库连接的配置,可以不用写。但是一旦写,就必须是这两个key ,不能修改。
对应值可以修改为自己的。
(4)总结
只是大概介绍了一下 scrapy-redis 的内容,先有一个认识,再深入了解,我认为是这样的。