999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Scrapy的分布式網頁及文件爬蟲應用的研究

2020-03-02 01:14:16張捷郝建維李歡歡
科技創新導報 2020年21期

張捷 郝建維 李歡歡

摘? 要:隨著移動互聯網、大數據以及人工智能時代的到來,數據在整個互聯網體系中的地位顯得越來越重要,而數據體量的大小對大數據的分析以及人工智能的最終學習成果也有著深刻影響。但是目前的現狀是,全世界范圍內的大多數企業都深陷數據不完善或者數據體量太小的窘境,尤其對新創企業和小微型企業來說,這個已經成為了它們生存和發展的桎梏。因此,能夠從無時無刻抓取大量數據的爬蟲就顯得尤為必要,故而我們深入地研究網絡爬蟲是非常有必要的。本文將會通過基于twisted的異步爬蟲框架Scrapy,對網絡爬蟲進行研究,并實現抓取互聯網頁數據以及文件文本數據的分布式策略。

關鍵詞:Scrapy? Python? 爬蟲? 分布式? 文件? 網頁

中圖分類號:TP391.3 ? ? ? ? ? 文獻標識碼:A 文章編號:1674-098X(2020)07(c)-0149-05

Abstract: With the advent of the mobile Internet, big data and artificial intelligence era, the status of data in the entire Internet system is becoming more and more important, and the amount of data has a profound impact on the analysis of big data and the final learning results of artificial intelligence. However, the current status quo is that most companies around the world are deeply mired in data imperfections or too small data volume, especially for new ventures and small and micro enterprises, which have become their survival and development. Therefore, it is especially necessary to be able to crawl large amounts of data from time to time, so it is very necessary for us to study web crawlers in depth. This article will explore the layer web crawler through the twisted asynchronous crawler framework Scrapy, and implement the strategy of crawling Internet page data and file text data.

Key Words: Scrapy;Python;Crawler;Distributed;File;WebPage

1? 引言

隨著互聯網在人類經濟社會中的應用日益廣泛,其所涵蓋的信息規模呈指數增長,信息的形式和分布具有多樣化、全球化特征。專業化的信息獲取和加工需求,正面臨著巨大的挑戰。如何獲取互聯網中的有效信息?這就促進了“爬蟲”技術的飛速發展。

傳統的爬蟲對于網頁內容信息的關注遠遠大于其他形式的存儲的信息。然而,互聯網作為人類巨大的數據寶庫,并不僅僅只存有網頁內容信息,還存在極其龐大的各種各樣格式的文件信息。

本文將以Scrapy為框架,對以文件和網頁進行抓取并進行內容解析的分布式爬蟲進行研究和設計。

2? 網絡爬蟲

網絡爬蟲,是一種按照一定的規則,自動地抓取互聯網信息的程序或者腳本。網絡爬蟲一般從一個url開始,通過獲取網頁內容,并識別網頁上的其它url,放入url隊列中,再不斷地從隊列中獲取url重復上述過程,直至url集合為空。

對于爬蟲的分類,我們可以從爬蟲面向的對象和url入隊方式的不同,分為以下四種。

(1)通用網絡爬蟲,又稱為全網爬蟲,一般搜索引擎采用這種類別的爬蟲。通用爬蟲可以以一定數量的種子url開始,對整個互聯網的網絡信息進行采集,供搜索引擎使用。這類爬蟲的爬取范圍和數量巨大,對速度和存儲有著很高的要求。基于這兩點要求,通用爬蟲一般會采取一定的策略,常見策略有:廣度優先策略和深度優先策略。

①廣度優先策略:其基本原理是按照深度由小到大的順序,依次訪問url,直到沒有url可以訪問為止。爬蟲在訪問一條分支后返回到最后url的上一級搜索其它url,直至所有的url訪問完畢。這種策略一般使用于垂直搜索。

