零基礎(chǔ)爬蟲入門(五) | 數(shù)據(jù)抓取策略與更新策略

      網(wǎng)友投稿 783 2025-03-31

      大家好,我是不溫卜火,是一名計(jì)算機(jī)學(xué)院大數(shù)據(jù)專業(yè)大三的學(xué)生,昵稱來(lái)源于成語(yǔ)—不溫不火,本意是希望自己性情溫和。作為一名互聯(lián)網(wǎng)行業(yè)的小白,博主寫博客一方面是為了記錄自己的學(xué)習(xí)過(guò)程,另一方面是總結(jié)自己所犯的錯(cuò)誤希望能夠幫助到很多和自己一樣處于起步階段的萌新。但由于水平有限,博客中難免會(huì)有一些錯(cuò)誤出現(xiàn),有紕漏之處懇請(qǐng)各位大佬不吝賜教!暫時(shí)只在csdn這一個(gè)平臺(tái)進(jìn)行更新,博客主頁(yè):https://buwenbuhuo.blog.csdn.net/。


      PS:由于現(xiàn)在越來(lái)越多的人未經(jīng)本人同意直接爬取博主本人文章,博主在此特別聲明:未經(jīng)本人允許,禁止轉(zhuǎn)載!!!

      目錄

      一、爬行策略

      1.1 爬行策略的設(shè)計(jì)需要考慮以下限制

      1.2 爬行策略設(shè)計(jì)的綜合考慮

      二、初次嘗試網(wǎng)絡(luò)爬蟲

      三、抓取策略

      3.1、數(shù)據(jù)抓取策略

      3.1.1、非完全PageRank策略

      3.1.2、OPIC策略

      3.1.3、大站優(yōu)先策略(比較粗暴)

      3.1.4、合作抓取策略(需要一個(gè)規(guī)范的URL地址)

      3.1.5、圖的遍歷算法策略(★)

      1、深度優(yōu)先

      2、廣度優(yōu)先

      3、Python實(shí)現(xiàn)

      4、代碼實(shí)現(xiàn)

      3.2、數(shù)據(jù)更新策略

      一、爬行策略

      爬行策略,是指對(duì)爬行過(guò)程中從每個(gè)頁(yè)面解析得到的超鏈接進(jìn)行安排的方法,即按照什么樣的順序?qū)@些超鏈接進(jìn)行爬行。

      1.1 爬行策略的設(shè)計(jì)需要考慮以下限制

      (1)不要對(duì)Web服務(wù)器產(chǎn)生太大的壓力

      這些壓力主要體現(xiàn)在:

      ①與Web服務(wù)器的連接需要占用其網(wǎng)絡(luò)帶寬

      ②每一次頁(yè)面請(qǐng)求,需要從硬盤讀取文件

      ③對(duì)于動(dòng)態(tài)頁(yè)面,還需要腳本的執(zhí)行。如果啟用Session的話,對(duì)于大數(shù)據(jù)量訪問(wèn)需要更多的內(nèi)存消耗

      (2)不要占用太多的客戶端資源

      爬蟲程序建立與Web服務(wù)器的網(wǎng)絡(luò)連接時(shí),同樣也要消耗本地的網(wǎng)絡(luò)資源和計(jì)算資源。如果太多的線程同時(shí)運(yùn)行,特別是一些長(zhǎng)時(shí)間的連接存在,或者網(wǎng)絡(luò)連接的超時(shí)參數(shù)設(shè)置不合適,很可能導(dǎo)致客戶端有限的網(wǎng)絡(luò)資源消耗。

      1.2 爬行策略設(shè)計(jì)的綜合考慮

      不同網(wǎng)站上的Web頁(yè)面鏈接圖畢竟有自己獨(dú)有的特點(diǎn),因此,設(shè)計(jì)爬行策略時(shí),需要進(jìn)行一定權(quán)衡,考慮多方面的影響因素,包括爬蟲的網(wǎng)絡(luò)連接消耗以及對(duì)服務(wù)端所造成的影響等等,一個(gè)好的爬蟲需要不斷地結(jié)合Web頁(yè)面鏈接的一些特征來(lái)進(jìn)行優(yōu)化調(diào)整。

      對(duì)于爬蟲來(lái)說(shuō),爬行的初始頁(yè)面一般是某個(gè)比較重要的頁(yè)面,如某個(gè)公司的首頁(yè)、新聞網(wǎng)站的首頁(yè)等。

      從爬蟲管理眾多頁(yè)面超鏈接的效率來(lái)看,基本的深度優(yōu)先策略和寬度優(yōu)先的策略都具有較高的效率。

      從頁(yè)面優(yōu)先級(jí)的角度看,爬蟲雖然從某個(gè)指定的頁(yè)面作為爬行的初始頁(yè)面,但是在確定下一個(gè)要爬行的頁(yè)面時(shí),總是希望優(yōu)先級(jí)高的頁(yè)面先被爬行。

      由于頁(yè)面之間的鏈接結(jié)構(gòu)非常復(fù)雜,可能存在雙向鏈接、環(huán)鏈接等情景

      爬蟲在對(duì)某個(gè)WEB服務(wù)器上頁(yè)面進(jìn)行爬行時(shí)需要先建立網(wǎng)絡(luò)連接,占用主機(jī)和連接資源,適當(dāng)對(duì)這種資源占用進(jìn)行分配是非常必要的。

      二、初次嘗試網(wǎng)絡(luò)爬蟲

      互聯(lián)網(wǎng)中的網(wǎng)絡(luò)之間互相連接,構(gòu)成一個(gè)巨大的網(wǎng)絡(luò)圖:

      網(wǎng)絡(luò)爬蟲就是從這個(gè)巨大復(fù)雜的網(wǎng)絡(luò)體中,根據(jù)給定的策略,抓取所需要的內(nèi)容

      實(shí)例代碼

      import requests,re # import time # from collections import Counter count = 20 r = re.compile(r'href=[\'"]?(http[^\'">]+)') seed = 'https://www.baidu.com/more/' queue = [seed] used = set() # 設(shè)置一個(gè)集合,保存已經(jīng)抓取過(guò)的URL storage = {} while len(queue) > 0 and count > 0 : try: url = queue.pop(0) html = requests.get(url).text storage[url] = html #將已經(jīng)抓取過(guò)的URL存入used集合中 used.add(url) new_urls = r.findall(html) # 將新發(fā)行未抓取的URL添加到queue中 print(url+"下的url數(shù)量為:"+str(len(new_urls))) for new_url in new_urls: if new_url not in used and new_url not in queue: queue.append(new_url) count -= 1 except Exception as e : print(url) print(e)

      1

      2

      零基礎(chǔ)爬蟲入門(五) | 數(shù)據(jù)抓取策略與更新策略

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      2. 運(yùn)行結(jié)果

      我們可以感受下一個(gè)一級(jí)網(wǎng)頁(yè)到下一級(jí)網(wǎng)頁(yè)的鏈接能有多么多

      三、抓取策略

      從網(wǎng)絡(luò)爬蟲的角度來(lái)看,整個(gè)互聯(lián)網(wǎng)可以劃分為:

      在網(wǎng)絡(luò)爬蟲的組成部分中,待抓取URL隊(duì)列是最重要一環(huán)

      待抓取隊(duì)列中的URL以什么樣的順序排列,這涉及到頁(yè)面抓取的先后問(wèn)題

      決定待抓取URL排列順序的方法,成為抓取策略

      網(wǎng)絡(luò)爬蟲使用不同的抓取策略,實(shí)質(zhì)是使用不同的方法確定待抓取URL隊(duì)列中URL的先后順序

      爬蟲的多種抓取策略目標(biāo)基本一致:優(yōu)先抓取重要的網(wǎng)頁(yè)

      網(wǎng)頁(yè)的重要性,大多數(shù)采用網(wǎng)頁(yè)的流動(dòng)性來(lái)進(jìn)行度量

      3.1、數(shù)據(jù)抓取策略

      非完全PageRank策略

      OCIP策略

      大站優(yōu)先策略

      合作抓取策略

      圖遍歷算法策略

      3.1.1、非完全PageRank策略

      PageRank算法,是一種著名的超鏈接分析算法,用來(lái)進(jìn)行網(wǎng)頁(yè)排名,以谷歌創(chuàng)始人Larry Page命名。由于它解決了網(wǎng)絡(luò)圖中每個(gè)節(jié)點(diǎn)重要性的量化計(jì)算方法,因此在許多可以抽象為網(wǎng)絡(luò)連接圖的應(yīng)用中得到廣泛采用。

      PageRank策略算法基于以下的思想對(duì)網(wǎng)頁(yè)的重要性進(jìn)行評(píng)分:

      ①一個(gè)網(wǎng)頁(yè)被很多其他網(wǎng)頁(yè)鏈接,該網(wǎng)頁(yè)比較重要,PageRank分?jǐn)?shù)回相對(duì)較高

      ② 一個(gè)PageRank分?jǐn)?shù)高的網(wǎng)頁(yè)鏈接到一個(gè)其他的網(wǎng)頁(yè),被鏈接到的網(wǎng)頁(yè)的PageRank分?jǐn)?shù)會(huì)相應(yīng)提高

      通常來(lái)講,一個(gè)網(wǎng)頁(yè)的PageRank分?jǐn)?shù)計(jì)算如下:

      PageRank算法計(jì)算的對(duì)象是整個(gè)互聯(lián)網(wǎng)頁(yè)面的集合;而非完全PageRank策略則關(guān)注的是以下的頁(yè)面集合:

      ①網(wǎng)絡(luò)爬蟲已經(jīng)下載的頁(yè)面

      ②待抓取URL隊(duì)列的URL

      之后由兩者組成的頁(yè)面子集中,計(jì)算PageRank分?jǐn)?shù)

      根據(jù)PageRank分?jǐn)?shù),按照從高到低的順序,將待抓取URL隊(duì)列重排,形成新的待抓取URL隊(duì)列

      3.1.2、OPIC策略

      OPIC,是Online Page Importance Computation的縮寫,是一種改進(jìn)的PageRank算法

      OPIC策略的基本思想

      將互聯(lián)網(wǎng)的頁(yè)面初始cash值設(shè)為1/N

      每當(dāng)網(wǎng)絡(luò)爬蟲下載頁(yè)面a,將a的cash值平均分配給頁(yè)面中包含的鏈接,再將自己的cash值設(shè)為零

      將待抓取URL隊(duì)列中的URL按照cash值進(jìn)行降序排列,優(yōu)先處理cash值高的網(wǎng)頁(yè)

      3.1.3、大站優(yōu)先策略(比較粗暴)

      大站優(yōu)先策略的思路簡(jiǎn)單明了:

      依據(jù)網(wǎng)站決定網(wǎng)頁(yè)重要性,對(duì)于待爬取URL隊(duì)列中的網(wǎng)頁(yè)根據(jù)所屬網(wǎng)站歸類

      等待下載的頁(yè)面最多的網(wǎng)站,會(huì)得到網(wǎng)絡(luò)爬蟲的“優(yōu)先考慮”

      “大戰(zhàn)”通常具有以下特點(diǎn):

      穩(wěn)定的服務(wù)器,良好的網(wǎng)站結(jié)構(gòu)

      優(yōu)秀的用戶體驗(yàn),及時(shí)的咨詢內(nèi)容

      權(quán)威的相關(guān)資料,豐富的內(nèi)容類型

      海量的網(wǎng)頁(yè)數(shù),高質(zhì)量的外鏈

      如何識(shí)別要抓取的目標(biāo)網(wǎng)站是否為大戰(zhàn)?

      人工整理大站名單,通過(guò)已知的大站發(fā)現(xiàn)其他大站

      根據(jù)大站的特點(diǎn),對(duì)將要爬取的網(wǎng)站進(jìn)行評(píng)估(架構(gòu),內(nèi)容,傳播速度等)

      3.1.4、合作抓取策略(需要一個(gè)規(guī)范的URL地址)

      為了提高抓取網(wǎng)頁(yè)的速度,常見的選擇是增加網(wǎng)絡(luò)爬蟲的數(shù)量

      如何給這些爬蟲分配不同的工作量,確保獨(dú)立分工,避免重復(fù)爬取,這是合作抓取策略的目標(biāo)

      合作抓取策略通常使用以下兩種方式:

      通過(guò)服務(wù)器的IP地址來(lái)分解,讓爬蟲僅抓取某個(gè)地址段的網(wǎng)頁(yè)

      通過(guò)網(wǎng)頁(yè)域名來(lái)分解,讓爬蟲僅抓取某個(gè)域名段的網(wǎng)頁(yè)

      3.1.5、圖的遍歷算法策略(★)

      圖的遍歷算法主要分成兩種:

      深度優(yōu)先(DFS,Depth First Search)

      廣度優(yōu)先(BFS,Breadth First Search)

      深度優(yōu)先從根節(jié)點(diǎn)開始,沿著一條路徑盡可能深地訪問(wèn),直到遇到葉節(jié)點(diǎn)時(shí)才回溯

      深度優(yōu)先由自己的優(yōu)點(diǎn),但更容易陷入無(wú)限循環(huán)

      使用廣度優(yōu)先策略的原因:

      重要的網(wǎng)頁(yè)往往離種子站點(diǎn)距離較近

      互聯(lián)網(wǎng)的深度沒有那么深,但卻出乎意料地寬廣

      廣度優(yōu)先遍歷策略地基本思路

      將新下載網(wǎng)頁(yè)中發(fā)現(xiàn)的鏈接直接插入待抓取URL隊(duì)列的末尾。也就是指網(wǎng)絡(luò)爬蟲會(huì)先抓取起始網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè)

      再選擇其中一個(gè)鏈接網(wǎng)頁(yè),繼續(xù)抓取在此網(wǎng)頁(yè)中鏈接的所有網(wǎng)頁(yè)

      廣度優(yōu)先策略從根節(jié)點(diǎn)開始,盡可能訪問(wèn)離根節(jié)點(diǎn)最近的節(jié)點(diǎn)

      DFS和BFS具有高度的對(duì)稱性,因此在Python實(shí)現(xiàn)時(shí),并不需要將兩種數(shù)據(jù)結(jié)構(gòu)分開,只需要構(gòu)建一個(gè)數(shù)據(jù)結(jié)構(gòu)

      在UrlSequenceUrl中設(shè)置的未訪問(wèn)序列self.unvisited可以完成出隊(duì)列和棧的操作,前者通過(guò)pop(0)來(lái)實(shí)現(xiàn),后者通過(guò)pop()實(shí)現(xiàn)。

      UrlSequenceUrl類存放了所有和URL序列有關(guān)的函數(shù),維護(hù)了兩個(gè)序列visited和unvisited,并實(shí)現(xiàn)了對(duì)URL的元素增加、刪除、計(jì)數(shù)等操作,可以為爬蟲的其他模塊提供完整的封裝,具體實(shí)現(xiàn)時(shí)選擇一種遍歷方式即可。

      1.用list模擬隊(duì)列,實(shí)現(xiàn)BFS算法

      import requests,re count = 20 r = re.compile(r'href=[\'"]?(http[^\'">]+)') seed = 'http://httpbin.org/' queue = [seed] storage = {} while len(queue) > 0 and count > 0 : try: url = queue.pop(0) html = requests.get(url).text storage[url] = html #將已經(jīng)抓取過(guò)的URL存入used集合中 used.add(url) new_urls = r.findall(html) # 將新發(fā)行未抓取的URL添加到queue中 print(url+"下的url數(shù)量為:"+str(len(new_urls))) for new_url in new_urls: if new_url not in used and new_url not in queue: queue.append(new_url) count -= 1 except Exception as e : print(url) print(e)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      2.用list模擬隊(duì)列,實(shí)現(xiàn)DFS算法

      import requests,re count = 20 r = re.compile(r'href=[\'"]?(http[^\'">]+)') seed = 'http://httpbin.org/' stack = [seed] storage = {} while len(stack) > 0 and count > 0 : try: url = stack.pop(-1) html = requests.get(url).text new_urls = r.findall(html) stack.extend(new_urls) print(url+"下的url數(shù)量為:"+str(len(new_urls))) storage[url] = len(new_urls) count -= 1 except Exception as e : print(url) print(e)

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      BFS 和 DFS 各有好處,DFS 更容易陷入無(wú)限循環(huán),并且通常有價(jià)值的網(wǎng)頁(yè)不會(huì)隱藏的太深,所以 BFS 通常是更好的選擇。上面的代碼是利用 list 來(lái)模擬棧或隊(duì)列,Python 中還有一個(gè) Queue 模塊,其中包含了 LifoQueue 和 PriorityQueue,用起來(lái)會(huì)更加方便,

      3.2、數(shù)據(jù)更新策略

      抓取策略關(guān)注待抓取URL隊(duì)列,也就是互聯(lián)網(wǎng)中的待下載頁(yè)面的合集

      針對(duì)已下載的網(wǎng)頁(yè)來(lái)說(shuō),互聯(lián)網(wǎng)實(shí)時(shí)變化,頁(yè)面隨時(shí)會(huì)有變化

      更新策略決定何時(shí)更新之前已經(jīng)下載過(guò)的頁(yè)面

      常見的更新策略有以下幾種:

      歷史參考策略:根據(jù)頁(yè)面歷史數(shù)據(jù),預(yù)測(cè)頁(yè)面的變化

      用戶體驗(yàn)策略:總和用戶的瀏覽偏好,更新用戶關(guān)注度高的網(wǎng)頁(yè)

      聚類抽樣策略:根據(jù)頁(yè)面的類別,確定頁(yè)面的更新周期

      聚類策略的基本思路

      美好的日子總是短暫的,雖然還想繼續(xù)與大家暢談,但是本篇博文到此已經(jīng)結(jié)束了,如果還嫌不夠過(guò)癮,不用擔(dān)心,我們下篇見!

      好書不厭讀百回,熟讀課思子自知。而我想要成為全場(chǎng)最靚的仔,就必須堅(jiān)持通過(guò)學(xué)習(xí)來(lái)獲取更多知識(shí),用知識(shí)改變命運(yùn),用博客見證成長(zhǎng),用行動(dòng)證明我在努力。

      如果我的博客對(duì)你有幫助、如果你喜歡我的博客內(nèi)容,請(qǐng)“” “評(píng)論”“”一鍵三連哦!聽說(shuō)的人運(yùn)氣不會(huì)太差,每一天都會(huì)元?dú)鉂M滿呦!如果實(shí)在要白嫖的話,那祝你開心每一天,歡迎常來(lái)我博客看看。

      碼字不易,大家的支持就是我堅(jiān)持下去的動(dòng)力。后不要忘了關(guān)注我哦!

      Python 網(wǎng)絡(luò)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel怎么制作下拉菜單(excel如何制作下拉式菜單)
      下一篇:Django 視圖系統(tǒng)
      相關(guān)文章
      毛片亚洲AV无码精品国产午夜| 国产精品亚洲精品观看不卡| 亚洲av无码一区二区三区天堂| 久久亚洲日韩看片无码| 亚洲日本中文字幕区| 中文字幕不卡亚洲| 亚洲国产中文v高清在线观看| 综合一区自拍亚洲综合图区| 国产偷国产偷亚洲清高APP| 亚洲AV无码一区二区三区牲色| 亚洲人成色77777在线观看| 亚洲国产精品99久久久久久| 久久精品国产亚洲AV天海翼| 久久亚洲精品成人无码| www国产亚洲精品久久久日本| 亚洲国产成人AV网站| 五月婷婷亚洲综合| 亚洲一区无码精品色| 国产美女亚洲精品久久久综合| 亚洲午夜国产精品无码老牛影视| 久久精品国产69国产精品亚洲| 亚洲gv猛男gv无码男同短文| 亚洲精选在线观看| 亚洲无人区视频大全| 67194在线午夜亚洲| 亚洲免费网站观看视频| 亚洲成在人线在线播放无码| 国产AV无码专区亚洲AV琪琪| 亚洲日本一区二区一本一道| 精品亚洲综合久久中文字幕| 夜夜亚洲天天久久| 亚洲伊人久久大香线蕉| 亚洲欧洲精品成人久久曰| 精品久久久久亚洲| 久久国产成人精品国产成人亚洲| 亚洲精品成人无码中文毛片不卡| 久久丫精品国产亚洲av| 精品国产成人亚洲午夜福利| 四虎亚洲国产成人久久精品 | 国产亚洲AV夜间福利香蕉149| 国产亚洲综合久久系列|