scrapy--分布式爬蟲

為什么使用分布式爬蟲

分布式:MongoDB的主從(一主多從)
分布式就比如說一個工廠生產(chǎn)線,有車間主人篮灼,車間主人分配任務給一個員工棚辽,和任務分給多個員工的時候兢孝,那是一個人還是多個人的效率高那

同理

  • 單機版爬蟲:

引擎把一個request請求任務放到調度器任務隊列浇坐,向服務器發(fā)起請求的時候會從調度器拿到request請求給下載器發(fā)起請求睬捶。


image.png
  • 多臺機器同時爬取數(shù)據(jù)大大提高了爬取的效率。當多臺機器同時進行爬蟲的時候我們需要一個資源管理的容器(調度器)取管理和分配任務


    image.png

提取的數(shù)據(jù)近刘、新提取的url會繼續(xù)構建一個request請求交給資源管理器

scrapy-redis

安裝:pip3 install scrapy-redis

  • Scrapy_redis在scrapy的基礎上實現(xiàn)了更多擒贸,更強大的功能,具體體現(xiàn)在:reqeust去重觉渴,爬蟲持久化酗宋,和輕松實現(xiàn)分布式
  • Scrapy-redis提供了下面四種組件(components):(四種組件意味著這四個模塊都要做相應的修改)

Scheduler
Duplication Filter
Item Pipeline
Base Spider

  • Scrapy_redis是工作流程:


    image.png

具體操作:

配置settings文件

