實屬課程需要,不然早就放棄在半路了。維持了斷續半個多月的 bug 調試,突然就實現了。很是欣慰。網上關於分布式爬蟲的都是一些介紹,實戰的不多並且都很相似,說的雲來霧去的,只是項目的流程。可能是項目一路順風,而我 bug 不斷。也好 記錄下來供大家參考。
關於 scrapy-redis 環境配置 以及框架流程就不進行敘述了。網上也是一大堆的內容。
主要內容有:
1. 如何去寫一個分布式爬蟲
首先創建一個普通的爬蟲,在保證此爬蟲能正常運行的基礎上進行修改,然后成為分布式爬蟲。我的項目是在linux上 redis 數據庫存儲分配 requests,我寫的是 bilibili 評論抓取,項目路徑如下:
a. 將 spiders --> bilibili.py 繼承類 由 scrapy.Spider 改為 RedisSpider 。
注釋掉: "allowed_domains" "start_urls" 添加: redis_key = 'bilibili:start_urls'
b. setting.py 修改
# redis 數據庫連接參數 REDIS_HOST = '遠程 ip' # windows setting # REDIS_HOST = 'localhost' # linux setting REDIS_PORT = 6379 REDIS_PARAMS = { 'password': '123456' # redis 數據庫設置密碼情況下進行設置 } # 指定使用 scrapy-redis 的調度器 SCHEDULER = 'scrapy_redis.scheduler.Scheduler' # 指定使用 scrapy-redis 的去重機制 DUPEFILTER_CLASS = 'scrapy_redis.dupefilter.RFPDupeFilter' # 指定排序爬取地址時的隊列 # 使用先進先出(FIFO)排序 SCHEDULER_QUEUE_CLASS = 'scrapy_redis.queue.SpiderPriorityQueue' # 設置斷點續傳 SCHEDULER_PERSIST = False DOWNLOADER_MIDDLEWARES = {
'spider_parallel.middlewares.SpiderParallelDownloaderMiddleware': 543, } ITEM_PIPELINES = { 'spider_parallel.pipelines.SpiderParallelPipeline': 300, 'scrapy_redis.pipelines.RedisPipeline': 400 }
2. 運行爬蟲的順序《此坑最深》
a. 先進入 linux 中 redis 數據庫
redis-cli
auth 123456
b. 服務器端運行spider:
scrapy crawl bilibili
這時看到程序一直在等待 redis 中插入 start_url
c. redis 命令行中執行:
lpush bilibili:start_urls https://api.bilibili.com/x/v2/reply?pn=1&type=1&oid=329437&sort=2
此連接即評論包的地址,oid 為視頻 av 號。你問我怎么知道的這個地址??? 爬蟲基礎在看看吧。(網頁 F12 加載的內容中查找)
d. windows 中運行 spider:
scrapy crawl bilibili
順序不對其中一個會一直處於等待監聽的狀態。還有就是我想讓 兩個spiders-->bilibili 中的 name 值不同,以此區分不同的評論是哪個爬蟲抓取的。不行,一定要相同。我的區分就是服務器端爬蟲存儲在服務器端的mongodb數據庫中,windows中爬蟲就存儲在windows中的mongodb數據庫中。存儲在同一個數據庫中也是可以的。區分時記錄爬蟲類,寫 __init__ () 函數繼承父類等內容。
沒問題就可以看到兩個爬蟲在共同抓取執行了。
項目已上傳至 git 。
原創不易,尊重版權。轉載請注明出處:http://www.cnblogs.com/xsmile/