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

来源:https://www.cnblogs.com/TM0831/archive/2019/02/26/10430287.html
-Advertisement-
Play Games

這一篇博客,是關於反反爬蟲的,我會分享一些我遇到的反爬蟲的措施,並且會分享我自己的解決辦法。如果能對你有什麼幫助的話,麻煩點一下推薦啦。 一、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)

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、前言 什麼是命令模式? 在軟體系統中,“行為請求者”與“行為實現者”通常呈現一種“緊耦合”。但在某些場合,比如要對行為進行“記錄、撤銷/重做、事務”等處理,這種無法抵禦變化的緊耦合是不合適的。在這種情況下,如何將“行為請求者”與“行為實現者”解耦?將一組行為抽象為對象,實現二者之間的松耦合,這就 ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)+快速表單構建器freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源 ...
  • 一、什麼是OCTO 定義: OCTO是美團的分散式服務通信框架及服務治理系統,屬於公司級基礎設施,目前尚未開源。 目標: 為公司所有業務提供統一的服務通信框架,使業務具備良好的服務運營能力,輕鬆實現服務註冊、服務自動發現、負載均衡、容錯、灰度發佈、調用數據可視化等,持續提升服務高可用性、服務運維效率 ...
  • LieBrother原文 : "行為型模式:責任鏈模式" 十一大行為型模式之四:責任鏈模式。 簡介 姓名 :責任鏈模式 英文名 :Chain of Responsibility Pattern 價值觀 :責任歸我 個人介紹 : Avoid coupling the sender of a reque ...
  • 定義:裝飾模式是在不必改變原類文件和使用繼承的情況下,動態的擴展一個對象的功能。它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象。 裝飾器模式是為已有功能添加更多功能的一種方式,就增加功能來說,裝飾器模式比通過生成子類更為靈活。該模式通過將裝飾的功能放在單獨的類中,並讓這些類包含了需要進行裝飾的 ...
  • 方法一:繼承 Thread 類,覆蓋方法 run(),我們在創建的 Thread 類的子類中重寫 run() ,加入線程所要執行的代碼即可。 下麵是一個例子: 這種方法簡單明瞭,符合大家的習慣,但是,它也有一個很大的缺點,那就是如果我們的類已經從一個類繼承(如小程式必須繼承自 Applet 類),則 ...
  • 一、格式化拼接、format 1.字元串拼接 name = "Monica", age = 16 print("姓名"+name+“年齡”+age+".") 2.占位符 %s:string,%d:整數,%f:浮點 info1 = ‘’‘姓名:%s 年齡:%s’‘’%(name,age) print( ...
  • 題意 "題目鏈接" Sol 題解好神仙啊qwq。 一般看到這種考慮最大值的貢獻的題目不難想到單調數據結構 對於本題而言,我們可以預處理出每個位置左邊第一個比他大的位置$l_i$以及右邊第一個比他大的位置$r_i$ 那麼$(l_i, r_i)$會產生$p1$的貢獻 $[l_i + 1, i 1]$和$ ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...