分佈式爬蟲

基於python的 scrapy 框架,有個scrapy-redis的分佈式框中框架。
其實權力就是在redis中存放了兩個數據。
一個是請求隊列 ,一個是url的指紋集合。
那什麼是url指紋呢?
一個url有 請求方式(get,post) 請求參數,請求體.
通過sha1加密
指紋字符串=sha1(請求方式) + sha1(參數排序後的請求url) + sha1(請求體)
每次爬取url時,加密後會對比,如果爬取過,則不把url放入請求隊列中,未爬取時則放入請求隊列中.
請求隊列中存放的都是未爬取的url。 由於redis數據庫可以被多個機器訪問。多個機器訪問redis數據庫,每次讀取請求隊列中的一條url地址,讀取後就移除該url地址。 則實現分佈式爬取. emmm,個人電腦強大的話,同個項目開啓多個進程,也是可以的。

這裏就說明下 一些配置問題.
1.在setting.py 中需要指定請求調度器,設置去重算法,之舊話爬取,redis服務器配置.

SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
SCHEDULER_PERSIST = True
# REDIS_URL = "redis://192.168.1.1:6379"

2.爬蟲代碼文件中,繼承的父類不是Spider,改成RedisCrawlSpider,
設置讀取的請求隊列的鍵(開啓時,需要先去redis數據庫中設置該鍵,以及其對應的初始url地址),rules表示鏈接提取器

from scrapy.spiders import  Rule
from scrapy_redis.spiders import RedisCrawlSpide

class StudySpider(RedisCrawlSpider):
	redis_key = 'Study'
	rules = (
    Rule(LinkExtractor(restrict_xpaths=("//ul[@class='aaa']/li",)), follow=True,callback='parse_detail'),
	Rule(.....)
	)

Rule中參數說明:
LinkExtractor,提取的url,可以用xpaths,re方式提取,
follow代表,對於提取到的url是否還要再此url地址頁面中再進行一次鏈接提取器 ,
callback:指定 對於提取的url,對該url地址中的信息進行解析的函數。
後面的按正常的scrapy框架進行就可以了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章