前言
有時候爬的次數太多時ip容易被禁,所以需要ip代理的幫助。今天爬的思路是:到雲代理獲取大量ip代理,逐個檢測,將超時不可用的代理排除,留下優質的ip代理。
一、爬蟲分析首先看看今天要爬取的網址
http://www.ip3366.net/free/
1.分析網址
首先判斷網址是動態網址還是靜態網址,靜態網址就是直接能透過翻頁從網址裡找到頁碼,以下是每頁的網址:
http://www.ip3366.net/free/?stype=1&page=2http://www.ip3366.net/free/?stype=1&page=3http://www.ip3366.net/free/?stype=1&page=4
所以推出是靜態網址,每頁page遞增1的規律
2.分析資料今天打算用xpath來解析資料,首先開啟F12,可以看到每條代理的資訊都包裹在tr中,因此我們可以先透過tr獲取全部資訊,再遍歷tr裡的ip,埠和型別
二、完整程式碼附上完整程式碼和詳細註釋
import requestsfrom lxml import etree# 5.檢測ip質量def check_ip(proxies_list): headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1'} can_use=[] for ip in proxies_list: try: # 設定超時時間timeout,如果響應時間超出則不合格 response=requests.get(url=base_url,headers=headers,proxies=ip,timeout=0.1) if response.status_code==200: can_use.append(ip) except Exception: print('當前代理ip:',ip,'請求超時,檢測不合格') finally: print('當前代理ip:',ip,'檢測透過') return can_useproxies_list=[]# 爬3頁for page in range(1,4): print('---------------正在爬取第{}頁資料---------------'.format(page)) # 1.分析url,新增headers,偽裝成瀏覽器 base_url='http://www.ip3366.net/free/?stype=1&page={}'.format(str(page)) headers = {'User-Agent': 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1'} # 2.傳送請求 response=requests.get(url=base_url,headers=headers) # 3.解析資料 response.encoding='gbk' page_text=response.text tree=etree.HTML(page_text) # 獲取所有ip代理的資訊,就是所有tr ip_list=tree.xpath('//*[@id="list"]/table/tbody/tr') # 遍歷ip代理 for tr in ip_list: # xpath預設是列表型別,加個[0]就是文字型別了 http_type=tr.xpath('./td[4]/text()')[0] ip=tr.xpath('./td[1]/text()')[0] port=tr.xpath('./td[2]/text()')[0] # 4.構建代理ip結構(格式像這樣子{'HTTPS': '47.100.182.193:8081'}) proxies_dict={} proxies_dict[http_type]=ip+":"+port print('儲存成功:',proxies_dict) proxies_list.append(proxies_dict) #放入空列表print('獲得代理ip數量:',len(proxies_list))print('--------------------正在檢測ip質量---------------')can_use=check_ip(proxies_list)print('質量高的:',can_use)print('質量高的代理ip數量:',len(can_use))
執行效果如下:
總結這個網站一次爬取次數多了,瀏覽器代理(headers)容易掛,換個瀏覽器代理即可。
最新評論