1.前言
本文的文字及圖片來源於網絡,僅供學習、交流使用,不具有任何商業用途,如有問題請及時聯系我們以作處理。
PS:如有需要Python學習資料的小伙伴可以點擊下方鏈接自行獲取
想着爬取『豆瓣』的用戶和電影數據進行『挖掘』,分析用戶和電影之間以及各自之間的關系,數據量起碼是萬級別的。
但是在爬取過程中遇到了反爬機制,因此這里給大家分享一下如何解決爬蟲的反爬問題?(以豆瓣網站為例)

2.問題分析
起初代碼
headers = {
'Host':'movie.douban.com', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'cookie':'bid=uVCOdCZRTrM; douban-fav-remind=1; __utmz=30149280.1603808051.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __gads=ID=7ca757265e2366c5-22ded2176ac40059:T=1603808052:RT=1603808052:S=ALNI_MYZsGZJ8XXb1oU4zxzpMzGdK61LFA; _pk_ses.100001.4cf6=*; __utma=30149280.1867171825.1603588354.1603808051.1612839506.3; __utmc=30149280; __utmb=223695111.0.10.1612839506; __utma=223695111.788421403.1612839506.1612839506.1612839506.1; __utmz=223695111.1612839506.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=223695111; ap_v=0,6.0; __utmt=1; dbcl2="165593539:LvLaPIrgug0"; ck=ZbYm; push_noty_num=0; push_doumail_num=0; __utmv=30149280.16559; __utmb=30149280.6.10.1612839506; _pk_id.100001.4cf6=e2e8bde436a03ad7.1612839506.1.1612842801.1612839506.', 'accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'upgrade-insecure-requests': '1', #'referer':'', } url = "https://movie.douban.com/subject/24733428/reviews?start=0" r = requests.get(url, headers=headers)
上面是基本的爬蟲代碼,在requests里面設置headers(包含cookie),如果沒有反爬機制的話,可以正常爬取數據。
但是『豆瓣』網站有反爬機制!!

爬取就10幾頁之后,就出現這個驗證!!
更關鍵的是:驗證之后接着爬取,幾秒后又出現這個,即使設置幾秒爬取一次也無法解決!
3.解決方案
方案猜想
根據多年的爬蟲經驗,首先想到的是設置IP代理,這樣就相當於不同用戶在爬取網站,因此就通過ip代理去嘗試,看看能否解決『豆瓣』的反爬機制。
獲取大量IP代理
如果單純設置一個IP代理,那樣跟咱們之前在自己電腦上爬取沒有什么區別,因此需要大量的IP代理,通過隨機抽取的方式去使用IP代理,這樣可以避免同一IP去爬取被『豆瓣』反爬機制禁爬。
IP代理正常來說,很貴,作為白嫖黨,這里使用免費ip代理(親測可用)
白嫖過程
https://h.shenlongip.com/index/index.html
白嫖的IP代理平台是:神龍Http,(這里不是廣告,只是覺得可以白嫖,跟大家分享)

注冊之后,可以免費獲取1000個IP代理(詳細過程就不介紹了,重點如何使用IP代理解決反爬問題~)

這樣我們就可以將提取的IP代理放到文本文件中。
設置IP代理
讀取IP代理
iplist=[]
with open("ip代理.txt") as f: iplist = f.readlines()
剛剛已經將ip全部保存到文本文件中,現在讀取出來放到iplist中
隨機抽取IP代理
#獲取ip代理 def getip(): proxy= iplist[random.randint(0,len(iplist)-1)] proxy = proxy.replace("\n","") proxies={ 'http':'http://'+str(proxy), #'https':'https://'+str(proxy), } return proxies
通過random函數,可以在iplist 代理集合中,隨機抽取IP代理,並封裝成proxies格式(requests的ip代理規定格式)
注解:這里https被注釋掉了,因為我這里的ip代理是http,所以有https的話則報錯!
IP代理代碼
headers = {
'Host':'movie.douban.com', 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36', 'cookie':'bid=uVCOdCZRTrM; douban-fav-remind=1; __utmz=30149280.1603808051.2.2.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=(not%20provided); __gads=ID=7ca757265e2366c5-22ded2176ac40059:T=1603808052:RT=1603808052:S=ALNI_MYZsGZJ8XXb1oU4zxzpMzGdK61LFA; _pk_ses.100001.4cf6=*; __utma=30149280.1867171825.1603588354.1603808051.1612839506.3; __utmc=30149280; __utmb=223695111.0.10.1612839506; __utma=223695111.788421403.1612839506.1612839506.1612839506.1; __utmz=223695111.1612839506.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmc=223695111; ap_v=0,6.0; __utmt=1; dbcl2="165593539:LvLaPIrgug0"; ck=ZbYm; push_noty_num=0; push_doumail_num=0; __utmv=30149280.16559; __utmb=30149280.6.10.1612839506; _pk_id.100001.4cf6=e2e8bde436a03ad7.1612839506.1.1612842801.1612839506.', 'accept': 'image/avif,image/webp,image/apng,image/*,*/*;q=0.8', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'zh-CN,zh;q=0.9', 'upgrade-insecure-requests': '1', #'referer':'', } url = "https://movie.douban.com/subject/24733428/reviews?start=0" r = requests.get(url, proxies=getip(), headers=headers, verify=False)

加了IP代理之后,爬取了幾百頁也沒有遇到過驗證問題。輕松爬取萬級別的數據沒問題。

已經爬取了8677條數據,一直沒有驗證出現,程序還在繼續運行~~~
時間間隔
如果還是遇到驗證機制,可以添加時間間隔,在爬取每一頁的時候,先讓程序暫停幾秒(自定義)
time.sleep(random.randint(3,5))
random.randint(3,5)是隨機生成35之間的數字,因此程序在爬取一次后就隨機暫停35秒。這樣也是一個有效防止觸發反爬機制。
4.總結
1.講解了通過IP代理和時間間隔去解決反爬驗證問題
2.白嫖可用的IP代理
3.爬取好的數據將會進一步分析和挖掘,本文就講解如何解決爬蟲的反爬問題(畢竟大家時間寶貴,都是碎片化閱讀,一下子太多內容難易消化)。