1.網頁分析
爬蟲嘛,最主要還是先分析分析網頁。
網頁的載入方式:發現是純靜態載入的,說明資料就在html檔案裡;
如何翻頁:通過觀察發現**是通過url的引數「k」控制職位關鍵字,引數「p」控制頁碼,所以「資料探勘」職位第一頁的請求url是「資料探勘&p=1」,「資料探勘」職位第二頁的請求url是「資料探勘&p=2」,以此類推;
請求方法:get
是否需要驗證頭資訊:不曉得,需要**測試
2.**測試
那就來測試一下。
首先在實習僧中搜尋「資料探勘」,並開啟ipython,把requests庫匯入進來。
import requests
第一頁長這樣:
嘗試請求一下第一頁, 把狀態碼打出來看看。
response = requests.get(「資料探勘&p=1」)print(response.status_code)
狀態碼是200,喜出望外,心想這**也太好爬了吧,竟然連頭資訊都不需要驗證。有點不敢相信,想再瞅一眼文字內容。
print(response.text[:100])
確實返回了真實的文字,這就好辦了,嘗試解析一下,提取出所有的職位名稱,這裡使用的是xpath選擇器。
from lxml import etreeparsed_text = etree.html(response.text)parsed_text.xpath(『//*[@class="name-box clearfix"]/a/text()』)
成功返回乙個列表的資料,大功告。。。wait,好像有點不大對勁,這夾雜在文字當中的是啥玩意兒?**給我投毒了?
第一反應是編碼問題,但是想想也不對啊,要是編碼問題的話,怎麼又有一部分中文可以顯示呢?再測試了一下薪酬,問題更嚴重,數字全都無法正常顯示。
在元素檢查視窗發現,這些都顯示成了小框框,怎麼辦呢?
3.尋找解決辦法
秉著不被打臉的想法以及按捺不住的好奇,我開啟了網頁源**,看看這個顯示為框框的字元,在源**裡是怎麼顯示的。發現數字在裡面又被顯示成:
這才反應過來,應該是字型被加密了。再翻了翻網頁源**,在
這後面的一長串亂碼,便是經過base64加密的「自定義unicode-字元對映」字型,正常瀏覽網頁時被瀏覽器載入進網頁。
因此,為了防止爬蟲採集**資料,可愛的前端工程師可以自己建立一套自己的字型,也就是這裡的myfont,設定自定義的unicode-字元對映關係,比如說這裡的「ec8c」對映的是字元「0」,「e55f」對映的是字元「1」等等(這個對映關係是可以自定義的),並通過base64加密一下,放進網頁源**中。
當某些資料需要防止爬蟲爬取時,便指定使用myfont這個自定義字型,因此,正常瀏覽時,網頁中的字型會被對映成正常的123…的數字,但是網頁源**中卻是自定義的編碼,爬蟲採集的是網頁源**,所以採集到的也是自定義的編碼,採集不到正常的資料。
如何解決?
其實方法有很多:
第一種是破譯對映關係:把剛剛那一長串加密的文字弄下來,用base64解一下碼(在python中可以使用pybase64包),儲存為.ttf字型檔案,然後使用fontforge找字元的對映關係。不過這種方法稍微有些麻煩了。具體可見:傳送門1:
第二種方法是文字識別:也看到有人實現了,即使用自動化測試工具selenium定位到資料,使用pil影象處理包截圖儲存資料,然後使用機器學習或者ocr識別出中的文字。這種方法就更加麻煩了。如果使用機器學習的話,還需要人工打標,訓練資料不大的話效果還不太理想,想一想畫面很美,還是算了。具體可見:傳送門2:
第三種更加直接:由於需要尋找的字元對映並不多(最主要是找到數字的對映),如果每次所爬網頁載入的字元對映關係是不變(或者一段時間內不變)的話,直接觀察網頁尋找字元對映關係應該更加快捷,也更加巧(bao)柔(li)。我當然是毫不猶豫地選擇了第三種。
4.尋找對映
於是,開搞!
通過比對發現,「實習僧**」每次網頁載入的字元對映確實是一段時間內不變的。那麼只需要觀察網頁源**與對應的瀏覽器顯示的數字,便可找到對映關係。
把最終找到的數字對映關係儲存為乙個字典(注意,根據觀察,這個對映關係好像是每天更新一次,所以需要自己去找這個對映,不能照抄):
嘿,發現結果如下:
這裡便是「實習僧**」所有進行自定義對映的字元,發現數字全部都進行了對映加密, 還有大小寫字母。
同時,還有小部分跟職位有關的字,比如說「工」、「程」、「師」等也都被加密了,這就是第一條記錄的職位「爬蟲工程師實習生」會被顯示成「爬蟲\uf37e\ueee1\uf5fc實習\ue87d」的原因。
那為什麼不把全部的字型都進行加密呢?
還是因為中文字型庫太大的原因,所以只加密了很小一部分的職位關鍵字。不過我需要進行爬取的中文文字資訊,比如說職位名稱,在職位詳情頁和公司詳情頁都有未加密的,可以直接爬取,所以只找數字的對映關係就ok了。利用icomoon找到的數字對映關係如下:
發現跟我使用人工尋找的對映關係完全一致。說明尋找對映關係大功告成。接下來便是定爬取目標和寫**的事情了。
5.兢兢業業寫**
爬取目標:
爬取「資料探勘」、「機器學習」兩個職位下的實習資訊
爬取搜尋記錄中每條職位記錄的職位詳情頁的職位資訊
爬取搜尋記錄中每條職位記錄對應的公司詳情頁的公司資訊
首先,定義乙個爬取的函式,引數為需要爬取的職位:job,以及這個職位總共的頁數:pages。我們執行這個函式的時候,只需要傳入職位和頁數便可爬取這個職位所有頁數的資料,並且儲存到csv檔案中。
另外,測試了一下,**除了加密字型反爬之外,好像就沒有其它的反爬限制了。所以,其它部分的**基本上就是文字匹配的體力活。在這裡就不贅述了。**的關鍵步驟和函式都加上了注釋,github傳送門為:
最後便剩下除錯執行啦。執行結果:
再看一眼.csv檔案,比對一下資料是否可以對應上,確保**沒有給我投毒。發現資料是正確的。可以安心了。
最後爬取回來的資料(不要問excel為什麼開啟是亂碼):
Python爬蟲加密
在開發爬蟲的過程中,我們經常遇到的一種反爬措施是資料加密。常見的加密演算法可以分為三類 對稱加密演算法,非對稱加密演算法和hash演算法 事實上不是加密演算法而是摘要演算法 採用單鑰密碼系統的加密方法,同乙個金鑰可以同時用作資訊的加密和解密,這種加密方法稱為對稱加密,也稱為單金鑰加密。由於其速度快,...
python之文字爬蟲
python之文字爬蟲 用python做可以讀取到網頁源 靜態網頁 的方法。分析 1,獲取網頁源 儲存。2,讀取檔案。3,匹配要抓取的內容。4,完成儲存。以抓取網頁為例 coding uft8 匯入所需庫檔案 import re impore requests 讀取源 檔案 f open 檔名稱 r...
Python文字爬蟲實戰
一 流程 1 獲取網頁原始碼 2 用python讀取原始碼 二 實現 1 原始碼獲取 文字爬蟲,是在已有的文字內容中爬取需要的資訊,這區別於網路爬蟲。由於被檢索的內容是現成的,因此,文字爬蟲又叫 半自動爬蟲 在本例中,我們以暱圖網首頁為目標 因此,我們先到暱圖網首頁,右鍵 檢視源 儲存原始碼到txt...