文章目錄
- 一、概述
- 二、原理
- 三、爬蟲分類
- 1、傳統爬蟲
- 2、聚焦爬蟲
- 3、通用網路爬蟲(全網爬蟲)
- 四、網頁抓取策略
- 1、寬度優先搜索:
- 2、深度優先搜索:
- 3、最佳優先搜索:
- 4、反向鏈接數策略:
- 5、Partial PageRank策略:
- 五、網頁抓取的方法
- 1、分布式爬蟲
- 現在比較流行的分布式爬蟲:
- 2、Java爬蟲
- 3、非Java爬蟲
- 六、專案實戰
- 1、抓取指定網頁
- 抓取某網首頁
- 2、抓取包含關鍵詞網頁
- 3、下載貼吧中圖片
- 4、股票資料抓取
- 六、結語
一、概述
網路爬蟲(Web crawler),又稱為網路蜘蛛(Web spider)或網路機器人(Web robot),主要用來爬取目標網站內容的程式或腳本,
從功能上來區分網路爬蟲:
- 資料采集
- 資料處理
- 資料儲存
以上三個部分,基本作業框架流程如下圖:

二、原理
- 功能:下載網頁資料,為搜索引擎系統提供資料來源,
- 組件:控制器、決議器、資源庫,
Web網路爬蟲系統首先將種子URL放入下載佇列,然后簡單地從隊首中取出一個URL下載其對應的網頁,得到網頁的內容將其儲存后,再經過決議網頁中的鏈接資訊可以得到一些新的URL,將這些URL加入下載佇列,然后取出一個URL,對其對應的網頁進行下載,再決議,如此反復進行,直到遍歷了整個網路或滿足某種條件后才會停止下來,
三、爬蟲分類
1、傳統爬蟲
傳統爬蟲從一個或若干初始網頁的URL開始,獲得初始網頁上的URL,在抓取網頁程序中,不斷從當前頁面上抽取新的URL放入佇列,直到滿足系統的一定停止條件,
2、聚焦爬蟲
聚焦爬蟲作業流程較為復雜,需要根據一定的網頁分析演算法過濾與主題無關的鏈接,保留有用鏈接并將其放入等待抓取URL佇列,然后它將根據一定搜索策略從佇列中選擇下一步要抓取的網頁URL,并重復上述程序,直到達到系統某一條件時停止,另外所有被爬蟲抓取的網頁將會被系統存盤,進行一定的分析、過濾,并建立索引,以便之后的查詢和檢索,對于聚焦爬蟲來說,這一程序所得到的分析結果還可能對以后的抓取程序給出反饋和指導,
3、通用網路爬蟲(全網爬蟲)
通用網路爬蟲又稱全網爬蟲, 爬行物件從一些種子URL擴充到整個Web,主要為門戶站點搜索引擎和大型Web服務提供商采集資料,這類網路爬蟲的爬行范圍和數量巨大,對于爬行速度和存盤空間要求較高,對于爬行頁面順序要求相對較低,同時由于待重繪頁面太多,通常采用并行作業方式,但需要較長時間才能重繪一次頁面,雖然存在一定缺陷, 但通用網路爬蟲適用于為搜索引擎搜索廣泛的主題,有較強應用價值,
實際的網路爬蟲系統通常是幾種爬蟲技術相結合實作的,
四、網頁抓取策略
在爬蟲系統中,待抓取URL佇列是很重要的一部分,佇列中URL以什么樣順序排列也是一個很重要的問題,因為這涉及先抓取哪個頁面,后抓取哪個頁面,
而決定這些URL排列順序的方法,稱之為抓取策略,
1、寬度優先搜索:
在抓取程序中,在完成當前層次搜索后,才進行下一層次搜索,
- 優點:演算法設計和實作相對簡單,
- 缺點:隨著抓取網頁增多,大量無關網頁將被下載并過濾,演算法效率將變低,
2、深度優先搜索:
從起始網頁開始,選擇一個URL進入,分析這個網頁中的URL,一個鏈接一個鏈接地抓取下去,直到處理完一條路線之后再處理下一條URL中的路線,
例如,下圖中深度優先搜索的遍歷方式時 A 到 B 到 D 到 E 到 F(ABDECF),而寬度優先搜索的遍歷方式是 A B C D E F ,

