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