大數(shù)據(jù)服務(wù)上云的思考">大數(shù)據(jù)服務(wù)上云的思考
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
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)容。