天天看點

Scrapy架構 分布式爬蟲scrapy-redis元件 使用使用流程setting配置代碼1. 執行分布爬蟲方法2. 把url扔到排程器隊列

使用流程

Redis基于記憶體,讀寫速度快,也可做持久化,但是記憶體空間有限,當資料量超過記憶體空間時,需擴充記憶體,但記憶體價格貴;

MySQL基于磁盤,讀寫速度沒有Redis快,但是不受空間容量限制,成本效益高;

大多數的應用場景是MySQL(主)+Redis(輔),MySQL做為主存儲,Redis用于緩存,加快通路速度。需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存儲資料在MySQL和Redis之間做同步;
  1. 下載下傳 pip install scrapy-redis
  2. 下載下傳 redis資料庫 下載下傳穩定版
  3. 安裝教程
  4. 配置redis
'''[終端]cd到目錄'''
'''[終端]vi redis.conf 利用vim修改配置'''
【修改内容】
1.  bind 127.0.0.1 注釋掉(否則隻運作本機進行連結)
2.  protected-mode no  關閉保護模式  改為no
           
  1. 基于配置檔案進行開啟redis
終端: cd到目下的src檔案

./redis-server ../redis.conf

  1. 用戶端連結
終端:

redis-cli

如何強制關閉sever服務
終端 sudo pkill redis-server
  1. 建立項目

scrapy startproject 工程名 (建立項目)

  1. 建立crawlSpider爬蟲

scrapy genspider -t crawl 爬蟲名 起始url

至此已做好前期準備工作

setting配置

  • 其他電腦上爬必須配置redis!!
# 19行 請求身份僞裝user_agent 定義
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'

# 22行 是否遵從robots協定(君子協定)
ROBOTSTXT_OBEY = False


# redis管道配置
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400,
    # 'redisPro.pipelines.RedisproPipeline': 300,

}

# redis排程器配置
# 使用scrapy-redis元件的去重隊列
DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter'
# 使用scrapy-redis元件自己的排程器
SCHEDULER = 'scrapy_redis.scheduler.Scheduler'
# 是否允許暫停,以外關機後,重新開繼續爬
SCHEDULER_PERSIST = True


# 注意!!!
# 如果redis資料庫伺服器不在本機,那麼需要配置~~
# REDIS_HOST = 'redis伺服器ip'
# REDIS_PORT = 6379


           

代碼

# 父類替換
from scrapy_redis.spiders import RedisCrawlSpider  # 父類替換
from redisPro.items import RedisproItem    # 自己定義的item類

class QiubaiSpider(RedisCrawlSpider):  # 父類改為 RedisCrawlSpider
    name = 'qiubai'

    # 排程器隊列名稱
    redis_key = 'qiubaispider'  # 和 start_urls同理

    # 正則連結分頁 提取器
    link = LinkExtractor(allow=r'/pic/page/\d+')

    # 規則解析器接收到連結提取器的連結,後對連結發起請求,擷取内容根據規則進行解析
    # follow參數:是否自動在 被提取的頁面中繼續提 (自動去重)
    rules = (
        Rule(link, callback='parse_item', follow=True),
    )

    def parse_item(self, response):
        div_list = response.xpath('//div[@id="content-left"]/div')

        for div in div_list:
            img_url = 'https:' + div.xpath('.//div[@class="thumb"]/a/img/@src').extract_first()
            item = RedisproItem()
            item['img_url'] = img_url

            # 原始的scrapy管道不支援分布式!!!
            # 用redis架構封裝的管道!!!和排程器!! 在setting中配置

            yield item
           

1. 執行分布爬蟲方法

【終端】cd到

cd 項目/spiders/

【終端】允許爬蟲的py檔案

scrapy runspider 爬蟲檔案.py

執行後等待排程器配置設定

2. 把url扔到排程器隊列

【終端】【redis用戶端連接配接上後】

lpush 排程器隊列名(爬蟲中設定的) 起始url

繼續閱讀