初學(xué) Python 之爬蟲的簡單入門
一、 什么是爬蟲?
1. 簡單介紹爬蟲
?
爬蟲的 全稱為 網(wǎng)絡(luò)爬蟲,簡稱爬蟲 ,別名有 網(wǎng)絡(luò)機器人,網(wǎng)絡(luò)蜘蛛等等。
?
網(wǎng)絡(luò)爬蟲是一種自動獲取網(wǎng)頁內(nèi)容的程序,為搜索引擎 提供了重要的數(shù)據(jù)支撐。 搜索引擎通過網(wǎng)絡(luò)爬蟲技術(shù),將互聯(lián)網(wǎng)中 豐富 的網(wǎng)頁信息保存到本地,形成鏡像 備份 。 我們熟悉的 谷歌 、 百度本質(zhì)上也可 理解為 一種爬蟲。
?
如果形象地理解 ,爬蟲 就如同一只機器蜘蛛,它 的基本操作就是模擬人的行為去各個網(wǎng)站 抓取 數(shù)據(jù) 或返回數(shù)據(jù) 。
?
?
2. 爬蟲的分類
?
網(wǎng)絡(luò)爬蟲 一般分為傳統(tǒng)爬蟲和聚焦爬蟲。
?
傳統(tǒng)爬蟲從一個或若干 個 初始網(wǎng)頁的 URL 開始,抓取網(wǎng)頁 時 不斷從當前頁面上抽取新的 URL 放入隊列,直到滿足系統(tǒng)的一定條件 才停止,即 通過源碼解析來獲得想要的內(nèi)容。
?
聚焦爬蟲需要根據(jù)一定的網(wǎng)頁分析算法過濾與主題無關(guān)的鏈接,保留有用的鏈接并將其放入待抓取的 URL 隊列 ,再 根據(jù)一定的搜索策略從隊列中選擇下一步要抓取的網(wǎng)頁 URL ,并重復(fù)上述過程,直到滿足系統(tǒng)的一定條件 時停止 。另外,所有被爬蟲抓取的網(wǎng)頁 都 將會被系統(tǒng) 存儲、 分析、過濾,并建立索引,以便之后的查詢和檢索 ; 對于聚焦爬蟲來說,這一過程所得到的分析結(jié)果還可能對以后的抓取過程給出反饋和指導(dǎo)。
?
防爬蟲 :KS-WAF(網(wǎng)站統(tǒng)一防護系統(tǒng)) 將爬蟲行為分為搜索引擎爬蟲及掃描程序爬蟲,可屏蔽特定的搜索引擎爬蟲節(jié)省帶寬和性能,也可屏蔽掃描程序爬蟲,避免網(wǎng)站被惡意抓取頁面。 使用防爬蟲機制的基本上是 企業(yè) ,我們平時也能見到一些 對抗 爬蟲的經(jīng)典 方式 ,如 圖片驗證碼、滑塊驗證、封禁 IP 等等 。
?
?
3. 爬蟲的工作原理
下圖是一個網(wǎng)絡(luò)爬蟲的基本框架:
?
?
?
?
對應(yīng)互聯(lián)網(wǎng)的所有頁面可劃分為五部分:
?
?
1. 已下載未過期網(wǎng)頁 。
2. 已下載已過期網(wǎng)頁 :抓取到的網(wǎng)頁實際上是互聯(lián)網(wǎng)內(nèi)容的一個鏡像文件,互聯(lián)網(wǎng)是動態(tài)變化的,一部分互聯(lián)網(wǎng)上的內(nèi)容已經(jīng)發(fā)生了變化,這時,這部分抓取到的網(wǎng)頁就已經(jīng)過期了。
3. 待下載網(wǎng)頁 :待抓取 URL 隊列中的頁面。
4. 可知網(wǎng)頁 :既沒有被抓取也沒有在待抓取 URL 隊列中,但可通過對已抓取頁面或者待抓取 URL 對應(yīng)頁面進行分析獲取到的 URL ,認為是可知網(wǎng)頁。
5. 不可知網(wǎng)頁 :爬蟲無法直接抓取下載的網(wǎng)頁。
?
待抓取 URL 隊列中的 URL 順序排列涉及到抓取頁面的先后次序問題,而決定這些 URL 排列順序的方法叫做抓取策略。下面介紹六種常見的抓取策略:
?
1. 深度優(yōu)先遍歷策略
深度優(yōu)先遍歷策略是指網(wǎng)絡(luò)爬蟲從起始頁開始,由一個鏈接跟蹤到另一個鏈接,這樣不斷跟蹤鏈接下去直到處理完這條線路,之后再轉(zhuǎn)入下一個起始頁,繼續(xù)跟蹤鏈接。以下圖為例:
?
?
遍歷路徑: A-F-G ?E-H-I ?B C D
?
需要注意的是,深度優(yōu)先可能會找不到目標節(jié)點(即進入無限深度分支),因此,深度優(yōu)先策略不一定能適用于所有情況。
?
2. 寬度優(yōu)先遍歷策略
寬度優(yōu)先遍歷策略的基本思路是,將新下載網(wǎng)頁中發(fā)現(xiàn)的鏈接直接插入待抓取 URL 隊列的末尾。也就是指網(wǎng)絡(luò)爬蟲會先抓取起始網(wǎng)頁中鏈接的所有網(wǎng)頁,然后再選擇其中的一個鏈接網(wǎng)頁,繼續(xù)抓取在此網(wǎng)頁中鏈接的所有網(wǎng)頁。還是以上圖為例:
?
?
?
遍歷路徑:第一層: A-B-C-D-E-F ,第二層: G-H ,第三層: I
?
廣度優(yōu)先遍歷策略會徹底遍歷整個網(wǎng)絡(luò)圖,效率較低,但覆蓋網(wǎng)頁較廣。
?
3. 反向鏈接數(shù)策略
反向鏈接數(shù)是指一個網(wǎng)頁被其他網(wǎng)頁鏈接指向的數(shù)量。反向鏈接數(shù)反映一個網(wǎng)頁的內(nèi)容受到其他人推薦的程度。因此,很多時候搜索引擎的抓取系統(tǒng)會使用這個指標來評價網(wǎng)頁的重要程度,從而決定不同網(wǎng)頁的抓取先后順序。
?
而現(xiàn)實是網(wǎng)絡(luò)環(huán)境存在各種廣告鏈接、作弊鏈接的干擾,使得許多反向鏈接數(shù)反映的結(jié)果并不可靠。
?
4. Partial PageRank 策略
Partial PageRank 策略借鑒了 PageRank 算法的思想:對于已下載網(wǎng)頁,連同待抓取 URL 隊列中的 URL ,形成網(wǎng)頁集合,計算每個頁面的 PageRank 值,然后將待抓取 URL 隊列中的 URL 按照 PageRank 值的大小進行排列,并按照該順序抓取頁面。
?
若每次抓取一個頁面,就重新計算 PageRank 值,則效率太低。
一種折中方案是:每抓取 K 個頁面后,重新計算一次 PageRank 值。而對于已下載頁面中分析出的鏈接,即暫時沒有 PageRank 值的未知網(wǎng)頁那一部分,先給未知網(wǎng)頁一個臨時的 PageRank 值,再將這個網(wǎng)頁所有鏈接進來的 PageRank 值進行匯總,這樣就形成了該未知頁面的 PageRank 值,從而參與排序。以下圖為例:
?
?
設(shè) k 值為 3 ,即每抓取 3 個頁面后,重新計算一次 PageRank 值。
已知有 {1,2,3} 這 3 個網(wǎng)頁下載到本地,這 3 個網(wǎng)頁包含的鏈接指向待下載網(wǎng)頁 {4,5,6} (即待抓取 URL 隊列),此時將這 6 個網(wǎng)頁形成一個網(wǎng)頁集合,對其進行 PageRank 值的計算,則 {4,5,6} 每個網(wǎng)頁得到對應(yīng)的 PageRank 值,根據(jù) PageRank 值從大到小排序,由圖假設(shè)排序結(jié)果為 5,4,6 ,當網(wǎng)頁 5 下載后,分析其鏈接發(fā)現(xiàn)指向未知網(wǎng)頁 8 ,這時先給未知網(wǎng)頁 8 一個臨時的 PageRank 值,如果這個值大于網(wǎng)頁 4 和 6 的 PageRank 值,則接下來優(yōu)先下載網(wǎng)頁 8 ,由此思路不斷進行迭代計算。
?
5. OPIC 策略
此算法其實也是計算頁面重要程度。在算法開始前,給所有頁面一個相同的初始現(xiàn)金( cash )。當下載了某個頁面 P 之后,將 P 的現(xiàn)金分攤給所有從 P 中分析出的鏈接,并且將 P 的現(xiàn)金清空。對于待抓取 URL 隊列中的所有頁面按照現(xiàn)金數(shù)大小進行排序。
?
6. 大站優(yōu)先策略
對于待抓取 URL 隊列中的所有網(wǎng)頁,根據(jù)所屬的網(wǎng)站進行分類。待下載頁面數(shù)多的網(wǎng)站優(yōu)先下載。
?
?
二、爬蟲的基本流程
首先簡單了解關(guān)于 Request 和 Response 的內(nèi)容:
Request :瀏覽器發(fā)送消息給某網(wǎng)址所在的服務(wù)器,這個請求信息的過程叫做 HTTP Request 。
Response: 服務(wù)器接收瀏覽器發(fā)送的消息,并根據(jù)消息內(nèi)容進行相應(yīng)處理,然后把消息返回給瀏覽器。這個響應(yīng)信息的過程叫做 HTTP Response 。瀏覽器收到服務(wù)器的 Response 信息后,會對信息進行相應(yīng)處理,然后展示在頁面上。
?
根據(jù)上述內(nèi)容將網(wǎng)絡(luò)爬蟲分為四個步驟:
1. 發(fā)起請求 :通過 HTTP 庫向目標站點發(fā)起請求,即發(fā)送一個 Request ,請求可以包含額外的 headers 等信息,等待服務(wù)器響應(yīng)。
常見的請求方法有兩種, GET 和 POST 。 get 請求是把參數(shù)包含在了 URL ( Uniform Resource Locator, 統(tǒng)一資源定位符)里面,而 post 請求大多是在表單里面進行,也就是讓你輸入用戶名和秘密,在 url 里面沒有體現(xiàn)出來,這樣更加安全。 post 請求的大小沒有限制,而 get 請求有限制,最多 1024 個字節(jié)。
?
2. 獲取響應(yīng)內(nèi)容 :如果服務(wù)器能正常響應(yīng),會得到一個 Response , Response 的內(nèi)容便是所要獲取的頁面內(nèi)容,類型可能有 HTML , Json 字符串,二進制數(shù)據(jù)(如圖片視頻)等類型。
?
3. 解析內(nèi)容 :得到的內(nèi)容可能是 HTML ,可以用正則表達式、網(wǎng)頁解析庫進行解析。可能是 Json ,可以直接轉(zhuǎn)為 Json 對象解析,可能是二進制數(shù)據(jù),可以做保存或者進一步的處理。
在 Python 語言中,我們經(jīng)常使用 Beautiful Soup 、 pyquery 、 lxml 等庫,可以高效的從中獲取網(wǎng)頁信息,如節(jié)點的屬性、文本值等。
Beautiful Soup 庫是解析、遍歷、維護“標簽樹”的功能庫,對應(yīng)一個 HTML/XML 文檔的全部內(nèi)容。安裝方法非常簡單,如下:
?
# 安裝方法 pips install beautifulsoup4 # 驗證方法 from bs4 import BeautifulSoup
?
?
?
4. 保存數(shù)據(jù) :如果數(shù)據(jù)不多,可保存在 txt 文本、 csv 文本或者 json 文本等。如果爬取的數(shù)據(jù)條數(shù)較多,可以考慮將其存儲到數(shù)據(jù)庫中。也可以保存為特定格式的文件。
保存后的數(shù)據(jù)可以直接分析,主要使用的庫如下: NumPy 、 Pandas 、 Matplotlib 。
?
NumPy :它是高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ)包。
Pandas : 基于 NumPy 的一種工具,該工具是為了解決數(shù)據(jù)分析任務(wù)而創(chuàng)建的。它可以算得上作弊工具。
Matplotlib : Python 中最著名的繪圖系統(tǒng) Python 中最著名的繪圖系統(tǒng)。它可以制作出散點圖,折線圖,條形圖,直方圖,餅狀圖,箱形圖散點圖,折線圖,條形圖,直方圖,餅狀圖,箱形圖等。
?
?
三、爬蟲簡單實例
運行平臺: Windows
Python 版本: Python3.7
?
首先查看網(wǎng)址的源代碼,使用 google 瀏覽器,右鍵選擇檢查,查看需要爬取的網(wǎng)址源代碼,在 Network 選項卡里面,點擊第一個條目可看到源代碼。
第一部分是 General ,包括了網(wǎng)址的基本信息,比如狀態(tài) 200 等,第二部分是 Response Headers, 包括了請求的應(yīng)答信息 , 還有 body 部分,比如 Set-Cookie,Server 等。第三部分是, Request headers ,包含了服務(wù)器使用的附加信息,比如 Cookie,User-Agent 等內(nèi)容。
上面的網(wǎng)頁源代碼,在 python 語言中,我們只需要使用 urllib 、 requests 等庫實現(xiàn)即可,具體如下。
?
import urllib.request import socket from urllib import error try : response = urllib.request.urlopen( ' https://www.python.org ' ) print (response.status) print (response.read().decode( ' utf-8 ' )) except error.HTTPError as e: print (e.reason,e.code,e.headers,sep= ' \n ' ) except error.URLError as e: print (e.reason) else : print ( ' Request Successfully ' )
?
運行結(jié)果如下:
?
?
?
?
?
四、關(guān)于入門爬蟲
在如今這個信息爆炸的大數(shù)據(jù)時代,數(shù)據(jù)的價值是可觀的,而網(wǎng)絡(luò)爬蟲無疑是一個獲取數(shù)據(jù)信息的便捷途徑。合理利用爬蟲爬取有價值的數(shù)據(jù),可以為我們的生活提供不少幫助。
?
實際上,關(guān)于網(wǎng)絡(luò)爬蟲,我完全是一個新手,寫下這篇博客的途中也同時在零基礎(chǔ)學(xué)習。
?
首先,我了解到 python3 的語法是需要掌握的,因為要打好基礎(chǔ)。不過 python3 語法很簡潔,學(xué)起來應(yīng)該不會過分吃力。
?
接著是 python 的各種庫,目前接觸的不多,像我這種還是從基礎(chǔ)的庫開始學(xué)習會比較好,比如 urlib 、 requests 。
?
在學(xué)習過程中也了解到現(xiàn)在很多大型企業(yè)在使用反爬蟲機制,爬蟲過程中可能會返回非法請求,需要使用代理防止封禁 IP ,爬取網(wǎng)頁需要偽裝成平時正常使用瀏覽器那樣。這又是另外要解決的問題了。
?
總之,對于新手來說是需要一步一步花時間深入學(xué)習的,平時也得多加練習,畢竟學(xué)習之事并非一朝一夕就能促成,重要的是堅持吧。
?
?
?
?
參考資料:
https://blog.csdn.net/a575553272/article/details/80265182
https://blog.csdn.net/byweiker/article/details/79234854
https://blog.csdn.net/weixin_42530834/article/details/80787875
https://mp.weixin.qq.com/s?__biz=MzUyODcxMjI1Nw==&mid=2247484287&idx=1&sn=a8cd321702e5ff844042d1bd73c9dafc&chksm=fa6d5451cd1add4765028169c34ea5af1c3f7a8dffc955b270b2f91125ffeca0c22357f73a59#rd
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
