爬蟲中的代理問題
文章目錄
一、前言
最近身邊很多人都遇到爬蟲中的代理問題,寫下這篇部落格來記錄自己所學,希望可以幫助到你們。
可能很多人都會問為什麼我需要用代理呢?不用不可以嗎?用了代理之後發現爬蟲抓取資料的速度反而下降了不少於是放棄爬蟲代理的使用。
如果我們只是進行少量資料的爬取,用本機的IP與User-Agent去抓取資料完全OK,沒問題。你可以關閉網頁了,因為我下面要講的東西你用不上。如果你需要大規模爬取資料請接著往下看。
當你抓取的資料達到一定量後,你會發現程式會時不時給你報錯,而且頻率越來越來高。這說你的爬蟲被人家識別出來了,對方的反扒系統已經記住了你。通常會告訴你連線超時、連線中斷更有甚者不會直接中斷你程式,它會給你一些假資料或者將你的爬蟲帶入一個死迴圈,還有許多諸如此類的反扒措施這裡就不一一介紹了。
面對網站中的反扒系統,我們可以做的又有哪些呢?這裡我們主要講解代理User-Agent的應用與IP的爬取及應用。
二、User-Agent
(一)什麼是User-Agent
User-Agent是一個特殊字串頭,被廣泛用來標示瀏覽器客戶端的資訊,使得伺服器能識別客戶機使用的作業系統和版本,CPU型別,瀏覽器及版本,瀏覽器的渲染引擎,瀏覽器語言等。
不同的瀏覽器(IE,FF,Opera, Chrome等)會用不同的使用者代理字串(User Agent Strings)作為自身的標誌,當搜尋引擎(Google,Yahoo,Baidu,Bing)在通過網路爬蟲訪問網頁時,也會通過使用者代理字串來進行自身的標示,這也是為何網站統計報告能夠統計瀏覽器資訊,爬蟲資訊等。網站需要獲取使用者客戶端的資訊,瞭解網站內容在客戶端的展現形式,一些網站通過判斷UA來給不同的作業系統,不同的瀏覽器傳送不同的頁面,不過這也可能造成某些頁面無法再某個瀏覽器中正常顯示.
更多關於User-Agent的講解參見:User Agent的學習
(二)獲取隨機User-Agent與使用
1. 安裝fake_useragent:
pip install fake_useragent
2. 匯入fake_useragent
from fake_useragent import UserAgent
3. fake_useragent的獲取
headers = {'User-Agent':str(UserAgent().random)}
'''
程式碼含義:生成隨機User-Agent
'''
4. User-Agent的使用
req = requests.get(url=url, headers=headers)
'''
將生成的隨機User-Agent放入headers傳入requests,get()中即可
'''
三、代理ip
(一)代理IP的獲取
這部分我就不展開說了,主要是給大家提供一些可以獲取IP的網站,大家可自行爬取
- https://www.kuaidaili.com/free/
- http://www.xicidaili.com/
- http://www.goubanjia.com/
- https://ip.ihuan.me/
- http://www.66ip.cn/
- http://www.89ip.cn/
- http://www.ip3366.net/
(二)代理IP的使用
我這的IP是存放在txt檔案當中,當然,如果需要抓取的資料比較多的話,建議還是將IP儲存在資料庫中。
1. 從本地檔案中獲取ip:
def get_ip_list():
f=open('ip.txt','r')
ip_list=f.readlines()
f.close()
return ip_list
2. 生成隨機IP:
def get_random_ip(ip_list):
proxy_ip = random.choice(ip_list)
proxy_ip=proxy_ip.strip('\n')
proxies = {'https': proxy_ip}
return proxies
3. IP的使用:
ip_list = get_ip_list
proxies = get_random_ip(ip_list)
req = requests.get(url=url, proxies=proxies,headers=headers)
(三)IP的檢驗
很多童鞋在使用代理IP後,程式還是會報錯,這是為什麼呢?
我們在買酸奶的時候都會留意一下保質期,為什麼呢?保質期短啊,短的七八過期,長的也只有30來天。IP也一樣,每個IP都是有實效的,IP失效是很常見的。所以我們需要定時對IP的有效性進行檢驗
如何檢驗IP的有效性推薦閱讀:代理ip中的proxies
我們在爬取代理IP的過程中會注意到這樣一個有趣的現象,每個IP商家都會把它的所在地(北京、上海、歐洲等等)在旁邊註明,這是為什麼呢?
我之前在爬CSDN的過程中遇到一個問題困擾了我很久,同一個IP我拿去爬簡書(具體是不是簡書我記得不是很清楚了)沒問題資訊很快就抓取出來了,但是拿來爬CSDN就不行要麼連結中斷,要麼就是請求超時。後來我做了大量的實驗。得出這樣一個結論:IP地址的所在位置會影響IP對於不同網站的質量。簡單點來說,假設我拿一個位於IP美國的IP去爬美國的網站,從請求到響應的時間為2秒;我再拿這個IP去爬中國的網站,響應時間就是長於2秒甚至出現連線超時的錯誤。
鑑於上述,我建議大家在檢驗IP的有效性時,還是以目標網站為檢驗網站。我要爬A網站,那麼我就拿A網站來檢驗IP的有效性。
四、如何應付網站的反扒系統
用上了隨機User-Agent和代理IP大部分網站就沒有什麼問題了,但還是會出現一些反扒措施比較厲害的網站,我們拿具體的案例來解析。
情景一: 爬蟲在執行但是許久沒有資料出來
解決方案:timeout
try:
proxies = get_random_ip(ip_list)
headers = {'User-Agent':str(UserAgent().random)}
req = requests.get(url=url, proxies=proxies,headers=headers,timeout=20)
except:
time.sleep(5)
proxies = get_random_ip(ip_list)
headers = {'User-Agent':str(UserAgent().random)}
req = requests.get(url=url, proxies=proxies,headers=headers,timeout=20)
'''
timeout=20:當請求超過20秒還沒得到伺服器的相應時中斷請求
在中斷請求後間隔5秒後更換新的User-Agent、IP重新發送請求
'''
關於爬蟲代理更多知識參見:爬蟲代理
如有不足歡迎留言指正!