②深度優先策略:這種策略將所有url劃分為多層,當同一層的鏈接訪問完畢后才深入到下層鏈接進行訪問,直到所有的鏈接訪問完畢。這種策略對爬蟲訪問的深度能夠很好控制,防止爬蟲進入過深的分支。

(2)聚焦網絡爬蟲,又叫定向爬蟲,是指有選擇性地爬取指定內容或特定鏈接的網絡爬蟲。聚焦網絡爬蟲引入了評分模塊,針對網頁內容或鏈接信息對其進行評分,不同的評分,訪問的優先級也不同。

(3)增量式網絡爬蟲是指只爬取新產生的或發生內容改變的網頁的爬蟲,對已經爬取的并且沒有內容變化的網頁不進行采集。

(4)深層網絡爬蟲一般是指爬取深層網絡頁面的網絡爬蟲。深層網絡頁面是相對于能夠任意訪問的表層網絡頁面而言的,一般類似于用戶需要登錄或需要提交關鍵字才能訪問的頁面,我們就稱之為深層網絡頁面。

3? Scrapy原理介紹

Scrapy是Python開發的一個以twisted異步網絡通信為核心的網絡爬蟲框架。因為其靈活性和易擴展性讓Scrapy廣為人們使用,且用途非常廣泛,可以用于數據挖掘、監測和自動化測試等。

Scrapy的總體架構可以分為以下部分:

(1)引擎(Engine),主要負責Spider、Downloader、Itempiplien以及Scheduler之間通信,信號和數據傳遞。

(2)調度器(Scheduler),接收Engine傳遞過來的Request請求,將請求整理,入隊,并且在Engine需要Request的時候,將Request傳遞給Engine。

(3)下載器(Downloader),下載Engine推送的Request,并將下載好的Response返回給Engine。

(4)爬蟲(Spiders),接收Engine推送的Response,解析Reponse內容,并根據內容獲取Item需要的數據,并且提取頁面相關鏈接,重新生成Request推送給Engine,由Engine交由Scheduler。

(5)項目管道(Pipeline),負責處理爬蟲從網頁中抽取的實體,并對實體進行業務操作。

(6)下載器中間件(Downloader Middewares),介于Engine和Downloader之間,主要處理兩者之間的請求和響應。

(7)爬蟲中間件(Spiders Middewares),介于Engine和Spider之間,主要工作是處理Spider的響應輸入和請求輸出。

(8)調度器中間件(Scheduler Middewares),介于Scrapy引擎和調度之間的中間件,處理從Scrapy引擎發送到調度的請求和響應。

5種核心組件極其中間鍵通過異步網絡進行通信,各自完成自己的功能而不依賴于其他組件的裝填。正是這種通過異步網絡通信的低耦合架構,讓Scrapy在解析url,下載內容,實體處理上有著非常高的效率。

4? 分布式網頁及文件爬蟲解決方案

雖然異步網絡通信架構使Scrapy能在短時間訪問大量的鏈接,但是相較于互聯網龐大的數據體量而言,還是顯得力不從心。于是我們考慮設計分布式的爬蟲架構來滿足現在的互聯網的需求。

我們可以使用Scrapy-Redis組件來擴展Scrapy,Scrapy-Redis 是為了更方便地實現 Scrapy 分布式爬取而提供的一些以 Redis 為基礎的組件。然而Scrapy-Redis對Redis去重隊列的策略仍存在著一些弊端,導致隊列無限地增長。如何優化Scrapy-Redis,并實現網頁和文件的爬取將是接下來的主要內容。

4.1 Scrapy-Redis的去重優化

Scrapy去重在配置文件中去重是默認開啟, 主要通過RFPDupeFilter類進行去重,通過查看RFPDupeFilter類源碼,可看到去重的核心是request_seen方法,其代碼如下:

def request_seen(self, request)

fp = request_fingerprint(request)

added = self.server.sadd(self.key, fp)

return not added

