




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Python爬蟲大數(shù)據(jù)采集與挖掘(4)
--普通爬蟲體系結(jié)構(gòu)《Python爬蟲大數(shù)據(jù)采集與挖掘》第二版.微課視頻版(清華大學(xué)出版社,2025)
提綱普通爬蟲體系結(jié)構(gòu)Web服務(wù)器連接器超鏈接及域名提取與過濾異常處理爬行策略與實(shí)現(xiàn)爬蟲多線程技術(shù)Web服務(wù)器連接器向指定的Web服務(wù)器發(fā)起連接請求,再建立爬蟲和Web服務(wù)器之間的網(wǎng)絡(luò)連接。該連接就作為后續(xù)發(fā)送URL和接收服務(wù)器返回信息的通路,直到爬蟲或服務(wù)器斷開該連接。在該連接上向Web服務(wù)器發(fā)送URL頁面請求命令,并等待Web服務(wù)器的響應(yīng)。對于一個新的網(wǎng)站,在發(fā)送URL請求之前,應(yīng)當(dāng)檢查其根目錄下是否有Robots.txt文件。如果有,則應(yīng)當(dāng)對該文件進(jìn)行解析,建立服務(wù)器訪問要求和URL許可列表。同時需要處理各種可能的網(wǎng)絡(luò)異常、各種可能Web服務(wù)器異常,例如HTTP404錯誤等。對獲取到的HTML文件進(jìn)行URL提取和過濾,由頁面解析器對HTML文本進(jìn)行分析,提取其中的所包含的URL。進(jìn)一步,根據(jù)Robots.txt的訪問許可列表、是否已經(jīng)爬行過等基本規(guī)則對提取出來的URL進(jìn)行過濾,以排除掉一些不需要獲取的頁面。根據(jù)一定的爬行策略,將每個URL放入到URL任務(wù)中的適當(dāng)位置。當(dāng)某個URL對應(yīng)的頁面爬行完畢后,Web服務(wù)器連接器從URL爬行任務(wù)獲得新的URL,上述過程不斷地重復(fù)進(jìn)行,直到爬行任務(wù)為空,或者用戶中斷為止。提綱普通爬蟲體系結(jié)構(gòu)Web服務(wù)器連接器超鏈接及域名提取與過濾異常處理爬行策略與實(shí)現(xiàn)爬蟲多線程技術(shù)整體處理過程Web服務(wù)器連接器模塊主要功能的實(shí)現(xiàn),可以用如下的流程來描述。輸入:URL,形式為:http(https)://域名部分:端口號/目錄/文件名.文件后綴,或http(https)://域名部分:端口號/目錄/其中,目錄可以包含多層子目錄。處理過程:(1)從URL中提取域名和端口號,如果端口號為空,則設(shè)置為默認(rèn)的端口號,即80;(2)以域名和端口號為參數(shù),創(chuàng)建Socket連接;(3)連接建立后,檢查服務(wù)器的根目錄是否存在robots.txt文件;(4)如果存在則解析robots.txt文件,生成許可列表和服務(wù)器對訪問要求的參量;(5)根據(jù)許可列表和訪問時間限定,如果允許的話,則向服務(wù)器發(fā)送URL請求;(6)等待服務(wù)器響應(yīng);(7)進(jìn)行異常處理,針對各種已知的HTTP標(biāo)準(zhǔn)錯誤代碼,做好預(yù)案;(8)接收服務(wù)器返回的數(shù)據(jù),把數(shù)據(jù)保存到文件中;(9)斷開網(wǎng)絡(luò)連接。輸出:頁面的HTML文件DNS緩存DNS緩存是一種被高度封裝、但又對爬蟲性能有較大影響的處理模塊。DNS緩存的實(shí)現(xiàn)可以在操作系統(tǒng)或虛擬機(jī)、解釋器,以及應(yīng)用層上進(jìn)行。默認(rèn)情況由操作系統(tǒng)自行管理緩存。在應(yīng)用層實(shí)現(xiàn)DNS緩存,可以自己用Python的類來編寫,也可以基于dnspython工具包來進(jìn)行緩存管理的實(shí)現(xiàn)。importdns.resolvera=dns.resolver.resolver("")#將主機(jī)名轉(zhuǎn)換為IP地址ip=a[0].address#獲得相應(yīng)的IP地址‘1'requests/response的使用方法函數(shù)名函數(shù)功能requests.request()用于構(gòu)造一個請求requests.get()獲取HTML網(wǎng)頁的主要方法,對應(yīng)HTTP的GETrequests.head()獲取HTML網(wǎng)頁頭部的信息方法,對應(yīng)HTTP的HEADrequests.post()向HTML網(wǎng)頁提交POST請求方法,對應(yīng)HTTP的POSTrequests.put()向HTML網(wǎng)頁提交PUT請求的方法,對應(yīng)HTTP的PUTrequests.patch()向HTML網(wǎng)頁提交局部修改請求,對應(yīng)于HTTP的PATCHrequests.delete()向HTML頁面提交刪除請求,對應(yīng)HTTP的DELETErequests.Session()在不同次請求中,Web服務(wù)器保持某些參數(shù)requests的函數(shù)原型get(url,params=None,**kwargs)如,r=requests.get("/")然后通過r.text即可獲得指定url的頁面的HTML內(nèi)容。get函數(shù)的返回結(jié)果,即這個例子中的r,是一個requests.Response對象屬性說明status_codeHTTP請求的返回狀態(tài)textHTTP響應(yīng)內(nèi)容的字符串形式,即頁面內(nèi)容encoding從HTTPheader中猜測的響應(yīng)內(nèi)容編碼方式apparent_encoding從內(nèi)容中分析出的響應(yīng)內(nèi)容編碼方式contentHTTP響應(yīng)內(nèi)容的二進(jìn)制形式Response對象屬性函數(shù)get的參數(shù)**kwargs是用于控制請求的一些附屬特性,包括headers,cookies,params,proxies等,總共有12個控制參數(shù)
。控制參數(shù)的使用如用于配置HTTP請求頭信息http_headers={'User-Agent':'Mozilla/5.0’,#其他屬性和屬性值}r=requests.get("/",headers=http_headers)HTTP請求頭屬性及屬性值,通過瀏覽器的F12查看頁面的請求過程獲得主要的控制參數(shù)及功能介紹如下:(1)headers:是Python中的字典型變量,可以用來模擬任何瀏覽器標(biāo)識來發(fā)起url訪問。(2)cookies:字典或CookieJar,指的是從http中解析cookie(3)timeout:用于設(shè)定超時時間,單位為秒,當(dāng)發(fā)起一個get請求時可以設(shè)置一個timeout時間,如果在timeout時間內(nèi)請求內(nèi)容沒有返回,將產(chǎn)生一個timeout的異常。(4)proxies:字典,用來設(shè)置訪問代理服務(wù)器。(5)params:字典或字節(jié)序列,作為參數(shù)增加到url中,使用這個參數(shù)可以把一些鍵值對以?key1=value1&key2=value2的模式增加到url中例如:kv={‘key1:’values,‘key2’:values}r=requests.request(‘GET’,‘http:www.python123.io/ws’,params=kw)(6)data:字典,字節(jié)序或文件對象,重點(diǎn)作為向服務(wù)器提供或提交資源是提交,作為request的內(nèi)容(7)json:json格式的數(shù)據(jù),json合適在相關(guān)的html,http相關(guān)的web開發(fā)中非常常見,也是http最經(jīng)常使用的數(shù)據(jù)格式,作為內(nèi)容部分可以向服務(wù)器提交。為了正確地從get的返回結(jié)果中獲得頁面內(nèi)容,一個很重要的步驟是需要檢查頁面的編碼方式,然后設(shè)置requests.Response對象的encoding屬性。r=requests.get("/",headers={'User-Agent':'Mozilla/5.0'},timeout=10)#同時指定了headers和timeoutr.encoding=’utf-8’#設(shè)定為頁面的編碼,即頁面源碼中charset的值r.text#此為頁面的HTML文本信息提綱普通爬蟲體系結(jié)構(gòu)Web服務(wù)器連接器超鏈接及域名提取與過濾異常處理爬行策略與實(shí)現(xiàn)爬蟲多線程技術(shù)Web頁面中超鏈接有以下若干種分類方法。按照鏈接的形式不同,可以分為絕對鏈接、相對鏈接和書簽。按照鏈接的路徑指向不同,可以分為三種類型:內(nèi)部鏈接,錨點(diǎn)鏈接和外部鏈接。按照超鏈接指向的資源不同,可以分為Web頁面超鏈接、圖片超鏈接、視頻超鏈接、等等。按照鏈接的存在方式不同,可以分為動態(tài)超鏈接和靜態(tài)超鏈接。提取方法與Web頁面中正文等其他信息提取不同,超鏈接具有顯著的特征模式,一般有:(1)Tag標(biāo)簽為a,屬性為href(2)Tag標(biāo)簽為資源名稱,例如img、audio,屬性為scr由于具備一定模式,在程序設(shè)計中使用正則表達(dá)式就會更加容易。正則表達(dá)式是用一種用來標(biāo)識具有一定信息分布規(guī)律的字符串,常用來進(jìn)行字符串匹配。在頁面內(nèi)容中提取超鏈接的一種正則表達(dá)式是:"http://[a-zA-Z0-9/\.-]*",用于re.findall函數(shù)中,但這個表達(dá)式只能提取http://開始的超鏈接。對于圖像等其他類型的資源超鏈接,需要根據(jù)相應(yīng)的特征模式進(jìn)行修改。對于相對鏈接需要轉(zhuǎn)換成為絕對鏈接,轉(zhuǎn)換的方法是根據(jù)當(dāng)前頁面的URL所對應(yīng)的虛擬目錄名稱提取基準(zhǔn)目錄。此外,有的頁面中會指出基準(zhǔn)目錄,可以直接提取。Robots協(xié)議robots.txt是網(wǎng)絡(luò)爬蟲采集某個網(wǎng)站W(wǎng)eb內(nèi)容之前應(yīng)當(dāng)讀取并解析的文件。網(wǎng)絡(luò)爬蟲與Web服務(wù)器建立網(wǎng)絡(luò)連接之后,應(yīng)當(dāng)按照以下流程建立訪問許可。(1)檢查虛擬根目錄下是否存在robots.txt文件(2)如果服務(wù)器返回404錯誤,表明文件不存在,則轉(zhuǎn)步驟(6)(3)如果存在,則將robots.txt文件讀回到本地(4)解析robots.txt文件中的每個記錄,如果爬蟲的User-agent在這些記錄中,則讀取記錄中的Disallow或Allow部分。如果是一個未知的User-agent,則定位到以“User-agent:*”為開始的記錄,讀取該記錄的Disallow或Allow部分。(5)根據(jù)提取到的Disallow或Allow部分,構(gòu)建許可列表。(6)結(jié)束可以使用python中的RobotFileParser類對robots.txt文件進(jìn)行解析,并獲得訪問許可的判斷,以下是對該類的說明。該類的主要方法有:set_url(url),設(shè)置指向robots.txt的URL。read(),讀取robots.txt。can_fetch(useragent,url),指定useragent及url,判斷useragent的爬蟲是否可以訪問url,返回值為True表示可以訪問,F(xiàn)alse表示不允許訪問。crawl_delay(useragent),返回指定useragent的爬蟲,其抓取延時的值。如果robots.txt中沒有為useragent指定相應(yīng)的抓取延時,則返回None。request_rate(useragent),返回指定useragent的爬蟲,其抓取頻率的值。如果robots.txt中沒有為useragent指定相應(yīng)的抓取頻率,則返回None。是否可以將自己的爬蟲的User-agent設(shè)置為知名爬蟲呢?從代碼的角度看,沒有人會限制你使用什么樣的User-agent,就是上面的例子。實(shí)際上,不斷變換User-agent的值也是很多不友好爬蟲為了躲避服務(wù)器的檢測的常用做法。但是這種做法是非常不可取的,它擾亂了Web服務(wù)器的正常判斷,就可能使得某種知名爬蟲被檢測出來不遵守Robots協(xié)議而產(chǎn)生糾紛。訪問網(wǎng)站的合規(guī)性使用RobotFileParser類對robots.txt文件進(jìn)行解析can_fetch(useragent,url)檢查指定的useragent是否可以訪問urlcrawl_delay(useragent)獲得爬蟲所需要的抓取延時request_rate(useragent)獲得爬蟲的抓取頻率要求提綱普通爬蟲體系結(jié)構(gòu)Web服務(wù)器連接器超鏈接及域名提取與過濾異常處理爬行策略與實(shí)現(xiàn)爬蟲多線程技術(shù)錯誤和異常的處理在HTTP協(xié)議中規(guī)定了HTTP請求中的各種狀態(tài)碼,表示服務(wù)器處理的結(jié)果。正常的情況下服務(wù)端給出一個值為200的狀態(tài)碼,而錯誤和異常的情景很多種,是通過不同的HTTP狀態(tài)碼來標(biāo)識。一些比較常見的、需要爬蟲處理的錯誤狀態(tài)碼有:(1)404代表“NOTFOUND”,認(rèn)為網(wǎng)頁已經(jīng)失效,因此,爬蟲應(yīng)當(dāng)刪除它,同時如果爬蟲再次發(fā)現(xiàn)這條url也不要再抓取;(2)503代表“ServiceUnavailable”,認(rèn)為網(wǎng)頁臨時不可訪問,通常是網(wǎng)站臨時關(guān)閉,帶寬有限等會產(chǎn)生這種情況。短期內(nèi)反復(fù)訪問幾次,如果網(wǎng)頁已恢復(fù),則正常抓取;如果繼續(xù)返回503,那么這條url仍會被認(rèn)為是失效鏈接,從爬行任務(wù)中刪除。(3)403代表“Forbidden”,認(rèn)為網(wǎng)頁目前禁止訪問,這條url也應(yīng)當(dāng)從爬行任務(wù)中刪除。(4)301代表是“MovedPermanently”,認(rèn)為網(wǎng)頁重定向至新url。當(dāng)遇到站點(diǎn)遷移、域名更換、站點(diǎn)改版的情況時,使用301返回碼。另一種異常是超時,在爬蟲獲取Web頁面時可能由于服務(wù)器負(fù)荷過大,導(dǎo)致響應(yīng)延緩,因此,需要適當(dāng)考慮超時處理,否則就容易使得爬蟲一直處于等待狀態(tài)。這也是爬蟲程序需要處理的場景異常之一。try:req=requests.get('/',timeout=1)print(req.status_code)exceptReadTimeout:#超時異常print('Timeout')exceptConnectionError:#連接異常print('Connectionerror')exceptRequestException:#請求異常print('Error')else:ifreq.status_code==200:print('訪問正常!')#將爬取的網(wǎng)頁保存在本地fb=open("t.html","wb")fb.write(req.content)fb.close()ifreq.status_code==404:print('頁面不存在!')ifreq.status_code==403:print('頁面禁止訪問!')#...提綱普通爬蟲體系結(jié)構(gòu)Web服務(wù)器連接器超鏈接及域名提取與過濾異常處理爬行策略與實(shí)現(xiàn)爬蟲多線程技術(shù)爬行策略,是指對爬行過程中從每個頁面解析得到的超鏈接進(jìn)行安排的方法,即按照什么樣的順序?qū)@些超鏈接進(jìn)行爬行。合規(guī)性及高效性爬行策略的設(shè)計需要考慮以下限制:(1)不要對Web服務(wù)器產(chǎn)生太大的壓力這些壓力主要體現(xiàn)在:a,與Web服務(wù)器的連接需要占用其網(wǎng)絡(luò)帶寬b,每一次頁面請求,需要從硬盤讀取文件c,對于動態(tài)頁面,還需要腳本的執(zhí)行。如果啟用Session的話,對于大數(shù)據(jù)量訪問需要更多的內(nèi)存消耗(2)不要占用太多的客戶端資源爬蟲程序建立與Web服務(wù)器的網(wǎng)絡(luò)連接時,同樣也要消耗本地的網(wǎng)絡(luò)資源和計算資源。如果太多的線程同時運(yùn)行,特別是一些長時間的連接存在,或者網(wǎng)絡(luò)連接的超時參數(shù)設(shè)置不合適,很可能導(dǎo)致客戶端有限的網(wǎng)絡(luò)資源消耗。互聯(lián)網(wǎng)上的WEB頁面可以抽象化為一張有向圖。圖的遍歷就是用來解決節(jié)點(diǎn)的訪問順序問題。圖的遍歷算法有兩種,即深度優(yōu)先算法DFS和寬度優(yōu)先算法BFS。假如從節(jié)點(diǎn)A開始,則按照這兩種遍歷方法,頁面的訪問順序分別是:深度優(yōu)先:A–B–F–I–C–D–G–H–J–E寬度優(yōu)先:A–B–C–D–E–F–G–H–I–J按照寬度優(yōu)先的策略,可以使用隊(duì)列作為存儲結(jié)構(gòu)。按照深度優(yōu)先的策略,就不能使用隊(duì)列了,需要采用堆棧。Python實(shí)現(xiàn)DFS和BFS具有高度的對稱性,因此在Python實(shí)現(xiàn)時,并不需要將兩種數(shù)據(jù)結(jié)構(gòu)分開,只需要構(gòu)建一個數(shù)據(jù)結(jié)構(gòu)在UrlSequenceUrl中設(shè)置的未訪問序列self.unvisited可以完成出隊(duì)列和棧的操作,前者通過pop(0)來實(shí)現(xiàn),后者通過pop()實(shí)現(xiàn)。UrlSequenceUrl類存放了所有和URL序列有關(guān)的函數(shù),維護(hù)了兩個序列visited和unvisited,并實(shí)現(xiàn)了對URL的元素增加、刪除、計數(shù)等操作,可以為爬蟲的其他模塊提供完整的封裝,具體實(shí)現(xiàn)時選擇一種遍歷方式即可。PageRank重要性排序每個網(wǎng)站都有一個首頁,從鏈接的角度來看,首頁的最主要特征就是鏈接數(shù)量大。在大規(guī)模分布式的情況下。分布式系統(tǒng)中每個機(jī)器的性能好壞不一,設(shè)計者總是希望把重要頁面的爬行分配給性能好的機(jī)器,以提高爬蟲的整體性能,因此,就需要有一種方法來量化頁面的重要性。PageRank算法是一個經(jīng)典算法,出身于google搜索引擎,是一種根據(jù)網(wǎng)頁之間相互的超鏈接計算頁面級別的方法。它由LarryPage和SergeyBrin在20世紀(jì)90年代后期發(fā)明。由于它解決了網(wǎng)絡(luò)圖中每個節(jié)點(diǎn)重要性的量化計算方法,因此在許多可以抽象為網(wǎng)絡(luò)連接圖的應(yīng)用中得到廣泛采用。計算Web頁面的重要性社交網(wǎng)絡(luò)中的重要人物識別文本中的關(guān)鍵詞提取假如有四位小朋友分糖果,并假設(shè)糖果可以任意分,分糖果的規(guī)則如下:(1)A把自己的糖果平均分給B、C(2)B把自己的糖果全部給D(3)C把自己的糖果的一半分給D,另一半自己留著(4)D把自己的糖果平均分給A、B、C要求計算每輪結(jié)束后每個小朋友的糖果數(shù)量,并判斷按照這樣的規(guī)則不斷分下去的話,最終每個小朋友的糖果數(shù)量是否會不再變化。構(gòu)圖在每輪分配結(jié)束之后,每個人擁有的蘋果數(shù)量分別是:
p(A)=1/3*p(D)(4-2)p(B)=1/2*p(A)+1/3*p(D)(4-3)p(C)=1/2*p(A)+1/2*p(C)+1/3*p(D)(4-4)p(D)=p(B)+1/2*p(C)(4-5)寫成矩陣形式這是一個典型的Markov鏈模型。根據(jù)Markov鏈的性質(zhì),在總數(shù)40變的情況下,每個人初始的糖果數(shù)即使不同,最終經(jīng)過若干輪重新分配后,每個人的糖果數(shù)都會收斂到上述值。這就是這個Markov鏈的第二個特征,即收斂值與初始值無關(guān)。將這個實(shí)例的思想引入到Web頁面中,并假設(shè)某個頁面的重要性平均分配給它所指向的每個頁面。引入到Web頁面的鏈接圖分析中,需要考慮到一些具體情況:(1)用戶可能在瀏覽B頁面時,可以直接輸入C的網(wǎng)址,雖然B沒有指向C的超鏈接。(2)某個頁面除了可以通過指向它的超鏈接進(jìn)入該頁面外,還有其他途徑可以直接訪問該頁面,例如通過瀏覽器提供的收藏夾。一個頁面被訪問的隨機(jī)性應(yīng)當(dāng)來自其他所有頁面理論上,PR算法的收斂性證明是基于Markov鏈,要求它的狀態(tài)轉(zhuǎn)移矩陣A需要滿足三個條件:(1)A為隨機(jī)矩陣:A矩陣所有元素都大于等于0,并且
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 公司之間股權(quán)抵押合同標(biāo)準(zhǔn)文本
- 2025-2030嬰幼兒保健品行業(yè)風(fēng)險投資發(fā)展分析及投資融資策略研究報告
- 2025-2030嬰兒服裝市場前景分析及投資策略與風(fēng)險管理研究報告
- 2025-2030天然皮革行業(yè)市場發(fā)展分析及前景趨勢與投資戰(zhàn)略研究報告
- 2025-2030城市配送行業(yè)發(fā)展分析及投資戰(zhàn)略研究報告
- 2025-2030垃圾處理設(shè)備行業(yè)市場發(fā)展分析及發(fā)展趨勢與投資前景研究報告
- 2025年冀教版五年級下學(xué)期語文期中綜合復(fù)習(xí)習(xí)題
- 2025-2030國內(nèi)保暖內(nèi)衣行業(yè)深度分析及競爭格局與發(fā)展前景預(yù)測研究報告
- 二年級蘇教版數(shù)學(xué)下學(xué)期期中綜合復(fù)習(xí)提升練習(xí)
- 四年級湘教版下學(xué)期語文期末綜合復(fù)習(xí)實(shí)驗(yàn)學(xué)校習(xí)題
- 班組長執(zhí)行力提升培訓(xùn)課件
- 電影音樂欣賞智慧樹知到期末考試答案章節(jié)答案2024年華南農(nóng)業(yè)大學(xué)
- 《中國飲食文化》課件-中國飲食文化溯源
- 2024年貴州省中考數(shù)學(xué)真題試卷及答案解析
- 統(tǒng)編版語文六年級下冊第四單元闖關(guān)測試卷(含答案)
- 煤炭開采單位產(chǎn)品能源消耗限額-編輯說明
- 書香校園-世界讀書日主題教育班會
- 雪鐵龍DS6說明書
- TIAC CCSA 32-2019《保險行業(yè)云計算場景和總體框架》
- 智慧農(nóng)業(yè)中的農(nóng)業(yè)無人機(jī)技術(shù)與應(yīng)用
- 玻璃瓶絲印制度
評論
0/150
提交評論