1. 程式人生 > >爬蟲入門到放棄系列03:爬蟲如何模擬人的瀏覽行為

爬蟲入門到放棄系列03:爬蟲如何模擬人的瀏覽行為

![](https://img-blog.csdnimg.cn/20210201173634123.png) ## 前言 上一篇文章主要講了如何解析網頁,本篇文章主要來寫一下如何發起請求。可能看過前兩篇文章的人就開始疑惑了,請求?你不是說一行程式碼就可以搞定了麼。的確,一行程式碼就能搞定。但是請求部分既然扮演著瀏覽器的角色,我們是不是應該儘量讓它變得和瀏覽器一樣。而我在第一篇文章中也講到,爬蟲是模擬人的行為去獲取資料。那麼我們就需要知道,一個人去訪問網站有什麼樣的行為?爬蟲怎麼去模擬人的行為? ## 請求頭 當一個人開啟瀏覽器輸入網址敲下回車,會發起一個HTTP請求,即Request,來訪問網站服務端,服務端接收請求並返回響應內容,即Response。在發起請求時,Request會有一個請求頭,即Headers,來描述請求資訊,例如Content-type、User-Agent、cookie等。相對的也會有一個響應頭,這裡不多關注。 ### User-Agent 在爬蟲程式的開發中,請求頭中必須新增的就是**User-Agent**。UA記錄了瀏覽器、作業系統、版本等資訊,很多網站會通過檢測UA來判斷是否是爬蟲程式發起的請求。 Chrome瀏覽器請求頭資訊: ![Chrome Request Headers](https://img-blog.csdnimg.cn/20210205160142190.jpg) 爬蟲程式請求頭資訊: ![Python Request Headers](https://img-blog.csdnimg.cn/2021020515402547.jpg) 從上圖可以看出,Python爬蟲的UA預設的python-requests,所以我們要修改爬蟲程式的UA。 ![修改請求頭](https://img-blog.csdnimg.cn/20210206162721767.jpg) 我們通過**headers**引數在請求頭新增UA,這樣預設的UA就會被修改。 ### cookie 至於其他屬性,比較關注的就是cookie。在web開發中,服務端在使用者第一次訪問時生成cookie,並通過響應頭中的Set-Cookie屬性,返回瀏覽器並被持久化。在cookie的有效期內訪問服務端,瀏覽器都會在請求頭中帶著cookie,以此來表明自己的身份。 這裡以百度網盤為例來說明。 這時我還沒有登入百度網盤,同時清理了瀏覽器中所有關於百度網盤的cookie。第一次訪問分享連結時,服務端通過響應頭會返回一個cookie給瀏覽器。 ![Set-Cookie](https://img-blog.csdnimg.cn/20210205170216709.jpg) 當我重新整理頁面再次請求時,請求頭中就有了之前cookie屬性。 ![cookie](https://img-blog.csdnimg.cn/20210205171308859.jpg) 到這裡,cookie的來源和基本用法其實就講完了。為了更好的去讓大家瞭解一下cookie,我又多寫了一部分。 此時訪問任何有提取碼的分享連結,仍然都需要輸入提取碼,因為我們沒有登陸百度網盤,目前的cookie不足以向百度網盤表明我的使用者資訊。但是,如果我們在登入了百度雲盤賬號的瀏覽器中,訪問自己的分享連結則不需要輸入提取碼,就是下面這種情況。 ![賬號資訊](https://img-blog.csdnimg.cn/20210206175742798.jpg) 再次強調,是**訪問自己賬號分享的資源連結不需要輸入提取碼**。 我登入了自己百度雲盤後,開始訪問自己的分享連結,沒有輸入提取碼就直接訪問到了資源,*這是為啥?這就是cookie的力量*!!。 登入百度網盤: ![](https://img-blog.csdnimg.cn/20210205175837528.jpg) 假設這是第一次登入百度雲盤,百度雲盤生成了cookie返回給瀏覽器,這裡我們只關注**PANPAS**這個欄位的變化。 我們看一下此刻瀏覽器儲存的cookie值: ![](https://img-blog.csdnimg.cn/20210205175838691.jpg) 瀏覽器儲存的cookie和第一次登入百度雲盤返回的cookie是一樣的。 這時我們重新整理頁面再次訪問: ![](https://img-blog.csdnimg.cn/20210205175838651.jpg) 我們發現請求頭中攜帶了剛剛瀏覽器儲存的cookie,但是響應頭中又返回了一個新的cookie,我們再看一下瀏覽器中此刻儲存的cookie: ![](https://img-blog.csdnimg.cn/20210205175838698.jpg) 此刻,瀏覽器中儲存的cookie已經變成了最新的。從這裡就能看出每次訪問百度網盤,服務端都會新建一個cookie返回給瀏覽器,覆蓋之前的cookie。但是大部分網站都是在使用者第一次請求或者cookie過期時才會新建cookie,這裡就不需要過多糾結。我們只需要知道:**cookie代表了使用者資訊**即可。 上面主要就是一些cookie的簡單理論,現在我們從程式碼中來看cookie如何應用。 首先我們不加cookie來訪問我的百度雲盤分享連結: ![](https://img-blog.csdnimg.cn/20210206155123506.jpg) 我們從網頁內容可以看出,進入的是輸入提取碼的頁面。 這時,我們將登入了百度網盤的瀏覽器中的cookie複製過來,放在請求頭中再次執行。 ![](https://img-blog.csdnimg.cn/2021020616051273.jpg) 如圖,請求頭在攜帶了cookie之後訪問我自己的分享連結,就直接訪問到了資源頁面,而不再是輸入提取碼頁面。 大概流程再整一下:爬蟲程式帶著cookie去訪問分享連結,百度雲盤一看這個cookie代表的人和資源分享人居然是同一個人,那就不需要再重定向到輸入提取碼頁面了,直接訪問資源就可以了。 ### referer referer代表的是從哪個url跳轉到此頁面的,通常用來判斷此次請求是否是從網站內點選觸發的。例如我從騰訊視訊的動漫頻道點進去斗羅大陸播放頁,則跳轉到斗羅大陸頁面請求的referer就是動漫頻道的url。 如圖,/channle/cartoon代表的就是動漫頻道。 ![referer](https://img-blog.csdnimg.cn/20210206161358836.jpg) 這個屬性平時不怎麼用。到目前為止,我就只在一次爬蟲程式開發中,遇到過這個問題,網站通過檢測referer來判定你是否是直接訪問的這個url,後來我就將網站首頁的url填到了每個請求頭referer中。 用法可以看UA那個程式截圖。 ## 請求頻率 眾所周知,程式的執行速度是非常快的。假如我們爬取一個網站,這個網站有1w個頁面,我們在程式碼中迴圈請求1w次,啟動程式,或許幾秒鐘就搞定了,但是你認為一個人會有這麼快的請求頻率麼。所以我們需要限制請求間隔,方法很簡單。 **Java** ```java Thread.sleep(millis) ``` **Python** ```python time.sleep(secs) ``` **Scrapy爬蟲框架** ```python # settings中,0.3代表0.3s DOWNLOAD_DELAY = 0.3 ``` ## 代理IP 很多網站識別爬蟲程式的基本手段就是通過請求頻率來判斷,即記錄一個IP在一段時間內請求了多少次。所以如果我們有足夠的代理IP,就可以提高請求頻率。 通常獲取代理IP的方法有付費購買和從免費代理IP網站獲取,之前的西刺代理就是專門提供免費代理IP的網站,但免費代理IP的存活率通常不高。很多人就開始專門設計程式來構建代理IP池,獲取了免費代理IP之後,通過程式反覆驗證代理IP的存活性。這裡主要先說明爬蟲程式中入門如何新增代理IP。 這裡我找了一個代理IP,新增在了程式碼中。 ```python import requests url = 'https://ipinfo.io' proxies = { 'https': 'https://183.220.xxx.xx:80' } response = requests.get(url, proxies=proxies) print(response.text) ``` 對IP識別網站發起請求並輸出結果。 ![代理IP驗證](https://img-blog.csdnimg.cn/20210206171850730.jpg) 爬蟲程式的IP已經不再是爬蟲執行主機IP,而變成了代理IP。至於代理池的構建,可能以後我會寫一下。 ### 結語 本篇文章從請求頭、請求頻率、代理IP三個方面,講述了爬蟲如何去模擬人的行為,這是爬蟲程式開發最基本的常識,也是最常見的應對反爬蟲的方法。有時候,一個爬蟲程式的好壞,並不是取決爬蟲程式的效能,而是取決於網站是否能識別出這是個爬蟲程式。 知道了這些,是否就可以肆無忌憚的去爬取資料了呢?其實是不可以的,我們爬取資料一定要在合理合法的範圍內,亦不可逾越法律底線。所以下篇文章主要講一下自己對資料爬取規範的一些理解。期待下一次相遇。
--- 寫的都是日常工作中的親身實踐,處於自己的角度從0寫到1,保證能夠真正讓大家看懂。 文章會在公眾號 [**入門到放棄之路**] 首發,期待你的關注。 ![公眾號](https://img-blog.csdnimg.cn/2020121714585