【Python3爬蟲】常見反爬蟲措施及解決辦法(一)

這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,而且會分享我本身的解決辦法。若是能對你有什麼幫助的話,麻煩點一下推薦啦。html

 

1、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了。python

解決辦法:

1.收集整理常見的UserAgent以供使用es6

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

 

2、IP

對於一些網站來講,若是某個IP在單位時間裏的訪問次數超過了某個閾值,那麼服務器就會ban掉這個IP了,它就會返回給你一些錯誤的數據。通常來講,當咱們的IP被ban了,咱們的爬蟲也就沒法正常獲取數據了,可是用瀏覽器仍是能夠正常訪問,可是若是用瀏覽器都沒法訪問,那就真的GG了。不少網站都會對IP進行檢測,好比知乎,若是單個IP訪問頻率太高就會被封掉。服務器

解決辦法:

使用代理IP。網上有不少免費代理和付費代理可供選擇,免費代理好比:西刺代理快代理等等,付費代理好比:代理雲阿布雲等等。除此以外,咱們還能夠建一個屬於本身的代理池以供使用,這裏能夠參考下個人上一篇博客
微信

 

3、Referer防盜鏈

防盜鏈主要是針對客戶端請求過程當中所攜帶的一些關鍵信息來驗證請求的合法性,而防盜鏈又有不少種,好比Referer防盜鏈、時間戳防盜鏈等等,這裏只講Referer防盜鏈。Referer用於告知服務器該請求是從哪一個頁面連接過來的,好比咱們先打開少司命的百度百科:前端工程師

而後打開開發者工具,再查看右側的圖片,能找到以下內容,這裏Referer字段就代表咱們是從什麼頁面跳轉過去的:dom

可是若是咱們直接在瀏覽器中輸入url查看圖片的話,是沒有Referer的:ide

 

這裏原本有一個例子的,就是妹子圖:https://www.mzitu.com,不過如今沒法訪問了。這個網站的圖片就使用了Referer防盜鏈,若是咱們的爬蟲沒有攜帶符合要求的Referer字段,就會被識別出來。雖然咱們請求的連接是沒有問題的,可是由於沒有Referer字段,它就不會把真正的圖片返回給咱們。

解決辦法:

 在請求頭headers中添加Referer字段以及相應的值。

 

4、在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)
相關文章
相關標籤/搜索