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

基于Scrapy框架的分布式網絡爬蟲的研究與實現

2018-10-20 11:01:44華云彬匡芳君
智能計算機與應用 2018年5期
關鍵詞:數據庫用戶信息

華云彬 匡芳君

Abstract: Aiming at the problems of offensive, defensive, and crawling efficiency in the development of Web crawlers, the paper focuses on analyzing the working principle and implementation of the distributed crawler based on the Scrapy framework, as well as some distributed operating principles, anti-reptiles, and the algorithm of duplicate removal, Redis database, MongoDB database, etc., designs and implements a distributed Web crawler based on Scrapy framework. Finally, through comparative test and analysis of the crawler, it is concluded that how to improve crawling efficiency of the crawler and avoid the anti-crawler strategy of the site.

引言

隨著互聯網的發(fā)展,大數據時代的到來,普通搜索引擎已無法滿足人們對信息獲取的需求,網絡爬蟲應運而生,如百度的網絡爬蟲Baiduspider、谷歌的網絡爬蟲Googlebot等[1],也陸續(xù)涌現了很多成熟的爬蟲框架,如本文使用的Scrapy[2]。但其從催生傳承演變至今,爬蟲開發(fā)也已面臨著一些問題,對此可闡釋分析如下。

(1)網站與爬蟲之間的攻防問題 [3]。針對爬蟲無限制地爬取所有網頁的狀況,制定了robots協議[4],但由于該協議并未成為一個嚴謹規(guī)范,只是約定俗成的技術守則,故而不能真正地阻止網絡爬蟲,因此出現了反爬蟲技術。本文將使用分布式技術來解決這個問題。

(2)統一資源地址的去重問題。在爬取的過程中,爬蟲經常會遇到相同的URL,如果再次爬取,就造成了資源的浪費。普遍采取的方案是使用md5等哈希后存入set。而本文將使用BloomFilter算法[5]來解決去重問題。

(3)爬蟲爬取效率問題。如今的爬蟲普遍存在爬取效率較低的問題,為了解決該問題,本文的爬蟲采用了分布式[6]、代理池等技術。

綜上可知,本文重點圍繞前述問題,研究和實現基于Scrapy框架的分布式網絡爬蟲。

1相關關鍵技術

1.1網絡爬蟲技術

網絡爬蟲,又稱為網絡蜘蛛,是一種能夠根據程序設計者所設計的規(guī)則,自動抓取特定網頁信息的程序。網絡爬蟲始于一個或多個事先確定的被稱為種子的URL地址,如果能夠訪問則下載其中的內容,而后利用程序設計者開發(fā)的解析模塊,提取其中所需要的數據或者其它的URL鏈接,并將獲取到的URL鏈接加入到待爬取列表中,重復這一步驟,直至待爬列表為空。網絡爬蟲按照實現原理可分為通用網絡爬蟲、增量式網絡爬蟲、聚焦網絡爬蟲3種類型[7]。本文主要研究聚焦型網絡爬蟲。

目前,網絡爬蟲一般分為深度優(yōu)先和廣度優(yōu)先2種爬取策略算法[8]。前者一般用棧實現,即一個爬蟲程序爬取一個HTML文件后,只要找到該文件中的一個鏈接,就立即去爬取該鏈接并重復執(zhí)行深度優(yōu)先算法,直至到達終點后,重新返至可前溯的HTML文件中找尋其它鏈接。后者則一般用隊列實現,即一個爬蟲程序爬取一個HTML文件后,找到該文件中所有鏈接,再存入隊列中,然后根據隊列中鏈接繼續(xù)爬取并重復執(zhí)行廣度優(yōu)先算法。本文網絡爬蟲采用廣度優(yōu)先算法。

1.2Scrapy框架技術

Scrapy是Python開發(fā)的一個高層次的、快速的Web抓取框架[9],用于抓取網頁并從中提取結構化數據,已廣泛應用于自動化測試與數據挖掘領域研究中。Scrapy框架主要由引擎(Engine)、調度器(Scheduler)、Spiders、下載器(Downloader)、Item Pipeline、中間件(Middleware)組成,設計架構即如圖1所示。

