日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍

發布時間:2025/3/21 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、分布式概念和作用
  • 二、Scrapy-redis
    • 2.1、redis的安裝與使用
    • 2.2、Redis Desktop Manager下載
    • 2.3、特點和架構
    • 2.4、安裝和使用
    • 2.5、redis中存儲的數據
    • 2.6、項目配置及項目代碼
  • 三、小案例:爬取豆瓣250電影信息(RedisSpider)
    • 3.1、spider文件
    • 3.2、settings文件
    • 3.3、pipelines文件

一、分布式概念和作用

分布式:一個業務分拆多個子業務,部署在不同的服務器上;是一種將任務分布在不同地方的工作方式。

作用:提高安全性和效率

分布式爬蟲

  • 默認情況下,我們使用scrapy框架進行爬蟲時使用的是單機爬蟲,就是說它只能在一臺電腦上運行,因為爬蟲調度器當中的隊列queue去重和set集合都只能在本機上創建的,其他電腦無法訪問另外一臺電腦上的內存和內容。
  • 分布式爬蟲實現了多臺電腦使用一個共同的爬蟲程序,它可以同時將爬蟲任務部署到多臺電腦上運行,這樣可以提高爬蟲速度,實現分布式爬蟲。

  • 二、Scrapy-redis

    2.1、redis的安裝與使用

    1、redis 下載地址
    https://github.com/MicrosoftArchive/redis/releases

    2、修改redis.windows.conf

    bind 127.0.0.1 -> bind 0.0.0.0

    3、啟動服務與數據庫

    啟動服務器:redis-server
    啟動數據庫:redis-cli

    4、使用
    redis基本使用可看我博客:學習筆記(十七)——redis(CRUD)
    python連接redis可看我博客:學習筆記(十九)——Python與數據庫交互(mysql、redis)


    2.2、Redis Desktop Manager下載

    這是一個redis的桌面工具,可以圖形化界面操作redis數據庫

    安裝教程:https://www.cnblogs.com/ttlx/p/11611086.html


    2.3、特點和架構

    scrapy_redis是一個基于Redis的Scrapy組件,用于scrapy項目的分布式部署和開發。

    特點:分布式爬取

    可以啟動多個spider對象,互相之間共享有一個redis的request隊列。最適合多個域名的廣泛內容的爬取。

    分布式數據處理:
    爬取到的item數據被推送到redis中,這意味著你可以啟動盡可能多的item處理程序。


    2.4、安裝和使用

    • 一般通過pip安裝Scrapy-redis:
    pip install scrapy-redis
    • scrapy-redis依賴:
    Python 2.7, 3.4 or 3.5以上 Redis >= 2.8 Scrapy >= 1.1
    • scrapy-redis的使用非常簡單,幾乎可以并不改變原本scrapy項目的代碼,只用做少量設置

    2.5、redis中存儲的數據

    • spidername:items

      list類型,保存爬蟲獲取到的數據item內容是json字符串。

    • spidername:dupefilter

      set類型,用于爬蟲訪問的URL去重內容,是40個字符的url的hash字符串

    • spidername:start_urls

      list類型,用于接收redis spider啟動時的第一個url

    • spidername:requests

      zset類型,用于存放requests等待調度。內容是requests對象的序列化字符串


    2.6、項目配置及項目代碼

    spider文件
    代碼作了簡單改動

  • 導出RedisSpider
  • 類繼承 RedisSpider (原來是繼承scrapy.Spider)
  • 注銷strat_urls 設置 redis_key = "db:start_urls" 開啟爬蟲鑰匙
    注意:使用時,記得提前在redis中添加。例如:lpush db:start_urls https://movie.douban.com/top250
  • settings文件
    需要配置:

    • 公共的調度器 SCHEDULER
    • 公共的過濾器 DUPEFILTER_CLASS
    • 公共存儲區域 redis

    常用設置:

    # 1.啟用調度將請求存儲進redis 必須 SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 2.確保所有spider通過redis共享相同的重復過濾。 必須 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#公共管道 ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline':300, # 'db250.pipelines.Db250Pipeline': 200, } # 3.指定連接到Redis時要使用的主機和端口。 必須 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 不清理redis隊列,允許暫停/恢復抓取。 # 可選 允許暫定,redis數據不丟失 SCHEDULER_PERSIST = True

    三、小案例:爬取豆瓣250電影信息(RedisSpider)

    (這里就用我博客:Scrapy框架(二)的案例來進行修改演示,以下僅列舉需要稍微修改的地方)

    注意:這里有一點要提示下,爬取的數據量要設置大些,不然可能效果不明顯。這里僅僅只是偽分布式

    3.1、spider文件

    from scrapy_redis.spiders import RedisSpider #導入RedisSpider #原本是繼承scrapy.Spider 現在改為RedisSpider class DbSpider(RedisSpider): name = 'db'# allowed_domains = ['movie.douban.com']# start_urls = ['https://movie.douban.com/top250'] #這個要注釋掉redis_key = 'db:start_urls' # 開啟爬蟲鑰匙page = 0def parse(self, response):all_mes = response.xpath('//div[@class="info"]')for mes in all_mes:film_name = mes.xpath('./div/a/span[1]/text()')[0].extract()score = mes.xpath('./div/div/span[2]/text()')[0].extract()director = mes.xpath('./div/p/text()')[0].extract().strip()item = Db250Item()item['film_name'] = film_nameitem['score'] = scoreitem['director'] = director# yield itemdetail_url = mes.xpath('./div/a/@href').extract()[0]yield scrapy.Request(detail_url,callback=self.get_detail,meta={'info':item})if response.meta.get('num'): #這個meta很關鍵 可以避免相互干擾self.page = response.meta["num"]self.page += 1if self.page == 6:returnpage_url = 'https://movie.douban.com/top250?start={}&filter='.format(self.page * 25)yield scrapy.Request(page_url,meta={'num':self.page})def get_detail(self,response):items = Db250Item()info = response.meta["info"]items.update(info)detail= response.xpath('//div[@class="indent"]//span[@property="v:summary"]/text()').extract()[0].strip()items['detail'] = detailyield items

    3.2、settings文件

    添加

    # 1.啟用調度將請求存儲進redis 必須 SCHEDULER = "scrapy_redis.scheduler.Scheduler"# 2.確保所有spider通過redis共享相同的重復過濾。 必須 DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"#公共管道 ITEM_PIPELINES = {'scrapy_redis.pipelines.RedisPipeline':300, #為了寫的redis 'db250.pipelines.Db250Pipeline': 200, #寫到txt文本方便我們查看 } # 3.指定連接到Redis時要使用的主機和端口。 必須 REDIS_HOST = 'localhost' REDIS_PORT = 6379 # 不清理redis隊列,允許暫停/恢復抓取。 # 可選 允許暫定,redis數據不丟失 SCHEDULER_PERSIST = True

    3.3、pipelines文件

    import json import pandas as pd from itemadapter import ItemAdapterclass Db250Pipeline:def open_spider(self,spider):self.f = open('film_mes1.txt','w',encoding='utf-8') def process_item(self, item, spider):data = json.dumps(dict(item),ensure_ascii=False)+'\n'self.f.write(data)return itemdef close_spider(self,spider):self.f.close()

    結果執行步驟
    1、準備(這兩文件代碼完全一模一樣):

    2、在終端分布運行這兩個文件(由于我還沒在redis設置鑰匙,所以這兩文件都處于等待狀態)

    3、再開啟一個終端(在redis寫入鑰匙)

    最后讓我們來看看結果是什么樣的(這里我爬取了6頁數據也就是150條):
    ① 首先我們先看看redis數據庫的內容,這里我們打開RDM:

    這里我們看到了數據庫的內容是一堆字符,但是我們可以從網上找JSON解析工具來進行解析(這里我隨便找了一個JSON在線解析)

    ②接下來,我們來看看txt文件的寫入情況

    兩個文件加起來剛好150條,說明我們的偽分布式是成功的

    總結

    以上是生活随笔為你收集整理的爬虫学习笔记(十二)—— scrapy-redis(一):基本使用、介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。