學Py日記——關於網路爬蟲的一些總結
- 2020 年 3 月 31 日
- 筆記
學習Python網路爬蟲近3周時間了,也分別針對「命運共同體」、「京東米酒」和「獵聘網Python招聘」3個事件進行了爬取和數據分析,有了初步的知識積累。現做簡單總結,以資深化理解。
【0】關於python版本的選擇、IDE選擇和lib庫安裝
A.版本選擇。目前python存在兩類大的版本,即2.x和3.x,與其他軟體向下兼容不同,這倆大的版本完全是兩類版本,無論是語法風格還是功能都各有不同。總體而言,2.x偏向成熟穩定,支援各種工具庫比較多,網上的各種教程和部落格多是基於2.x版本;3.x則對編碼問題有著更好的兼容性,更能代表未來主流。2.x和3.x的一個最簡單的區別就是列印命令:print 「hello world」就是2.x, print(「hello world」)則是3.x。
B.IDE,中文名稱為集成開發環境,目前已接觸過3個,分別是純粹的Python Idle、Sublime text3和PyCharm,總體感覺Idle最為輕便,也是其他各類Python Ide賴以工作的前提和依據,可以理解為其他ide只是在它的基礎上加裝了一個外殼,更加方便簡潔而已,但真正的解釋執行歸根結底還是要靠idle,缺點是不帶編碼提示、色彩區分以及各種編寫上的低效;Sublime text3嚴謹的說算是一個多功能的文本編輯器,只不過可以通過不同的設置和插件使其適用於python編寫和執行,借用大家慣用的話叫「相比Idle的純白如雪,Sublime text3真是五彩繽紛」,而且更重要的它還是一個輕量級的,響應快速,簡單使用,目前用著最為順手;而PyCharm則相對功能十分豐富,體積也更大,也算是Python的專業開發環境,缺點是啟動較慢,使用複雜,不易上手。
C.Python的強大要得益於各類第三方lib庫的存在,那麼就自然涉及到安裝。在idle和sublime中,都可以依託cmd工具用「pip install xxx」的方式安裝,非常方便,如果不能直接安裝那麼可以下載.whl文件安裝,其中直接安裝工具包可以在任意cmd路徑,而安裝.whl文件則要先切換到文件所在路徑在pip install xxx.whl。這裡還要注意pip能夠使用也是有前提的,一是安裝了pip包,二是加入了環境變數。
【1】爬蟲的一般流程
所謂爬蟲,個人理解無非就是通過一定的規則教會程式去自動遨遊在廣袤的網路中,提取想要的各類資訊。爬蟲它其實很笨,因為它只會按照編程者的既定規則去找尋目標數據,但凡有丁點的語法錯誤或者資訊不匹配,哪怕要找的數據就在你的隔壁,它也不能完成任務;同時它又很勤勞,你只要教給它正確的方法,它便能又快又好的提取大量數據。這可能也是電腦程式執行的最大特點。欲用爬蟲,先論其道,再賦其術。
A.網頁響應。網路世界資訊繁雜,但追根溯源還是要從一個請求——發送的響應說起。客戶端(用戶端)發送一個請求,裡面包含著編碼後的協議、目標地址和請求等資訊,前往伺服器(目標端)去握手和取得一致,而後再將伺服器的數據帶回來,經解碼後顯示在客戶端。這是舉網頁的例子,那麼其他軟體其實是類似的,包括手機端APP,簡單的理解就是給網頁加裝了個外殼,添加一些特定的功能而已。而爬蟲要想提取數據,則就是要模擬客戶端訪問伺服器,然後將要要得到的數據帶回來,供後續選擇提取。包括有時為了抓取軟體的數據包,還要藉助一些代理工具(fiddler比較好用),無非就是讓網路資訊強制的通過代理工具,進而為python提取響應提供便利,不然就不可控了。
B.解碼資訊。直接從伺服器得到的網頁響應是一片荒蕪待開發的資訊大海,如果不加以解析提取則就失去了自動爬蟲的意義。提取的工具和提取的資訊都將依不同網頁類型而異。
所以,總結來看,實現一個網路爬蟲總共就分兩步:1.獲取網頁,2.解碼響應得到資訊。當然,僅僅做到這兩步一般是不夠的,所以一般需要進行多次循環:如先從一個源網頁的響應中提取出若干子網頁的URL資訊,然後再通過各子網頁URL獲得響應,進而得到響應和待提取資訊。甚至還可以繼續從子網頁的響應中繼續提取子子網頁URL資訊,繼續循環提取,直至滿足一定的終止條件。
【2】獲取網頁響應的方法
A.常用的獲取網頁響應方法有兩種,一個是urllib庫,為python自帶,另一個是第三方requests庫。
Python3中的Urllib庫是集成了2.x中的urllib和urllib2兩個庫,所以import時也可以分模組引用,如import urllib.request,import urllib.parse等,常用的獲取響應方法也有兩種,一個是req=urllib.request.Request(url,headers),然後req= urllib.request.urlopen(req),這是應用urllib庫加模擬頭的方法,如果不需要模擬頭那麼直接urllib.request.urlopen(url)即可得到響應(也就是說urlopen函數既可以直接接收url參數,也可以接收響應),Urlopen函數返回值加.read().decode()即可得到響應文本。
就獲取網頁響應而言,相比來看requests庫應用更加簡潔,requests庫主要有7個函數,常用的就是get()和post()函數,requests.get(url,headers)
B.獲取URL規律的方法
一般系列搜索網頁都有著極強的規律,如「基準url&關鍵詞&偏移頁&網頁ID」等等,個別的會加時間戳(timestamp)。可以先把幾個網頁一起複制下來對比,找到其中變化的部分,然後大刀闊斧的將其餘都精簡掉,試試能否打開得到響應內容,一般按照這個方法就能得到url變化規律,當然也可以通過分析開發者工具中給出的Query String參數來推斷。在有的動態網頁中,還需要單獨構建json網頁中的內容,這時候可藉助google瀏覽器,在network中逐個查找響應內容,然後查找響應的請求url,再構建即可。這個是逐步積累經驗的過程,看的多了可以迅速憑直覺推斷。
C.構建動態url的三種方式
1.將複雜url分解為幾段,如url1=固定段1,url2=變化欄位,如搜索結果中偏移頁面,url3=其他固定頁面,然後進行直接拼接url=url1+url2+url3
2.引用字元串格式化方法,url=』http://www.{0}.{1}』.format(『baidu』,』com』)
3.採用字典形式的參數,如params = {'key1': 'value1','key2':'value2'},應用urllib庫時用urllib.parse.urlencode()函數編碼成url參數,然後url = base_url + urllib.parse.urlencode(params)得到最終url,應用request庫時則可以帶paras參數的get函數,requests.get(url, params=params)
D.URL去重
通過源網頁→子網頁的方式實現網頁遍歷,往往帶來的問題是容易存在重複(獵聘網中不同搜索頁之間就存在大量重複),這是就需要構建已訪問頁面集合的問題,有兩種思路,一種是構建一個集合或列表,每次找到新url時都先檢查是否在已訪問集合中,避免重複訪問;另一種思路是應用資料庫,每次從資料庫比對。前者適用於訪問規模較小時,速度快,佔用記憶體可控;後者適用於訪問規模很大時,雖然速度不快,但可避免大規模佔用記憶體。另外,藉助記憶體建立列表時還可考慮簡化存儲的問題,如只提取網頁中的關鍵資訊(如標誌性ID等)或進行MD5編碼存儲,這都可以實現記憶體佔用的大大降低。
E.帶Cookie獲取
理想情況下,掌握前面三板斧可以解決很多網頁的響應問題,尤其是對於靜態網頁而言更是簡單至極。但難點是現在很多網站都引入了反爬機制,一個簡單的模擬頭是不足以解決問題的,這時候就需要帶著cookie去獲取網頁響應,有的還要模擬登錄。這是下步學習重點。
【3】從網頁響應中提取資訊的方法
在得到網頁響應後,最重要的就是如何獲取感興趣資訊的問題。目前主要用到了3種方式,Beautiful soup(美麗湯),Re(Regular Expression,正則)和Xpath(XML路徑)。
A.Beautifulsoup,對得到的網頁響應進行beautiful soup後,實際上是相當於進行了按照一定規則進行重組,類似樹,然後即可以通過一定條件查找響應的節點或者帶屬性查找節點,進而找到所有節點資訊。
B.Re,正則表達式很強大,構建一個合理的表達式能夠匹配出任何想要的資訊,尤其適用於在複雜文本中提取關鍵資訊,如提取日期、電話號等等。前提是構建一個準確的正則表達式,這是一門大學問。
C.Xpath,尤其適用於網頁構建高度統一的情形,可以按照固定地址去找尋響應資訊,非常好用。打個簡單的比方就是知道了某省某市某區某街道後,找尋該街道上的某一屬性的資訊,如該街道上的所有酒店。
個人喜好的優先順序:Xpath→Beautiful soup→Re,當然還需因情況而異。
【4】對爬取數據的清洗和處理
一般而言,直接爬取的數據會包含一些雜質,如某些資訊條目缺失、數據不滿足要求、數據重複等問題,這就涉及到數據清洗問題。最簡單的數據清洗方法可依託Excel來進行,這也是一款極其強大的數據處理工具,解決少量的數據處理和資訊提取乃至可視化都十分強大。應用Excel進行數據清洗的幾個小技巧:刪除重複值,按規則突出顯示,排序,字元串提取,列舉幾個非常好用的函數,If和Ifs,IsNumber,Countif和Countifs,Sumif和Sumifs,vlookup,Left和LeftB,Len和LenB等等,這些可以實現很多常用的數據處理功能,而應用數據透視表和數據透視圖即可實現很多可視化功能。工具是好工具,但要想全面深入掌握還是要下點功夫的。
【5】數據可視化的幾個思維
從網頁中爬取數據不是我們的最終目的,而是要將其進行挖掘提取得到有價值的資訊。為了更好的彰顯自己的數據分析結論,數據可視化又是最好的形式,沒有之一。「一圖頂千字」,「字不如表,表不如圖」,都是最好的概括。
常用的分析思維(套路)包括:
A.看分布。適用於分析某一資訊隨單變數的分布情況。例如,隨時間變化,如月初月中月末分布曲線,一年四季分布,早中晚分布等等,看隨時間的相關性;隨地域分布,最簡單的是用python的地圖顯示,或者excel中的熱力圖,明確凸顯不同地域的分布情況;隨人員分布,如不同身份人員是否帶來較大差異,人員性別有無明顯差異,不同年齡段帶來的變化。因為是單變數分析,所以更多的是用分布就能表達觀點,包括常用的餅圖,直方圖,曲線圖等等,多維時可用散點圖。
B.看聯繫。適用於找出某兩個屬性間的內在關係,最多的就是查找相關性,可以用Excel中數據分析-相關係數進行分析,包括線性回歸等等,這可以清晰得出二者之間關聯性有多大。
C.看對比。比如分析兩種條件下某一資訊變化情,最適合用對比的方式給出圖表,如變化曲線,直方圖分布等等,這也是最能通過互相傷害得出直接結論的方式。
D.看詞雲。這是python最好用的一個工具,對於給定文本進行詞雲分析,得出不同關鍵詞的詞頻,得出文本中具有一定傾向性的熱詞。甚至還可以進行情緒分析,得出喜好憎惡。