1.3Redis分布式爬蟲相關技術

分布式爬蟲,又稱集群爬蟲。分布式爬蟲可實現多臺機器同時爬取,爬取速度快、可輕松避開對方的反爬蟲機制對IP的封鎖檢測。網絡爬蟲是一個偏向IO的任務,研究認為分布式爬蟲主要考慮爬蟲任務的去重、爬蟲任務的統一調度和爬蟲的速度、存儲等問題,而Redis則能有效解決這些問題。Redis是一個非關系型數據庫,支持key-value和list、set、hash等數據結構,同時Redis也是一個內存數據庫,具備著讀取速度快的優(yōu)點。本文研究采用了基于Scrapy框架和Redis的分布式爬蟲,爬蟲調度任務則采用Python的scrapy-redis模塊實現。

1.4爬蟲去重BloomFilter算法

網絡爬蟲的效率至關重要,而爬蟲的URL鏈接去重則是影響爬蟲效率的主要因素之一。在實際應用中,爬蟲在爬取數據時,往往會爬取到許多重復的URL 鏈接,如果再對這些鏈接進行爬取,就會造成內存及帶寬資源的極大浪費,從而降低爬蟲效率。針對這種情況,研究中集結提煉了數種爬蟲的去重策略,可分述如下。

(1)將URL保存到MySQL等數據庫中,每次爬取之前訪問數據庫查詢,效率低。

(2)將URL保存到set中,訪問速度快,但內存占用巨大,且不利于持久化。

(3)將URL使用md5等算法哈希后存入set中。Scrapy框架默認使用的即為該方法。

(4)使用BitMap方法,將URL通過hash進行映射。

(5)使用BloomFilter算法對BitMap方法提供改進。

2分布式網絡爬蟲的設計與實現

2.1網絡爬蟲的功能需求分析

本文主要研究基于Scrapy框架的分布式網絡爬蟲。為了更好測試爬蟲的效率,本爬蟲并沒有采取常見的爬取目標網頁,而是采用了API接口的形式進行數據的爬取。爬取的目標選擇了知乎網(www.zhihu.com)的公開用戶信息,通過API接口的形式爬取大量知乎用戶的基本信息。這里,關于該網絡爬蟲抓取流程的分析將展開如下探討論述。