# 1:設置去重組件,使用的是scrapy_redis的去重組件疆拘,而不是scrapy自己的去重組件了
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 2:設置調度器,使用scrapy——redis重寫的調度器寂曹,
# 而不再使用scrapy內(nèi)部的調度器了
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 3:可以實現(xiàn)斷點爬取=jondir哎迄,(請求的記錄不會丟失,會存儲在redis數(shù)據(jù)庫中隆圆,
# 不會清楚 redis的隊列漱挚,下次直接從redis的隊列中爬取)
SCHEDULER_PERSIST = True
# 4:設置任務隊列的模式(三選一):
# SpiderPriorityQueue數(shù)據(jù)scrapy-redis默認使用的隊列模式(
# 有自己的優(yōu)先級)默認第一種
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 使用了隊列的形式渺氧,任務先進先出旨涝。
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 采用了棧的形式:任務先進后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"
#5: 實現(xiàn)這個管道可以將爬蟲端獲取的item數(shù)據(jù),統(tǒng)一保存在redis數(shù)據(jù)庫中
ITEM_PIPELINES = {
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

# 6:指定要存儲的redis數(shù)據(jù)庫的主機IP
REDIS_HOST = '127.0.0.1'  # 遠端的ip地址

# 指定redis數(shù)據(jù)庫主機的端口
REDIS_PORT = 6379

使用scrapy-redis

  • 代碼執(zhí)行之后redis自動生成以下內(nèi)容:
"xcfCrawlSpider:requests":存儲的是請求的request對象
"xcfCrawlSpider:items":存儲的爬蟲端獲取的items數(shù)據(jù)
"xcfCrawlSpider:dupefilter":存儲的指紋(為了實現(xiàn)去重)
127.0.0.1:6379> type xcfCrawlSpider:requests
zset
127.0.0.1:6379> type xcfCrawlSpider:items
list
127.0.0.1:6379> type xcfCrawlSpider:dupefilter
set
  • 第一種情況:只設置settings文件侣背,并沒有實現(xiàn)分布式白华,只是實現(xiàn)了scrapy_redis的數(shù)據(jù)儲存和去重功能(只實現(xiàn)了存,沒有确纺汀)
import scrapy
from xiachufang.items import XiachufangTagItem,XiachufangCaiPuItem,XiachufangUserInfoItem


class XcfSpider(scrapy.Spider):
    name = 'xcf'
    allowed_domains = ['xiachufang.com']
    #start_urls = ['https://www.xiachufang.com/category/40076/?page=1']
    start_urls = ['http://www.xiachufang.com/category/']

    def start_requests(self):
        pass
  • 第二種:通用爬蟲
from scrapy_redis.spiders import RedisCrawlSpider
# 繼承自redis——crawlspider
class MyCrawler(RedisCrawlSpider):
    """Spider that reads urls from redis queue (myspider:start_urls)."""
    name = 'mycrawler_redis'
    # 缺少了start_url,多了redis_key:根據(jù)redis_key從redis數(shù)據(jù)庫中獲取任務
    redis_key = 'mycrawler:start_urls'

啟動爬蟲
爬蟲出現(xiàn)等待狀態(tài):我們需要在redis中設置起始任務:
redis輸入命令:lpush xcfCrawlSpider:start_urls http://www.xiachufang.com/category/

注意:在redis保存起始url的時候弧腥,windows系統(tǒng)寫url的時候不加引號,ubuntu如果輸入redis命令不生效潮太,url需要加引號

  • 第三種情況:實現(xiàn)scrpy.spider爬蟲的分布式爬蟲
  from scrapy_redis.spiders import RedisSpider
    #繼承自:RedisSpider
    class MyCrawler(RedisSpider):
        """Spider that reads urls from redis queue (myspider:start_urls)."""
        name = 'mycrawler_redis'
        allowed_domains = ['dmoz.org']
        #缺少了start_url,多了redis_key:根據(jù)redis_key從redis
        #數(shù)據(jù)庫中獲取任務
        redis_key = 'mycrawler:start_urls'

        def start_requests(self):
            """
            重寫這個方法的目的可以根據(jù)自己的需求發(fā)起請求
            :return:
            """
            for url in self.start_urls:
                yield scrapy.Request(url, callback=self.parse, dont_filter=True)
        def parse(self, response):
             pass
    啟動爬蟲:scrapy crawl 爬蟲名稱
    現(xiàn)象:爬蟲處于等待狀態(tài)
    需要設置起始任務:
    lpush mycrawler:start_urls 目標url

注意:實現(xiàn)scrpy.spider爬蟲的分布式爬蟲第一個回調方法必須是parse管搪,否則代碼無法運行虾攻。第三種情況同樣要注意redis的命令

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市更鲁,隨后出現(xiàn)的幾起案子霎箍,更是在濱河造成了極大的恐慌,老刑警劉巖澡为,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漂坏,死亡現(xiàn)場離奇詭異,居然都是意外死亡缀壤,警方通過查閱死者的電腦和手機樊拓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來塘慕,“玉大人筋夏,你說我怎么就攤上這事⊥寄兀” “怎么了条篷?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛤织。 經(jīng)常有香客問我赴叹,道長,這世上最難降的妖魔是什么指蚜? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任乞巧,我火速辦了婚禮,結果婚禮上摊鸡,老公的妹妹穿的比我還像新娘绽媒。我一直安慰自己,他們只是感情好免猾,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布是辕。 她就那樣靜靜地躺著,像睡著了一般猎提。 火紅的嫁衣襯著肌膚如雪获三。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天锨苏,我揣著相機與錄音疙教,去河邊找鬼。 笑死伞租,一個胖子當著我的面吹牛松逊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肯夏,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼经宏,長吁一口氣:“原來是場噩夢啊……” “哼犀暑!你這毒婦竟也來了?” 一聲冷哼從身側響起烁兰,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤耐亏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后沪斟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體广辰,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年主之,在試婚紗的時候發(fā)現(xiàn)自己被綠了择吊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡槽奕,死狀恐怖几睛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粤攒,我是刑警寧澤所森,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站夯接,受9級特大地震影響焕济,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盔几,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一晴弃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧逊拍,春花似錦肝匆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枯怖。三九已至注整,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間度硝,已是汗流浹背肿轨。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蕊程,地道東北人椒袍。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像藻茂,于是被迫代替她去往敵國和親驹暑。 傳聞我的和親對象是個殘疾皇子玫恳,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這個項目也是初窺python爬蟲的一個項目,也是我的畢業(yè)設計优俘,當時選題的時候京办,發(fā)現(xiàn)大多數(shù)人選擇的都是網(wǎng)站類,實在是...
    夢航韓語閱讀 2,999評論 2 37
  • 前幾天在公司電腦上裝了幾臺服務器,好多想嘗試的東西叶雹,今天财饥,參照崔慶才老師的爬蟲實戰(zhàn)課程,實踐了一下分布式爬蟲折晦,并沒...
    文哥的學習日記閱讀 2,134評論 0 7
  • 每天清晨钥星,他早早的就到小河邊散步。從春天到夏天筋遭,從秋天到了冬天……雪經(jīng)常會在空氣里招搖打颤,卻總是堆不起來。這個地方始...
    浪子谷木青閱讀 226評論 0 0
  • 夜涼如水漓滔,媽媽在燈下給我輔導作業(yè)编饺。橙黃的燈光暖暖的,把媽媽的側影勾勒得很清晰响驴。突然透且,我看到了媽媽頭上一根如雪...
    辛鳳鳴閱讀 289評論 0 1
  • E戰(zhàn)到底特訓營Day19 8月19日 天氣:陰晴不定 誰也不愿意從你邋遢的外表,去發(fā)現(xiàn)你內(nèi)心的美好豁鲤! 大氣的...
    雨停姐閱讀 546評論 1 0