1. 程式人生 > >這就是我的爬蟲基本功!使用代理 IP和繞過反爬機制!

這就是我的爬蟲基本功!使用代理 IP和繞過反爬機制!

這就是我的爬蟲基本功!使用代理 IP和繞過反爬機制!

 

這就是我的爬蟲基本功!使用代理 IP和繞過反爬機制!

 

使用代理 IP


之前我瞭解到的使用代理 IP 的方法,一般都是提前從一些免費的代理網站上爬取免費代理,存在本地或者資料庫中,使用的時候再進行讀取。

但是這樣做有個小問題就是,免費的代理 IP 存活時間都特別短暫,從幾十秒到幾十分鐘不等,我之前整過幾次,每次爬完 IP 之後,到用的時候,已經有一半左右的IP已經失效了。感覺不是特別好用,就沒在搞了。

後來看到這位大佬的思路之後,我才重新發現了使用代理 IP 的強大之處。它在爬蟲執行的同時,線上獲取代理 IP。每次只獲取一頁,存於陣列中,隨機使用。當大部分的 IP 失效之後(記錄訪問失敗的次數,當超過一定閾值時,則視為此頁代理 IP 失效),然後重新獲取一頁代理 IP,如此,可保證每次使用的都是最新的 IP,而且不需要額外的空間和檔案來存放代理 IP。

進群:960410445  獲取更多案例教程哦!

這就是我的爬蟲基本功!使用代理 IP和繞過反爬機制!

 

使用隨機 UA


UA,即 User-Agent ,使用它可以將我們的爬蟲偽裝成瀏覽器,讓對方以為是真人在使用瀏覽器訪問,從而騙過目標網站的反爬機制。但是使用固定的 UA 去爬也是會有問題的,你想嘛,假如你發現最近幾個小時內來訪問的幾萬個使用者,用的都是同一個瀏覽器,你還會認為對面是真人嗎?不封它封誰!

所以,為了讓我們的爬蟲更像真人在使用,我們不僅要為它設定 UA,還要使用隨機 UA(讓對方伺服器開心的以為有好多的使用者在訪問呢)。

這是 UA 列表,截取了部分,這個在網上隨便一找就能找到好多。

USER_AGENTS = [
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60',
 'Opera/8.0 (Windows NT 5.1; U; en)',
 'Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50',
 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50',
 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0',
 'Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36',
 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11',
 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER',
 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; 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; LBBROWSER)',
 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.84 Safari/535.11 SE 2.X MetaSr 1.0',
 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SV1; QQDownload 732; .NET4.0C; .NET4.0E; SE 2.X MetaSr 1.0)',
 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 UBrowser/4.0.3214.0 Safari/537.36'
]

使用的時候,直接使用隨機函式 random.choice() 來從列表中選擇選擇一個。

使用方法可以參考以下程式碼:

user_agent = random.choice(USER_AGENTS)proxy = random.choice(proxyList)url = 'https://blog.csdn.net/wenxuhonghe/article/details/85036674' headers = { "Connection": "keep-alive", "Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.9", "Cookie": ""
 }
try: # 構建一個Handler處理器物件,引數是一個字典型別,包括代理型別和代理伺服器IP+PROT
 httpproxy_handler = urllib.request.ProxyHandler({"http": proxy}) opener = urllib.request.build_opener(httpproxy_handler)
 urllib.request.install_opener(opener) request = urllib.request.Request(url,headers=headers)
 request.add_header("User-Agent", user_agent) response = urllib.request.urlopen(request) html = response.read() 
 # 解析目標頁面,提取相關資訊
 parse_data(html)
 time.sleep(1)
except Exception as result:
 print ("錯誤資訊:%s"%(result))

寫在後面的話


上面介紹瞭如何使用代理 ip 和 隨機 ua 來避開網站的反爬蟲機制,實現高效率的資料爬取。

本文中使用的方法親測可用,但是程式碼並非全部原始碼,不保證程式碼可以直接複製貼上使用,建議大家理解原理之後,根據自己的爬蟲專案需要進行相應的調整。