這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,並且會分享我自己的解決辦法。如果能對你有什麼幫助的話,麻煩點一下推薦啦。 一、UserAgent UserAgent中文名為用戶代理,它使得伺服器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本等信息。對於一些網站來說,它會 ...
這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,並且會分享我自己的解決辦法。如果能對你有什麼幫助的話,麻煩點一下推薦啦。
一、UserAgent
UserAgent中文名為用戶代理,它使得伺服器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本等信息。對於一些網站來說,它會檢查我們發送的請求中所攜帶的UserAgent欄位,如果非瀏覽器,就會被識別為爬蟲,一旦被識別出來, 我們的爬蟲也就無法正常爬取數據了。這裡先看一下在不設置UserAgent欄位時該欄位的值會是什麼:1 import requests 2 3 url = "http://www.baidu.com" 4 res = requests.get(url)
代碼很簡單,就是一個發送請求的代碼。運行之前打開Fiddler,然後運行代碼,在Fiddler中找到我們發送的請求,就可以看到有如下內容:
這時候我們的UserAgent欄位的值就是python-requests/2.18.4,很顯然這不是一個瀏覽器的UserAgent,而這樣的UserAgent很容易就被識別出來,所以我們在編寫爬蟲的時候一定要註意添加UserAgent。然後對於一些網站,如果我們一直使用同一個UserAgent去訪問,頻率高了之後也會被ban掉,這個時候就需要使用隨機的UserAgent了。
解決辦法:
1.收集整理常見的UserAgent以供使用
ua_list =
["Mozilla/5.0 (iPod; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_2 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8H7 Safari/6533.18.5",
"MQQBrowser/25 (Linux; U; 2.3.3; zh-cn; HTC Desire S Build/GRI40;480*800)",
"Mozilla/5.0 (Linux; U; Android 2.3.3; zh-cn; HTC_DesireS_S510e Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1",
"Mozilla/5.0 (SymbianOS/9.3; U; Series60/3.2 NokiaE75-1 /110.48.125 Profile/MIDP-2.1 Configuration/CLDC-1.1 ) AppleWebKit/413 (KHTML, like Gecko) Safari/413",
"Mozilla/5.0 (iPad; U; CPU OS 4_3_3 like Mac OS X; zh-cn) AppleWebKit/533.17.9 (KHTML, like Gecko) Mobile/8J2",
"Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1",
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/534.51.22 (KHTML, like Gecko) Version/5.1.1 Safari/534.51.22",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A5313e Safari/7534.48.3",
"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.202 Safari/535.1",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows Phone OS 7.5; Trident/5.0; IEMobile/9.0; SAMSUNG; OMNIA7)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; XBLWP7; ZuneWP7)",
"Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30",
"Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/4.0 (compatible; MSIE 60; Windows NT 5.1; SV1; .NET CLR 2.0.50727)",
"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)",
"Opera/9.80 (Windows NT 5.1; U; zh-cn) Presto/2.9.168 Version/11.50",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)",
"Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET4.0E; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C)",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN) AppleWebKit/533.21.1 (KHTML, like Gecko) Version/5.0.5 Safari/533.21.1",
"Mozilla/5.0 (Windows; U; Windows NT 5.1; ) AppleWebKit/534.12 (KHTML, like Gecko) Maxthon/3.0 Safari/534.12",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)"]
2.使用第三方庫--fake_useragent
使用方法如下:
1 from fake_useragent import UserAgent 2 3 4 ua = UserAgent() 5 for i in range(3): 6 print(ua.random) 7 # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 8 # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 9 # Mozilla/5.0 (X11; Linux i686; rv:21.0) Gecko/20100101 Firefox/21.0
二、IP
對於一些網站來說,如果某個IP在單位時間里的訪問次數超過了某個閾值,那麼伺服器就會ban掉這個IP了,它就會返回給你一些錯誤的數據。一般來說,當我們的IP被ban了,我們的爬蟲也就無法正常獲取數據了,但是用瀏覽器還是可以正常訪問,但是如果用瀏覽器都無法訪問,那就真的GG了。很多網站都會對IP進行檢測,比如知乎,如果單個IP訪問頻率過高就會被封掉。
解決辦法:
使用代理IP。網上有很多免費代理和付費代理可供選擇,免費代理比如:西刺代理、快代理等等,付費代理比如:代理雲、阿布雲等等。除此之外,我們還可以建一個屬於自己的代理池以供使用,這裡可以參考下我的上一篇博客。
三、Referer防盜鏈
防盜鏈主要是針對客戶端請求過程中所攜帶的一些關鍵信息來驗證請求的合法性,而防盜鏈又有很多種,比如Referer防盜鏈、時間戳防盜鏈等等,這裡只講Referer防盜鏈。Referer用於告知伺服器該請求是從哪個頁面鏈接過來的,比如我們先打開少司命的百度百科:
然後打開開發者工具,再查看右側的圖片,能找到如下內容,這裡Referer欄位就表明我們是從什麼頁面跳轉過去的:
但是如果我們直接在瀏覽器中輸入url查看圖片的話,是沒有Referer的:
這裡本來有一個例子的,就是妹子圖:https://www.mzitu.com,不過現在無法訪問了。這個網站的圖片就使用了Referer防盜鏈,如果我們的爬蟲沒有攜帶符合要求的Referer欄位,就會被識別出來。雖然我們請求的鏈接是沒有問題的,但是因為沒有Referer欄位,它就不會把真正的圖片返回給我們。
解決辦法:
在請求頭headers中添加Referer欄位以及相應的值。
四、在html中動手腳
首先我不得不佩服那些前端工程師們,為了反爬蟲真是想了不少辦法,比如JS加密啊JS混淆啊,真是搞得人頭大。不過我們這裡先說那些在html中動手腳的,比如加一些無意義的字元之類的,這樣即使我們能爬下來,得到的數據也是沒法使用的。比如部分微信公眾號的文章里會穿插一些亂七八糟的字元,這裡用這篇文章作為例子:
解決辦法:
可以看到每個字前面都加了一個span標簽,span標簽裡加入了一個用於干擾的字元,而且有的還使用了strong標簽,這就給我們的解析增加了難度。這裡我使用的是lxml解析,解析完之後再對數據做一下清洗,完整代碼如下:
1 import requests 2 from lxml import etree 3 4 url = "https://mp.weixin.qq.com/s?__biz=MzI0MDYwNjk2OA==&mid=2247484365&idx=4&sn=291a93e8a4ce6e90d3b6ef8b98fe09c4&chksm=e919085ade6e814cc037ecf6a873f22da0e492911a4e539e6f8fdeff022806b4d248c4d54194&scene=4" 5 res = requests.get(url) 6 et = etree.HTML(res.text) 7 lst = et.xpath('//*[@id="js_content"]/p//text()') 8 lst = [lst[i] for i in range(1, len(lst), 2)] 9 text = ''.join(lst) 10 print(text)