天天看點

scrapy爬蟲架構中基于redis分布式,資料存儲mysql中

redis分布式介紹

  1. 什麼是分布式

    一個系統分為很多個子系統,這些子系統互相配合完成整個的業務邏輯叫做分布式,分布式中每一個節點都可以配置叢集。

  2. Redis 是一個基于記憶體的高性能key-value資料庫。
  3. redis 特點和優勢

    (1)特點:

  • Redis本質上是一個Key-Value類型的記憶體資料庫,很像memcached,整個資料庫統統加載在記憶體當中進行操作,定期通過異步操作把資料庫資料flush到硬碟上進行儲存。因為是純記憶體操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。
  • Redis的出色之處不僅僅是性能,Redis最大的魅力是支援儲存多種資料結構,此外單個value的最大限制是1GB,不像 memcached隻能儲存1MB的資料,是以Redis可以用來實作很多有用的功能,比方說用他的List來做FIFO雙向連結清單,實作一個輕量級的高性 能消息隊列服務,用他的Set可以做高性能的tag系統等等。另外Redis也可以對存入的Key-Value設定expire時間,是以也可以被當作一 個功能加強版的memcached來用。
  • Redis的主要缺點是資料庫容量受到實體記憶體的限制,不能用作海量資料的高性能讀寫,是以Redis适合的場景主要局限在較小資料量的高性能操作和運算上。

    (2)優勢:

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的資料類型 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料類型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。
  • 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

搭建分布式爬蟲

  1. 安裝scrapy_redis庫;

    指令:

pip install scrapy_redis
           
  1. 導包,修改爬蟲項目中爬蟲檔案的類的繼承,并且類需要繼承自RedisSpider;

原來代碼:

class XiaohuaSpider(scrapy.Spider):
	pass
           

修改後為:

from scrapy_redis.spiders import RedisSpider
class XiaohuaSpider(RedisSpider):
	pass
           
  1. 将爬蟲檔案的類的屬性start_urls注釋掉,并添加redis_key = “任意名稱”;

    代碼:

# start_urls = ['http://www.xiaohuar.com/list-1-0.html']
redis_key = "xiaohua1"
           
  1. 修改爬蟲檔案的類的屬性custom_settings,并添加配置資訊;
custom_settings = {
        "ROBOTSTXT_OBEY": False,
        "CONCURRENT_REQUESTS": 16,
        "DOWNLOAD_DELAY": 1,
        "COOKIES_ENABLED": False,
        "ITEM_PIPELINES": {
            # Store scraped item in redis for post-processing. 分布式redispipeline
            'scrapy_redis.pipelines.RedisPipeline': 299,
            # 将爬取的資料存儲到mysql中,定義管道檔案
            'xiaohuaSqider.pipelines.MySQLTwistedPipeline': 300,
        },
        """ scrapy-redis配置 """
        # Enables scheduling storing requests queue in redis.
        "SCHEDULER": "scrapy_redis.scheduler.Scheduler",
        # Ensure all spiders share same duplicates filter through redis.
        "DUPEFILTER_CLASS": "scrapy_redis.dupefilter.RFPDupeFilter",
        "REDIS_HOST": "192.168.4.193",  # 本機ip
        "REDIS_PORT": "6379"  # redis端口号,預設6379
    }
           
  1. 修改redis中的redis.windows.conf檔案内容;
    scrapy爬蟲架構中基于redis分布式,資料存儲mysql中
    新安裝的redis預設狀态下,是bind 127.0.0.1 或者bind localhost,修改為本機ip位址,如(bind 192.168.4.193)
  • 原先配置:
    scrapy爬蟲架構中基于redis分布式,資料存儲mysql中
  • 修改結果:
    scrapy爬蟲架構中基于redis分布式,資料存儲mysql中
    注意:修改過後,redis.windows.conf檔案,一定要重新啟動redis服務。重新開機步驟
  1. 對mysql添加遠端通路使用者;
  • 建立資料庫使用者(使用者權限為 % 讓從伺服器能通路該資料庫,注意:sql語句 % 兩端需要加引号):
grant all privileges on *.* to '使用者名'@'%'  identified by '密碼';
           
  • 重新整理資料庫權限:
flush privileges;
           
  1. 啟動redis服務,設定redis主從;
redis-cli.exe -h 192.168.4.193 -p 6379
           
  • 其中192.168.4.193表示本機ip,6379表示端口号。
  • 讓從伺服器連接配接
lpush redis_key的值 網址
           
  1. 運作爬蟲項目

    分布式用到的代碼應該是同一套代碼

    1) 先把項目配置為分布式

    2) 把項目拷貝到多台伺服器中

    3) 把所有爬蟲項目都跑起來

    4) 在redis中lpush你的網址即可

    5) 效果:所有爬蟲都開始運作,并且資料還都不一樣