前言:本案例将分为三篇。
第一篇,使用scrapy框架来实现爬取中国红娘相亲网站。
第二篇,使用scrapy-redis 简单的方式爬取中国红娘相亲网站。(使用redis存储数据,请求具有持续性,但不具备分布式)
第三篇,使用scrapy-redis 分布式的方法爬取中国红娘相亲网站。
在这里,假设你已经了解scrapy-redis的基础了,也安装了redis 和 scrapy-redis 的第三方类库,并安装了redis数据库。
这里我们引入scrapy-redis 官方提供的例子,作为我们的参考。
官方地址:https://github.com/rmax/scrapy-redis
这个github工程就是 scrapy-redis 的源码,其中example-project 就是官方提供的示例。我们将这个工程都下载下来。
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,
}
其他的配置并没有变化。
这个文件和我们自己创建 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中拿到请求,去爬取数据。不会因为停止爬虫项目,从头开始爬取。
在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 ,不能修改。
对应值可以修改为自己的。
只是大概介绍了一下 scrapy-redis 的内容,先有一个认识,再深入了解,我认为是这样的。
源码:https://github.com/gengzi/hongniang