python網絡爬蟲——分布式爬蟲


redis分布式部署

- 概念:可以將一組程序執行在多台機器上(分布式機群),使其進行數據的分布爬取。

    1.scrapy框架是否可以自己實現分布式?

  其一:因為多台機器上部署的scrapy會各自擁有各自的調度器,這樣就使得多台機器無法分配start_urls列表中的url。(多台機器無法共享同一個調度器)

  其二:多台機器爬取到的數據無法通過同一個管道對數據進行統一的數據持久出存儲。(多台機器無法共享同一個管道)

    2.基於scrapy-redis組件的分布式爬蟲

        - scrapy-redis組件中為我們封裝好了可以被多台機器共享的調度器和管道,我們可以直接使用並實現分布式數據爬取。

        - 實現方式:

            1.基於該組件的RedisSpider類

            2.基於該組件的RedisCrawlSpider類

    3.分布式實現流程:上述兩種不同方式的分布式實現流程是統一的

        - 3.1 下載scrapy-redis組件:pip install scrapy-redis

        - 3.2 redis配置文件的配置:

  - 注釋該行:bind 127.0.0.1,表示可以讓其他ip訪問redis   - 將yes該為no:protected-mode no,表示可以讓其他ip操作redis

        3.3 修改爬蟲文件中的相關代碼:

            - 將爬蟲類的父類修改成基於RedisSpider或者RedisCrawlSpider。

     注意:如果原始爬蟲文件是基於Spider的,則應該將父類修改成RedisSpider,如果原始爬蟲文件是基於CrawlSpider的,則應該將其父類修改成RedisCrawlSpider。

            - 注釋或者刪除start_urls列表,切加入redis_key屬性,屬性值為scrpy-redis組件中調度器隊列的名稱

        3.4 在setting中進行相關配置,開啟使用scrapy-redis組件中封裝好的管道

    ITEM_PIPELINES = {
          'scrapy_redis.pipelines.RedisPipeline':400,
          }

        3.5 在setting文件中進行相關配置,開啟使用scrapy-redis組件中封裝好的調度器

    # 使用scrapy-redis組件的去重隊列
    # 增加一個去重容器類的配置,作用是用Redis的set集合來存儲請求的指紋數據,從而實現請求去重的持久化
    DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    # 使用scrapy-redis組件自己的調度器
    SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    # 配置調度器是否要持久化,也就是當爬蟲結束了,要不要清空Redis中請求隊列和去重指紋的set。True:表示要持久化存儲,不清空數據;False清空數據
    SCHEDULER_PERSIST = True

        3.6 在setting文件中進行爬蟲程序鏈接redis的配置:

    REDIS_HOST = 'redis服務的ip地址'

    REDIS_PORT = 6379

    REDIS_ENCODING = ‘utf-8’

    REDIS_PARAMS = {‘password’:’123456’}

        3.7 開啟redis服務器:redis-server 配置文件

     攜帶配置文件啟動redis服務【windows終端切換到redis文件目錄】

     redis-server ./redis.windows.conf

        3.8 開啟redis客戶端:【windows終端中輸入】

     redis-cli

        3.9 運行爬蟲文件:scrapy runspider SpiderFile 

    pycharm終端進入spider文件目錄,輸入【scrapy runspider xxx.py】

        3.10 向調度器隊列中扔入一個起始url(在redis客戶端中操作):lpush redis_key屬性值 起始url

    windows終端輸入:lpush ts www.xxx.com

  3.11 redis客戶端【redis-cli】中顯示數據【items:xxx】

實例:陽光熱線

# 1.spider文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from scrapyRedisPro.items import ScrapyredisproItem
from scrapy_redis.spiders import RedisCrawlSpider

class ScrapyredisSpider(RedisCrawlSpider):
    name = 'scrapyredis'

    redis_key = 'ts' # 可以被共享的調度器中的隊列名稱
    rules = (
        Rule(LinkExtractor(allow=r'tupe=4&page=\d+'), 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]/text()').extract_first()
            net_friend = tr.xpath('./td[4]/text()').extract_first()
            item = SunlinecrawlItem()
            item['title'] = title
            item['net_friend'] = net_friend

            yield item # 提交的item必須保證提交到可以被共享的管道中
----------------------------------------------------------------------------------------
# 2.setting文件

BOT_NAME = 'scrapyRedisPro'

SPIDER_MODULES = ['scrapyRedisPro.spiders']
NEWSPIDER_MODULE = 'scrapyRedisPro.spiders'

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'

ROBOTSTXT_OBEY = False

LOG_LEVEL = 'ERROR'

ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline':400,
}

# 使用scrapy-redis組件的去重隊列
# 增加一個去重容器類的配置,作用是用Redis的set集合來存儲請求的指紋數據,從而實現請求去重的持久化
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"

# 使用scrapy-redis組件自己的調度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"

# 是否允許暫停
# 配置調度器是否要持久化,也就是當爬蟲結束了,要不要清空Redis中請求隊列和去重指紋的set。True:表示要持久化存儲,不清空數據;False清空數據
SCHEDULER_PERSIST = True

# 指定ip和port
REDIS_HOSR = '127.0.0.1' #【redis服務器ip地址】【真實ip】
REDIS_PORT = 6379

# 當前請求數量【開啟32個線程】
CONCURRENT_REQUESTS = 32
----------------------------------------------------------------------------------------
# 3.items文件

import scrapy

class ScrapyredisproItem(scrapy.Item):

    title = scrapy.Field()
    net_friend = scrapy.Field()

 

對應redis終端指令

  開啟redis服務器:redis-server 配置文件
  D:\redis>redis-server.exe ./redis.windows.conf

  開啟redis客戶端
  D:\redis>redis-cli

  查看redis數據庫當前數據

  127.0.0.1:6379> keys *
  (empty list or set)

  向調度器隊列中扔入一個起始url(在redis客戶端中操作)
  127.0.0.1:6379> lpush ts http://wz.sun0769.com/index.php/question/questionType?type=4&page=

 


免責聲明!

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



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