首頁>技術>

前言

有時候爬的次數太多時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)容易掛,換個瀏覽器代理即可。

16
最新評論
  • BSA-TRITC(10mg/ml) TRITC-BSA 牛血清白蛋白改性標記羅丹明
  • Python開發的面試準備