首先為了獲取知乎的用戶信息API接口,使用了Chrome自帶的抓包工具對從知乎上隨機選取的一名用戶的主頁進行了分析,最終成功提取到了用戶信息的API接口(https://api.zhihu.com/people/xxxxxx,xxxxxx為用戶ID),該API返回的信息為JSON格式。這樣一來,已爬取得到了該用戶的信息。然而API接口中,卻仍未得到用戶的ID。為了能大批量地獲取用戶的ID,通過對知乎的深入研究后發(fā)現,知乎的每位用戶主頁中,有一個用戶關注他人列表及一個他人關注用戶的列表。如此再經過抓包工具的分析,就成功獲取到了這2個列表的API接口。這2個接口的API中有一個參數為token值,該值是唯一的,可以從前述的用戶信息返回的JSON數據中獲取到。至此,就可以大批量地爬取知乎用戶信息。

2.2數據爬取的流程設計

分布式網絡爬蟲根據設定的初始URL地址去爬取數據,使用廣度優(yōu)先算法完成數據的獲取任務直至符合網絡爬蟲結束的條件。本項目中,網絡爬蟲首先根據給定的初始用戶API接口去爬取,獲取數據后解析得到用戶的token值,然后根據token值去爬取該用戶的關注他人列表及一個關注該用戶的他人列表,獲取這2個列表中所有用戶的ID值,再以此為基礎去爬取用戶的基本信息。重復以上步驟,直至網絡爬蟲結束終止本次爬取任務。知乎分布式網絡爬蟲的設計流程可如圖2所示。

2.3反反爬的策略設計與實現

很多網站為了防止網絡爬蟲爬取數據,都紛紛出臺了一定的策略來避免爬蟲的爬取。然而,在實際應用中,在爬蟲與反爬蟲的對弈中,爬蟲終會勝利。結合本項目的知乎分布式爬蟲,研發(fā)定制了一些本爬蟲所采用的反反爬蟲措施,可解析描述如下。

(1)設置User-Agent。這是網站上普遍采取的反爬蟲措施,可以直接通過更改header中的User-Agent值來達成目的。在本項目中,使用了fake-useragent模塊來動態(tài)更改User-Agent。

(2)設置爬蟲爬取間隔。很多網站一般都會檢測一個IP的單位時間內的訪問次數,如果某用戶訪問速率偏高,就容易導致IP被封。為了解決這個問題,可以設置爬蟲的爬取間隔(如最簡單的time.sleep(1)),還可以設置爬蟲爬取一段時間后、添入一個睡眠機制等。

而關于方法(2),設置爬蟲爬取間隔,雖然可以有效避免被封禁IP,但在實際項目中,考慮到需要大規(guī)模地爬取數據,爬取的效率尤為重要,而設置爬取間隔會大大地降低效率。因此在本項目中,采用了更換代理IP的方法進行解決,一旦IP被封禁,就切換代理IP。本項目維護了一個IP代理池(使用Requests庫定期爬取網絡上的免費代理IP,并定時檢測可用性。IP存放在Redis數據庫set中,有利于去重及方便調用)。除了前文陳述的本項目中用到的幾種反反爬蟲措施外,還有很多反反爬蟲策略,如模擬登錄使用Cookie、驗證碼識別、PhantomJS+Selenium(數據JS后期渲染)、使用JS的加密庫生成動態(tài)Token等。

2.4爬蟲分布式方案的設計與實現

本項目的分布式爬蟲采用Scrapy框架加Redis數據庫,分布式調度采用scrapy-redis模塊。本項目把分布式爬蟲主要分為Master端和Slave端2個部分。其中,Slave端重點是從Master端獲取任務進行爬取,在爬取的同時也生成新的任務,并將任務傳遞給Master端,爬取到的數據則保存到Master端的MongoDB中。而Master端只有一個Redis數據庫和一個MongoDB數據庫,Redis就是對Slave端提交的任務進行去重及放入待爬取的隊列,MongoDB則是用來存儲獲取到的用戶信息[10]。本項目分布式策略邏輯可如圖3所示。

2.5Scrapy各功能模塊設計與實現

2.5.1Spider模塊的設計與實現

Spider模塊是爬取、分析知乎數據的類。該模塊中設計中涉及多種比較重要的屬性和方法,對其內容可闡述如下。

(1)allowed_domains屬性:表示爬蟲可以爬取該URL下的子鏈接。

(2)start_urls屬性:是一個存放爬蟲的初始URL鏈接的數組。

(3)parse方法:是scrapy.Spider類下的一個方法,每個生成的Response對象都會默認作為參數傳遞給該方法。在該項目中,使用該方法解析用戶信息,獲取用戶的基本信息,給出用戶信息的Item對象,并給出2個爬取用戶關注他人列表及關注用戶的他人列表數據的Request對象,回調函數(callback)為parse_follower方法。

(4)parse_follower方法:運行解析出2個列表中所有的用戶ID,并給出爬取用戶信息的Request對象,回調函數(callback)為parse方法。

2.5.2Items、Pipelines模塊的設計與實現

Item是一個數據容器,用于保存爬取到的數據。Pipelines則用于設計處理生成的的Item。在本項目中,Items中有一個ZhiHuUserInfoItem類,類中定義了相應的字段Field(有token_url、info2個字段)。Pipelines中卻配有一個把Item中的數據保存到數據庫的類,該部分將在2.6數據存儲中予以詳情解析闡述。

2.5.3Middleware模塊的設計與實現

Middleware模塊有Downloader Middlewares和Spider Middlewares2個類型,本文主要采用Downloader Middlewares(下載中間件)。Middlewares方法設計可見如下。

(1)RandomUserAgentDownloaderMiddleware類:負責更換每個Request對象header中的User-Agent值。這里更換User-Agent使用了fake-useragent模塊(https://github.com/hellysmile/fake-useragent),該模塊可以隨機更換不同操作系統、不同瀏覽器的User-Agent值。

(2)RandomProxyMiddleware類:負責更換代理IP及代理IP連接異常情況下的應對處理。其中,還將內配數種設計方法,可概述如下。

① process_request():負責更換Request的代理IP。

② cut_proxy():負責從Redis中獲取一個代理IP。

③ process_response():負責處理請求結束后返回的信息,如果返回403錯誤,就意味著代理IP已失效,需要重新切換代理。

④ process_exception():負責處理連接時的異常情況。如TimeoutError、ConnectionRefusedError、ResponseFailed、ResponseNeverReceived、TunnelError、ConnectError等異常或錯誤情況。若遭遇以上情況,這里同樣采用更換代理IP的方法獲得解決。

2.6數據存儲

網絡爬蟲需要爬取的數據量一般都十分龐大,且有些是結構化數據,有些則為非結構化數據,因此一個適合的數據庫就尤顯重要。在知乎用戶信息爬蟲項目中,獲取到的數據為非結構化數據,并不適宜選擇MySQL等關系型數據庫,因而使用了MongoDB數據庫進行數據的存儲。

MongoDB 是一個基于分布式文件存儲的數據庫。在本網絡爬蟲中,研究僅定義了2個Key。一個為_id,存儲用戶信息的token_url;另一個為info,存儲用戶的基本信息。在Pipelines模塊中,定義了一個MongoDBPipeline類,可用作數據的存儲,數據的存儲則采用了MongoDB中的update方法。其中,upsert屬性需設置為True,該數據有則更新、無則插入。

3分布式網絡爬蟲的測試

3.1測試環(huán)境

本網絡爬蟲的測試環(huán)境基本信息可見表1。

3.2測試數據與分析

知乎分布式爬蟲運行1 h的測試結果可見表2。使用了3臺機器來測試分布式爬蟲,從數據中可以看到,爬蟲的爬取效率達到了預期的目標效果。

爬蟲的性能分析折線圖即如圖4所示。從圖4中看到,爬蟲的爬蟲效率波動仍然較大,究其原因就在于爬蟲測試的網絡環(huán)境不穩(wěn)定所致。如果還需提升爬取速度,可以增加分布式爬蟲的個數。

3.3URL去重策略比較測試分析

URL去重策略運行1 h的比較測試結果可見表3。由表3可以看出,使用BloomFilter算法比Scrapy默認去重(md5哈希后存入set)的去重效率得到了顯著的提升。因此在海量數據的爬取上,使用BloomFilter算法(布隆過濾器)最為適宜。

4結束語

本文探討了基于Scrapy框架的分布式網絡爬蟲的研究與實現。研究中,不僅論述了提高網絡爬蟲數據爬取效率的處理解決方法,而且提供了針對網站反爬蟲的應對策略。最后,設計實現了一個知乎網用戶信息的分布式網絡爬蟲,并爬取得到了大量的數據。在后續(xù)研究中,還將深入研究如何借助數據分析手段對數據進行分析,獲取如知乎網用戶分布、男女分布、學歷分布等等信息,進一步地完善本爬蟲。

參考文獻

[1] 王巖. 搜索引擎中網絡爬蟲技術的發(fā)展[J]. 電信快報, 2008(10):20-22.

[2] Scrapy. Scrapy 1.5 documentation[EB/OL]. [2018]. https://docs.scrapy.org/en/latest/.

[3] 陳利婷. 大數據時代的反爬蟲技術[J]. 電腦與信息技術,2016, 24(6):60-61.

[4] ]Wikipedia.robots.txt詞條[EB/OL]. [2017-06-10]. https://en.wikipedia.org/wiki/MediaWiki:Robots.txt.

[5] 張笑天. 分布式爬蟲應用中布隆過濾器的研究[D]. 沈陽:沈陽工業(yè)大學, 2017.

[6] 朱嶸良. 分布式并行環(huán)境下的網絡爬蟲研究[D] . 北京:中央民族大學,2015.

[7] 孫立偉,何國輝,吳禮發(fā). 網絡爬蟲技術的研究[J]. 電腦知識與技術,2010,6(15):4112-4115.

[8] 楊定中,趙剛,王泰. 網絡爬蟲在Web信息搜索與數據挖掘中應用[J]. 計算機工程與設計. 2009,30(24):5658-5662.

[9] 安子建. 基于Scrapy框架的網絡爬蟲實現與數據抓取分析[D]. 長春:吉林大學, 2017.

[10]趙本本,殷旭東,王偉. 基于Scrapy的GitHub數據爬蟲[J]. 電子技術與軟件工程,2016(6): 199-202.

猜你喜歡
數據庫用戶信息
訂閱信息
中華手工(2017年2期)2017-06-06 23:00:31
數據庫
財經(2017年2期)2017-03-10 14:35:35
關注用戶
商用汽車(2016年11期)2016-12-19 01:20:16
關注用戶
商用汽車(2016年6期)2016-06-29 09:18:54
數據庫
財經(2016年15期)2016-06-03 07:38:02
關注用戶
商用汽車(2016年4期)2016-05-09 01:23:12
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
如何獲取一億海外用戶
展會信息
中外會展(2014年4期)2014-11-27 07:46:46
主站蜘蛛池模板: 欧美另类图片视频无弹跳第一页| 国产香蕉在线| 国产性猛交XXXX免费看| 亚洲天堂在线视频| 69视频国产| 亚洲无码精品在线播放| 香蕉99国内自产自拍视频| 日韩在线网址| 妇女自拍偷自拍亚洲精品| 福利在线一区| 91视频99| 国产一级做美女做受视频| 国产导航在线| 午夜一级做a爰片久久毛片| 五月婷婷激情四射| 欧美亚洲一区二区三区在线| 在线亚洲小视频| 老司机精品99在线播放| 国产精品伦视频观看免费| 97在线观看视频免费| 亚洲人在线| 国产高潮流白浆视频| 日韩午夜片| 手机在线免费不卡一区二| 日韩高清一区 | 麻豆精品视频在线原创| 国产国产人成免费视频77777| 18黑白丝水手服自慰喷水网站| 精品精品国产高清A毛片| 亚洲美女AV免费一区| 久久久久国产精品嫩草影院| 国产成人无码综合亚洲日韩不卡| 午夜无码一区二区三区在线app| 91免费国产高清观看| 亚洲精品成人7777在线观看| 精品国产自| 日本午夜在线视频| 成人小视频在线观看免费| 国产亚洲精品精品精品| 国内精品九九久久久精品| 欧美色丁香| 亚洲一级毛片在线观播放| 久久五月天国产自| 日本在线免费网站| 亚洲精品波多野结衣| 久久精品人妻中文系列| 亚洲成年人片| 亚洲Av激情网五月天| 国产精品冒白浆免费视频| 久久大香香蕉国产免费网站| 欧美激情综合| 在线看片免费人成视久网下载| 特级毛片8级毛片免费观看| 亚洲色婷婷一区二区| 国产成人综合久久精品尤物| 婷婷综合色| 天堂在线亚洲| 免费av一区二区三区在线| 亚洲三级网站| 在线日韩一区二区| 亚洲综合亚洲国产尤物| 欧美成人精品高清在线下载| 人妻无码AⅤ中文字| 欧美成人aⅴ| 国产乱人激情H在线观看| 超清无码一区二区三区| 中文无码精品A∨在线观看不卡| 一本大道视频精品人妻 | 国产香蕉一区二区在线网站| 国产精品亚洲综合久久小说| 国外欧美一区另类中文字幕| 丝袜美女被出水视频一区| 久久久久亚洲Av片无码观看| 97超爽成人免费视频在线播放| 谁有在线观看日韩亚洲最新视频| 亚洲欧洲日韩综合| 亚洲一级毛片在线观播放| 久久免费看片| 日韩人妻精品一区| 国产精品视频导航| 亚洲最猛黑人xxxx黑人猛交| 亚洲国产成人精品无码区性色|