3、最佳優先搜索:
按照一定的網頁分析法,預測候選URL與目標網頁的相似度,或者與主題的相關性,并選取評價最好的一個或幾個URL進行抓取,
4、反向鏈接數策略:
反向鏈接數是指一個網頁被其他網頁鏈接指向的數量,反向鏈接數表示的是一個網頁的內容受到其他人的推薦程度,
5、Partial PageRank策略:
Partial PageRank演算法借鑒了PageRank演算法的思想,對于已經下載的網頁,連同待抓取URL佇列中的URL,形成網頁集合,計算每個頁面的PageRank值,計算完之后,將待抓取URL佇列中的URL按照PageRank值的大小排列,并按照該順序抓取頁面,
五、網頁抓取的方法
1、分布式爬蟲
用于目前互聯網中海量URL管理,它包含多個爬蟲(程式),每個爬蟲(程式)需要完成的任務和單個爬行器類似,它們從互聯網上下載網頁,并把網頁保存在本地的磁盤,從中抽取URL并沿著這些URL的指向繼續爬行,由于并行爬行器需要分割下載任務,可能爬蟲會將自己抽取的URL發送給其他爬蟲,
這些爬蟲可能分布在同一個局域網之中,或分散在不同地理位置,
現在比較流行的分布式爬蟲:
- Apache Nutch: 依賴hadoop運行,hadoop本身會消耗很多時間,Nutch是為搜索引擎設計的爬蟲,如果不是要做搜索引擎,盡量不要選擇Nutch,
2、Java爬蟲
用Java開發的抓取網路資源的小程式,常用的工具包括Crawler4j、WebMagic、WebCollector等,
3、非Java爬蟲
- Scrapy: 由Python撰寫的,輕量級的、高層次的螢屏抓取框架,最吸引人的地方在于Scrapy是一個框架,任何使用者可以根據自己的需求進行進行修改,并具有一些高級函式,可以簡化抓取程序,
六、專案實戰
1、抓取指定網頁
抓取某網首頁
使用urllib模塊,此模塊提供了讀取Web頁面資料介面,可以像讀取本地檔案一樣讀取www和ftp上的資料,urllib是一個URL處理包,這個包中集合了一些處理URL的模塊,
- urllib.request 模塊: 用來打開和讀取URLs的,
- urllib.error 模塊: 包含一些由 urllib.request 產生的錯誤,可以用try進行捕捉處理,
- urllib.parse 模塊: 包含一些決議 URLs的方法,
- urllib.robotparser: 用來決議 robots.txt 文本檔案,它提供了一個單獨的 RobotFileParser 類,通過該類提供的 can_fetch() 方法測驗爬蟲是否可以下載一個頁面,
以下代碼為抓取某網頁的代碼:
import urllib.request
url = "https://www.douban.com/"
# 這邊需要模擬瀏覽器才能進行抓取
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'}
request = urllib.request.Request(url, headers=headers)
response = urllib.request.urlopen(request)
data = response.read()
# 這邊需要轉碼才能正常顯示
print(str(data, 'utf-8'))
# 下面代碼可以列印抓取網頁的各類資訊
print(type(response))
print(response.geturl())
print(response.info())
print(response.getcode())
2、抓取包含關鍵詞網頁
代碼如下:
import urllib.request
data = {'word': '海賊王'}
url_values = urllib.parse.urlencode(data)
url = "http://www.baidu.com/s?"
full_url = url + url_values
data = urllib.request.urlopen(full_url).read()
print(str(data, 'utf-8'))
3、下載貼吧中圖片
代碼如下:
import re
import urllib.request
# 獲取網頁源代碼
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html
# 獲取網頁所有圖片
def getImg(html):
reg = r'src="([.*\S]*\.jpg)" pic_ext="jpeg"'
imgre = re.compile(reg)
imglist = re.findall(imgre, html)
return imglist
html = getHtml('https://tieba.baidu.com/p/3205263090')
html = html.decode('utf-8')
imgList = getImg(html)
imgName = 0
# 回圈保存圖片
for imgPath in imgList:
f = open(str(imgName) + ".jpg", 'wb')
f.write((urllib.request.urlopen(imgPath)).read())
f.close()
imgName += 1
print('正在下載第 %s 張圖片 ' % imgName)
print('該網站圖片已經下載完')
4、股票資料抓取
代碼如下:
import random
import re
import time
import urllib.request
# 抓取所需內容
user_agent = ["Mozilla/5.0 (Windows NT 10.0; WOW64)", 'Mozilla/5.0 (Windows NT 6.3; WOW64)',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; rv:11.0) like Gecko)',
'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1',
'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3',
'Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12',
'Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0',
'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.12) Gecko/20080219 Firefox/2.0.0.12 Navigator/9.0.0.6',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0)',
'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Maxthon/4.0.6.2000 Chrome/26.0.1410.43 Safari/537.1 ',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E; QQBrowser/7.3.9825.400)',
'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:21.0) Gecko/20100101 Firefox/21.0 ',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.92 Safari/537.1 LBBROWSER',
'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0; BIDUBrowser 2.x)',
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/3.0 Safari/536.11']
stock_total = []
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.106 Safari/537.36'}
for page in range(1, 8):
url = 'http://quote.stockstar.com/stock/ranklist_a_3_1_' + str(page) + '.html'
request = urllib.request.Request(url=url, headers={"User-Agent": random.choice(user_agent)})
response = urllib.request.urlopen(request)
content = str(response.read(), 'gbk')
pattern = re.compile('<tbody[\s\S]*</tbody')
body = re.findall(pattern, str(content))
pattern = re.compile('>(.*?)<')
# 正則匹配
stock_page = re.findall(pattern, body[0])
stock_total.extend(stock_page)
time.sleep(random.randrange(1, 4))
# 洗掉空白字符
stock_last = stock_total[:]
print(' 代碼', '\t', ' 簡稱', '\t', '最新價', '\t', '漲跌幅', '\t', '漲跌額', '\t', '5分鐘漲幅')
for i in range(0, len(stock_last), 13):
print(stock_last[i], '\t', stock_last[i + 1], '\t', stock_last[i + 2], ' ', '\t', stock_last[i + 3], ' ', '\t',
stock_last[i + 4], '\t', stock_last[i + 5])
六、結語
以上使用Python版本為 3.9,
本篇內容參考自《Python3 資料分析與機器學習實戰》一書,撰寫此篇以學習為主,
都看到這兒啦,來個一鍵三連唄 (′▽`???)
寫完就有點懶洋洋的咩~(+ω+)

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/301284.html
標籤:其他
上一篇:和老婆的一次真實對話
