本章將要介紹一下如何使用代理ip解決反爬蟲的禁ip的問題,並擴展瞭解一下代理ip池的構建與adsl服務器的使用。html
下面,咱們先來看一下如何獲取本身的ip地址。咱們直接在百度上搜索ip,或者經過www.ip138.com/這個網站就能夠。好比說我如今的ip以下:python
ip做爲一個身份信息,通常是不會變的,想要改變本身的ip的方法就是找代理了。git
所謂代理,其實就是好比說咱們要訪問一個網頁,但這個時候咱們不本身去訪問,而是告訴代理咱們想要訪問什麼,而後代理用本身的ip去訪問,再返回給咱們。這樣網站其實拿到的不是咱們的真實ip,而是代理的ip。github
免費的代理ip有不少,雖然這種網站都不會提供太多的代理ip。咱們這裏以西刺代理的免費ip爲例,看看在python中如何使用代理ip。數據庫
首先打開www.xicidaili.com/nn/,能夠看到這裏有不少代理ip。服務器
這裏能夠根據當日的狀況挑選一個ip,我這裏選擇了139.129.207.72:808
這個代理。而後咱們編寫代碼,調用ip138的接口,查看一下本身使用代理後的ip是否改變。併發
import requests
from bs4 import BeautifulSoup
def parse_ip(content):
soup = BeautifulSoup(content, "html.parser")
print(soup.body.get_text())
resp = requests.get("http://2018.ip138.com/ic.asp")
parse_ip(resp.content.decode("gbk"))
print("\n改變ip後:")
proxies = {"http": "http://139.129.207.72:808"} # 須要改爲在西刺代理上看到的可用代理ip
resp2 = requests.get("http://2018.ip138.com/ic.asp", proxies=proxies)
parse_ip(resp2.content.decode("gbk"))
複製代碼
能夠看到使用前,個人ip仍是北京的ip,使用後變成了山東的ip了。 網站
在使用代理ip時,咱們通常都會去花錢買一些可用的ip或者是購買包月服務。但實際上,買來的ip並非都能用的,並且大多時候是不少都不能用,不能用比例很是之高。url
代理ip池的目標其實就是要驗證那些能用,哪些不能用,若是可用,就把可用的ip放到一個「池子」裏。等咱們爬蟲程序須要ip的時候,從「池子」裏拿就行了。spa
這裏咱們不會去本身寫一個代理ip池子,而是舉一個例子:好比說咱們想要爬取鏈家網的房價數據。
咱們須要首先寫一個驗證器validator來驗證ip是否可用。好比說在以前爬鏈家的時候,若是ip被禁了以後,就會跳轉到一個驗證的頁面,讓咱們點擊倒着的房子進行驗證,其實也就是驗證碼了。這種ip的話就是算不可用的。
固然,還有超時、不可鏈接等等的狀況。
validator的代碼相似下面這樣:
def validate_lianjia(proxy_url):
proxies = {"http": proxy_url}
try:
resp = requests.get("http://bj.lianjia.com/", proxies=proxies, timeout=20) # 20秒超時
content = resp.decode("utf-8")
if "請點擊倒着的房屋" in content:
return False
else:
return True
except:
return False
複製代碼
有了validator,咱們就能夠拿買來或者爬來的代理ip去驗證了。若是validator返回爲true,就是可用的。咱們把可用的ip放到「池子」裏,這個「池子」能夠是數據庫,也能夠是本地文件。只要爬蟲程序能拿到就行了。
固然,咱們會有一些更新策略,好比說多久判斷一次池子裏面的代理。是否要剔除池子裏的數據。
這塊咱們就不深刻展開了。
固然也有開發者開發的免費代理ip池,其實就是先去各大代理ip網站爬一些代理來,而後再驗證,提供一個Http的接口。
好比說這個:github.com/awolfly9/IP…。當時筆者在大學的時候想爬鏈家,可是不捨得買代理ip,而後就用的這個庫搞的代理ip爬的連接網的房價數據。
自我感受代理ip仍是一種比較麻煩的方法,下面介紹的adsl服務器就會很簡單粗暴了。
adsl服務器其實就是撥號上網服務器,它每撥一次號,就獲取一個新的IP。
因此,在adsl服務器上換ip的話,就像下面同樣,兩行代碼搞定。
import os
os.system("ifdown ppp0") # 先斷網
os.system("ifup ppp0") # 再聯網
複製代碼
由於每次換ip都須要斷網而後再聯網。因此若是是併發的爬蟲,在adsl服務器上會變得很難管理。若是咱們的爬蟲是單線程爬取的,adsl服務器的體驗仍是不錯的。
若是想體驗adsl服務器,最好本身租一個月練練手就知道怎麼用了,通常價格在100之內/每個月。