其中request_fingerprint方法對requset進行sha1加密,將加密過后的密文存儲到Redis的dupefilter去重隊列中,當Spider之后每次獲取網頁上連接生成request后,再一次通過requset進行加密,并與dupefilter隊列中的數據進行比較,如果發現有重復數據,則當前request不進入Scheduler的url隊列中。然而,dupefilter隊列會隨著訪問的鏈接增長而持續增長,這樣就會消耗大量的內存資源和比較request的時間資源。

Bloom filter 是由 Howard Bloom 在1970年提出的二進制向量數據結構,它具有很好的空間和時間效率,被用來檢測一個元素是不是集合中的一個成員。如果檢測結果為是,該元素不一定在集合中;但如果檢測結果為否,該元素一定不在集合中。因此Bloom filter具有100%的召回率。利用Bloolm的特性,我們可以優化scrapy的去重隊列。

通過重寫request_seen()方法,使用Redis的Bloolm類對入隊過程進行改寫,Bloolm filter的特性快速的判斷request是否存在,如果存在,則不將request放入url隊列。通過重寫后代碼如下:

def request_seen(self, request):

fp = request_fingerprint(request)

if self.bf.isContains(fp):? ? # 如果已經存在

return True

else:

self.bf.insert(fp)

return False

至此,我們通過Bloolm filter改寫后的去重組件,能夠極大地提升我們的去重效率和內存資源。

4.2 網頁和文件的策略

4.2.1 網頁爬蟲策略

Scrapy爬取數據過程可以分為定義實體(Item)、抽取內容(Spider),存儲實體(Pipeline)三個部分,通過這三個部分,能夠快速地實現一個網頁爬蟲,這也是Scrapy框架流行的重要原因。

(1)Item是保存爬取到的數據容器,使用方法和Python字典類似。根據從網頁上獲取到的數據對Item進行統一建模。從而在Item中定義相應的字段field。示例代碼如下:

class CrawlerItem(scrapy.Item):

#標題

title = scrapy.Field();

#內容

content = scrapy.Field();

#鏈接

hrefs = scrapy.Field();

#url

url = scrapy.Field();

(2)Sprider的parse方法是抽取內容的主要方法,Spider類必須繼承scrapy-redis. spiders.RedisSpider類以實現分布式采集,Spider采集過程是,首先從Redis的start_url中讀取種子url,由Download下載返回response,Engine會將response傳遞給spider的parse方法,由parse方法對reponse進行處理,并返回request生成器和item生成器。抽取頁面內容時,可以使用xpath模塊。Scrapy內置對xpath支持,能夠快速地提取頁面內容。代碼如下:

def parse(self, response):

url = response.url;

item = CrawlerItem();

item['title'] = response.xpath(

'//head/title/text()').extract();

item['content'] =self._get_content(

response.body.decode(response.encoding))

item['url'] = response.url;

item['hrefs'] = self._get_href(response);

yield item;

for href in item['hrefs']:

yield Request(url= href,

callback=self.parse);

(3)Pipeline是數據存儲的管道,parse提取的Item由Enginec傳遞給Pipeline,調用Pipeline的process_item方法對Item進行存儲操作,示例如下:。

def process_item(self, item, spider);

#處理數據

logger.info(item['url']+'? has crawled');

通過這三個部分的簡單實現,一個能夠爬取網頁的標題,內容,頁面鏈接以及當前頁面的通用型網頁爬蟲產生了。常見的互聯網頁面就可以通過該爬蟲進行采集。

4.2.2 文件爬蟲策略

文件爬蟲的策略整個流程與與網頁爬蟲的策略相似,而且Scrapy支持FTP形式的文件爬蟲,但是Scrapy的FTP并不能對整個文件節點的文件進行下載,只能手動地推送文件的url,對該url的單個文件進行下載。而我們希望通過配置FTP的根節點,來采集整個FTP節點的所有文件,并解析文件內容。我們對原Scrapy的FTP爬蟲框架進行優化,以支持FTP節點的整體下載。

