在爬蟲的時候常常會遇到一個問題就是ip被封,因爲ip對網站的短期大量請求,讓網站將咱們的ip暫時封掉。這樣咱們就沒法所有爬取本身想要的內容。html
這裏百度了一下解決辦法,不少人都提到了ip代理管理池的問題,其大體思想就是在一些網站上找一些免費的ip代理,而後將他們放入一個列表中,這樣咱們就能夠用這些免費的ip代理來不斷更換,每當一個ip被封后咱們就用代碼調用下一個ip代理,直到咱們爬完咱們想要的數據。python
大體思路以下:(這裏我用Python來說)app
1.訪問一個國內免費ip代理的網站(注意要獲取高匿的ip),這裏咱們以網站有代理(http://www.youdaili.net/)爲例,進入後找到http代理點擊進入,而後點擊列表中最新日期的免費代理,就能夠看到不少最新的免費ip代理編輯器
2.用Python的BeautifulSoup解析這個頁面,從頁面中獲取全部的ip地址及端口號,組合(ip:port的形式)起來存入一個列表中,測試
3.得到了全部的ip後,接下來我麼要驗證這些ip能不能用,由於免費的ip代理大部分都是不能用的,因此咱們就要從這些在網頁上爬取的ip進行檢查,去掉那些不能用的,具體方法是(注意一點Python中代理參數的格式是proxy= {'http':'http://ip:port'}):首先咱們將ip配置爲Python中代理參數的默認格式,而後咱們用urllib.request.ProxyHandler方法將proxy傳入,接着用urllib.request.build.opener和urllib.request.install_opener()一次處理,代理參數就配置好了,而後咱們以百度爲測試網站,測試看看咱們的代理ip能不能,用urllib.request.urlopen()若是能返回則證實可用反之不能用。能用的話咱們就添加到一個新的列表中加一保存網站
注:出入講解的緣故,一下代碼只爬取的免費代理網站上面的首頁全部ip和port,至於翻頁什麼的你們應該能夠本身搞定ui
代碼以下:url
import urllib.request from bs4 import BeautifulSoup #訪問免費ip代理網址:http://www.youdaili.net/Daili/http/29381.html,處理獲得全部的ip def htmlParser(url): iplist=[] #設置頭部 user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0' headers = {"User-Agent": user_agent} req = urllib.request.Request(url, headers=headers) #獲取頁面html html=urllib.request.urlopen(req).read() soup=BeautifulSoup(html,'html.parser') datas=soup.find("div",{"class":"content"}).findAll("p") for data in datas: ip=data.get_text().split("@")[0] iplist.apend(ip) return iplist #檢測ip是否可用 def confirm_ip(ip): #配置proxy proxy={'http':'http://%s'%ip} proxy_handler=urllib.request.ProxyHandler(proxy) proxy=urllib.request.bulid_handler(proxy_handler) urllib.request.install_handler(proxy) #用百度首頁檢測代理ip test_url="http://www.baidu.com" user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.22 Safari/537.36 SE 2.X MetaSr 1.0' headers = {"User-Agent": user_agent} req = urllib.request.Request(test_url, headers=headers) try: response=urllib.request.urlopen(req) content=response.read() #獲取到內容 if content: print("its a right ip") return ip #沒有獲取到 else: return None #訪問錯誤 except urllib.request.URLError as e: print(e.reason) return None trueIp=[] url="http://www.youdaili.net/Daili/http/29381.html" iplist=htmlParse(url) for ip in iplist; if confirm_ip(ip)!=None: trueIp.append(ip) print(trueIp)
好了內容就是這麼都,有不妥的地方歡迎你們交流.(吐槽一下:博客園編輯器好垃圾,第一次徒手在自帶的編輯器上寫,寫完了看到下面一個換色,一點全部代碼不見了!產品經理把這個功能改一下吧!加個提醒也行啊!!).net