1. 程式人生 > >一個簡單的分布式爬蟲

一個簡單的分布式爬蟲

key import ear pos -1 stat pro log 簡單的

下載scrapy-redis:

https://github.com/rmax/scrapy-redis

下載zip文件之後解壓

技術分享

建立兩個批處理文件,start.bat和clear.bat
start.bat的內容為redis-server redis.windows.conf
clear.bat的內容為redis-cli flushdb
雙擊start.bat啟動

技術分享

這樣就說明下好了,運行正常。

我們需要構建一個分布式爬蟲系統:由一個master爬蟲和slave爬蟲組成,master端部署了redis數據庫,master端從本地獲取redis中的url,slave端通過網絡連接訪問master端的redis數據庫,從中獲取url進行爬取,而redis數據庫本身的調度功能保證了master爬蟲和slave爬蟲不會爬取到重復的url。

技術分享

新建爬蟲項目,打開cmd:

scrapy startproject scrapyRedis


將src中的scrapy_redis這個文件夾復制到剛才新建的爬蟲項目中。

技術分享

技術分享

按照scrapy-redis git上的說明,創建爬蟲時,在新建的爬蟲文件中粘貼這段代碼到文件中

技術分享

繼承了RedisSpider這個類之後,爬蟲爬取的數據就會首先存入redis,接下來再從redis裏面讀取,就相當於是一個隊列,不斷地往redis裏面寫入url,然後從redis裏面讀取網址。就不再有start_urls了,取而代之的是redis_key,scrapy-redis將key從list中pop出來成為請求的url地址。

引用scrapy-redis之後,寫分布式爬蟲就和寫普通的scrapy爬蟲一樣,具體代碼如下:

#encoding:utf-8
from scrapy_redis.spiders import RedisSpider
class MySpider(RedisSpider):
    name = jobbole
    allowed_domains = ["blog.jobbole.com"]
    # 其實如果不設置以下語句,scrapy-redis也會默認生成一個redis-key“爬蟲名+:start_urls”
    redis_key = "jobbole:start_urls
"
   #slave端爬蟲註釋掉下面的內容
   start_urls = [‘http://blog.jobbole.com/all-posts/‘]
# 收集伯樂在線所有404的url以及404頁面數 handle_httpstatus_list = [404] def parse(self, response): """ 1. 獲取文章列表頁中的文章url並交給scrapy下載後並進行解析 2. 獲取下一頁的url並交給scrapy進行下載, 下載完成後交給parse """ # 解析列表頁中的所有文章url並交給scrapy下載後並進行解析 if response.status == 404: self.fail_urls.append(response.url) self.crawler.stats.inc_value("failed_url") post_nodes = response.css("#archive .floated-thumb .post-thumb a") for post_node in post_nodes: image_url = post_node.css("img::attr(src)").extract_first("") post_url = post_node.css("::attr(href)").extract_first("") yield Request(url=parse.urljoin(response.url, post_url), meta={"front_image_url": image_url}, callback=self.parse_detail) # 提取下一頁並交給scrapy進行下載 next_url = response.css(".next.page-numbers::attr(href)").extract_first("") if next_url: yield Request(url=parse.urljoin(response.url, post_url), callback=self.parse) def parse_detail(self, response): pass

在爬蟲的settings.py中,我們需要部署一下,master爬蟲和slave爬蟲其他地方都差不多,唯獨settings.py部署方式上有區別:

master爬蟲部署,訪問本地的redis數據庫:

REDIS_URL = None
REDIS_HOST = localhost
REDIS_PORT = 6379

slave爬蟲部署,需要訪問master端的redis數據庫:

REDIS_URL = redis://192.168.1.100:6379
REDIS_HOST = None
REDIS_PORT = None

新建一個方便pycharm運行的文件main.py

from scrapy import cmdline
cmdline.execute("scrapy crawl jobbole".split())

分別運行master,slave爬蟲一個簡單的分布式爬蟲就做好了。

一個簡單的分布式爬蟲