Scrapy主要通過FTPDownloadHandler類對文件進行下載,該類中由download_request方法生成FTP連接生成器對象,gotClient方法通過生成器對象來獲取FTP的客戶端,并通過_build_response私有方法下載文件,如果文件出現錯誤,則由_failed方法返回錯誤內容。

gotClient方法只能下載文件,如果url為文件夾路徑,則會返回錯誤信息。gotClient源碼如下:

def gotClient(self, client, request, filepath):

self.client = client

protocol = ReceivedDataProtocol

(request.meta.get("ftp_local_filename"))

return client.retrieveFile(filepath, protocol)

.addCallbacks(callback=self._build_response,

callbackArgs=(request, protocol),

errback=self._failed,

errbackArgs=(request,))

通過集成FTPDownloadHandler類,重寫gotClient方法,我們可以實現當url為文件夾路徑時,獲取該路徑下的文件名,并將文件名放入response中返回,交由spider處理,當url為文件路徑時,下載文件,返回response。另外,通過對response.meta.file_type進行設置,當url為文件夾時設置為dir,為文件時設置為file來判別url的類型。實現代碼如下:

def gotClient(self, client, request, filepath):

self.client = client

protocol = ReceivedDataProtocol(request.meta.get("ftp_local_filename"))

if (not 'file_type' in request.meta) or ('dir' in request.meta['file_type']):

return client.list(filepath, protocol)\

.addCallbacks(callback=self._build_response,

callbackArgs=(request, protocol),

errback=self._failed,

errbackArgs=(request,))

else:

return client.retrieveFile(filepath, protocol)\

.addCallbacks(callback=self._build_response,

callbackArgs=(request, protocol),

errback=self._failed,

errbackArgs=(request,))

Spider獲取到reponse后,判斷response.meta.file_type,如果為dir,則解析reponse的文件名,并生成相應的url,包裝成Request放入Scheduler的url隊列;如果為file,則抽取相應內容,存儲實體。spider代碼如下:

def parse(self, response):

item = CrawlerItem();

url = response.url;

ftp_user = response.meta['ftp_user'];

ftp_password = response.meta['ftp_password'];

#當文件為文件夾或者file_type 為None時,獲取當前文件夾下的所有文檔及文件夾

if (not 'file_type' in response.meta) or ('dir' in response.meta['file_type']):

content = response.body.decode('latin-1')

line = content.split('\r\n');

re_fileName = re.compile('[^\s]+', re.I)

for files in line:

#判斷目錄

#通過空格分隔信息

infos = re_fileName.findall(files);

if not infos:

continue;

file_name = infos[-1];

if '

' in files:

req = Request( url = url+'/'+file_name,meta={'file_type':'dir','ftp_user':ftp_user,'ftp_password':ftp_password},callback=self.parse,dont_filter=True);

else:

req = Request( url = url+'/'+file_name,meta={'file_type':'file','ftp_user':ftp_user,'ftp_password':ftp_password},callback=self.parse);

yield req;

logger.debug(response.body.decode('gbk')+' has puted in quee');

else:

util = FileUtil();

file_name = url.split('/')[-1];

item['content'] =util.get_content(file_name,response.body);

url = parse.unquote(url);

title = url.split('/')[-1];

item['title'] = title.encode(encoding='latin-1').decode('gbk');

item['url'] = url;

yield item;

至此,一個FTP節點爬蟲就實現了,我們可以通過配置根節點url到start_url隊列中,來采集整個FTP節點的文件內容。

5? 結語

Scrapy雖然有著擴展性好。易于開發的特點,但是單節點的爬取方式已經不能適應信息指數式增長大數據時代,而集成了scrapy-redis組件的Scrapy雖然能夠分布式部署,但是內存會持續消耗,并且速度也會逐漸降低。

優化后的scrapy-redis,大大降低了內存使用量,在速度上也有所提升。另外,文件節點整體爬取的問題也得到了有效的解決,能夠滿足現有互聯網信息爬取的大部分需求。

參考文獻

