1. 程式人生 > >scrapy-redis案例(二)爬取中國紅娘相親網站

scrapy-redis案例(二)爬取中國紅娘相親網站

前言:本案例將分為三篇。

第一篇,使用scrapy框架來實現爬取中國紅娘相親網站。

第二篇,使用scrapy-redis 簡單的方式爬取中國紅娘相親網站。(使用redis儲存資料,請求具有持續性,但不具備分散式)

第三篇,使用scrapy-redis 分散式的方法爬取中國紅娘相親網站。

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

scrapy-redis 只是在scrapy 的基礎上增加了reids 的擴充套件。這裡不過多介紹。我會再寫一篇介紹scrapy-redis的基礎內容。

在這裡,假設你已經瞭解scrapy-redis的基礎了,也安裝了redis 和 scrapy-redis 的第三方類庫,並安裝了redis資料庫。

這裡我們引入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 的內容,先有一個認識,再深入瞭解,我認為是這樣的。