您好,登錄后才能下訂單哦!
小編給大家分享一下Python之常用反爬蟲措施和解決辦法的案例,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
一、UserAgent
UserAgent中文名為用戶代理,它使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本等信息。對于一些網站來說,它會檢查我們發送的請求中所攜帶的UserAgent字段,如果非瀏覽器,就會被識別為爬蟲,一旦被識別出來, 我們的爬蟲也就無法正常爬取數據了。這里先看一下在不設置UserAgent字段時該字段的值會是什么:
import requests url = "http://www.baidu.com" 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
使用方法如下:
from fake_useragent import UserAgent ua = UserAgent() for i in range(3): print(ua.random) # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36 # Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36 # 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解析,解析完之后再對數據做一下清洗,完整代碼如下:
import requests from lxml import etree url = "https://mp.weixin.qq.com/s?__biz=MzI0MDYwNjk2OA==&mid=2247484365&idx=4&sn=291a93e8a4ce6e90d3b6ef8b98fe09c4& chksm=e919085ade6e814cc037ecf6a873f22da0e492911a4e539e6f8fdeff022806b4d248c4d54194&scene=4" res = requests.get(url) et = etree.HTML(res.text) lst = et.xpath('//*[@id="js_content"]/p//text()') lst = [lst[i] for i in range(1, len(lst), 2)] text = ''.join(lst) print(text)
看完了這篇文章,相信你對Python之常用反爬蟲措施和解決辦法的案例有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。