基於scrapy框架的分布式爬蟲


分布式

  • 概念:可以使用多台電腦組件一個分布式機群,讓其執行同一組程序,對同一組網絡資源進行聯合爬取。

  • 原生的scrapy是無法實現分布式

    • 調度器無法被共享
    • 管道無法被共享
  • 基於 scrapy+redis(scrapy&scrapy-redis組件)實現分布式

  • scrapy-redis組件作用:

    • 提供可被共享的管道和調度器
  • 環境安裝:

    pip install scrapy-redis
    
  • 編碼流程:

    1.創建工程
    
    2.cd proName
    
    3.創建crawlspider的爬蟲文件
    
    4.修改一下爬蟲類:
        - 導包:from scrapy_redis.spiders import RedisCrawlSpider
        - 修改當前爬蟲類的父類:RedisCrawlSpider
        - allowed_domains和start_urls刪除
        - 添加一個新屬性:redis_key = 'xxxx'可以被共享的調度器隊列的名稱
        
    5.修改配置settings.py
        - 指定管道
            ITEM_PIPELINES = {
                    'scrapy_redis.pipelines.RedisPipeline': 400
                }
        - 指定調度器
    增加了一個去重容器類的配置, 作用使用Redis的set集合來存儲請求的指紋數據, 從而實現請求去重的持久化
            DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
            # 使用scrapy-redis組件自己的調度器
            SCHEDULER = "scrapy_redis.scheduler.Scheduler"
            # 配置調度器是否要持久化, 也就是當爬蟲結束了, 要不要清空Redis中請求隊列和去重指紋的set。如果是True, 就表示要持久化存儲, 就不清空數據, 否則清空數據
            SCHEDULER_PERSIST = True
        - 指定redis數據庫
            REDIS_HOST = '127.0.0.1'
            REDIS_PORT = 6379
            
     6.配置redis數據庫(redis.windows.conf)
        - 關閉默認綁定
            - 56Line:#bind 127.0.0.1
        - 關閉保護模式
            - 75line:protected-mode no
            
     7.啟動redis服務(攜帶配置文件)和客戶端
        - redis-server.exe redis.windows.conf
        - redis-cli
        
     8.執行工程
        - scrapy runspider spider.py
        
     9.將起始的url仍入到可以被共享的調度器的隊列(sun)中
        - 在redis-cli中操作:lpush sun www.xxx.com
        
     10.redis:
        - xxx:items:存儲的就是爬取到的數據
    

    爬蟲代碼:

    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from scrapy_redis.spiders import RedisCrawlSpider
    from fbsPro.items import FbsproItem
    class FbsSpider(RedisCrawlSpider):
        name = 'fbs'
        # allowed_domains = ['www.xxx.com']
        # start_urls = ['http://www.xxx.com/']
        
        redis_key = 'sun'     # 可以被共享的調度器隊列的名稱
        
        link = LinkExtractor(allow=r'type=4&page=\d+')
        rules = (
            Rule(link, callback='parse_item', follow=True),
        )
    
        def parse_item(self, response):
            tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
            for tr in tr_list:
                title = tr.xpath('./td[2]/a[2]/@title').extract_first()
                status = tr.xpath('./td[3]/span/text()').extract_first()
    
                item = FbsproItem()
                item['title'] = title
                item['status'] = status
    
                yield item
    
    
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM