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