[1] 李光敏,李平,汪聰.基于Scrapy的分布式數據采集與分析——以知乎話題為例[J].湖北師范大學學報:自然科學版,2019,39(3):1-7.

[2] 華云彬,匡芳君.基于Scrapy框架的分布式網絡爬蟲的研究與實現[J].智能計算機與應用,2018,8(5):46-50.

[3] 陶興海.基于Scrapy框架的分布式網絡爬蟲實現[J].電子技術與軟件工程,2017(11):23.

[4] 李代祎,謝麗艷,錢慎一,等.基于Scrapy的分布式爬蟲系統的設計與實現[J].湖北民族學院學報:自然科學版,2017,35(3):317-322.

[5] 舒德華.基于Scrapy爬取電商平臺數據及自動問答系統的構建[D].武漢:華中師范大學,2016.

[6] 樊宇豪.基于Scrapy的分布式網絡爬蟲系統設計與實現[D].成都:電子科技大學,2018.

[7] 李代祎,謝麗艷,錢慎一,等.基于Scrapy的分布式爬蟲系統的設計與實現[J].湖北民族學院學報(自然科學版),2017,35(3):317-322.

[8] 張靖宇,梁久禎.中文網頁分布式并行索引的設計與實現[J].微計算機信息,2010,26(15):127-128,191.

主站蜘蛛池模板: 无码一区中文字幕| 日本午夜在线视频| 日韩精品无码不卡无码| 国产精品女熟高潮视频| 99r在线精品视频在线播放| 亚洲中文字幕在线观看| 中文成人无码国产亚洲| 又大又硬又爽免费视频| 一本一道波多野结衣av黑人在线| 国产成人亚洲精品色欲AV| h视频在线播放| 日韩最新中文字幕| 九九九九热精品视频| 欧美日韩精品综合在线一区| 国产一区二区在线视频观看| 亚洲欧洲免费视频| 亚洲国产看片基地久久1024 | 欧美综合成人| 99爱视频精品免视看| 四虎影视8848永久精品| 日韩一区二区三免费高清| 国产高颜值露脸在线观看| 国产AV无码专区亚洲A∨毛片| 欧美日韩另类国产| 2020亚洲精品无码| 亚洲精品无码专区在线观看| 无码免费试看| 国产丝袜一区二区三区视频免下载| 最新加勒比隔壁人妻| 青青青视频蜜桃一区二区| 人妻无码一区二区视频| 精品福利网| 免费毛片在线| 亚洲黄色视频在线观看一区| 2022国产91精品久久久久久| 中文精品久久久久国产网址| 日日拍夜夜操| 久久美女精品国产精品亚洲| 毛片久久网站小视频| 综合久久五月天| 亚洲中久无码永久在线观看软件 | 日韩亚洲综合在线| 国产女人水多毛片18| 全部免费特黄特色大片视频| 亚洲人成电影在线播放| 在线亚洲小视频| 国内精品久久人妻无码大片高| 色老头综合网| 亚洲人精品亚洲人成在线| 日本一区二区三区精品AⅤ| 国产伦片中文免费观看| 91伊人国产| 亚洲系列无码专区偷窥无码| 精品第一国产综合精品Aⅴ| 她的性爱视频| 色久综合在线| 精品国产欧美精品v| 日本福利视频网站| 日韩精品少妇无码受不了| 一本一本大道香蕉久在线播放| 日韩a级毛片| 亚洲欧美激情小说另类| 男女男免费视频网站国产| 亚洲成人播放| 久久九九热视频| 欧美综合一区二区三区| 2022精品国偷自产免费观看| 国产波多野结衣中文在线播放| 久久综合干| 在线精品欧美日韩| 久久精品亚洲中文字幕乱码| 中文字幕欧美日韩| 九九视频免费在线观看| 国产亚洲第一页| 四虎永久在线视频| 亚洲天堂啪啪| 亚洲人成网站观看在线观看| 黄色三级毛片网站| 成年A级毛片| 1024国产在线| 毛片免费观看视频| 欧美成人午夜影院|