scrapy-redis案例(二)爬取中国红娘相亲网站

前言:本案例将分为三篇。

第一篇,使用scrapy框架来实现爬取中国红娘相亲网站。

第二篇,使用scrapy-redis 简单的方式爬取中国红娘相亲网站。(使用redis存储数据,请求具有持续性,但不具备分布式)

第三篇,使用scrapy-redis 分布式的方法爬取中国红娘相亲网站。

(1)祭出scrapy-redis 的框架图

scrapy-redis案例(二)爬取中国红娘相亲网站_第1张图片
scrapy-redis 只是在scrapy 的基础上增加了reids 的扩展。这里不过多介绍。我会再写一篇介绍scrapy-redis的基础内容。

在这里,假设你已经了解scrapy-redis的基础了,也安装了redis 和 scrapy-redis 的第三方类库,并安装了redis数据库。

这里我们引入scrapy-redis 官方提供的例子,作为我们的参考。

官方地址:https://github.com/rmax/scrapy-redis

scrapy-redis案例(二)爬取中国红娘相亲网站_第2张图片

这个github工程就是 scrapy-redis 的源码,其中example-project 就是官方提供的示例。我们将这个工程都下载下来。

(2)分析官方示例中的dmoz.py 和 settings.py 文件

scrapy-redis案例(二)爬取中国红娘相亲网站_第3张图片

【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 数据库服务已经开启。

scrapy-redis案例(二)爬取中国红娘相亲网站_第4张图片

官方案例的setting设置中并没有对redis 数据库进行设置,那就是默认的。

redis 默认连接ip 127.0.0.1 端口 6379

我们使用 redis-Deskesktop-manager 这个软件,查看一下我们redis数据库

scrapy-redis案例(二)爬取中国红娘相亲网站_第5张图片

其中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 的内容,先有一个认识,再深入了解,我认为是这样的。

源码:https://github.com/gengzi/hongniang

你可能感兴趣的:(scrapy-redis,python-scrapy)