1. 程式人生 > 其它 >python3獲取代理IP

python3獲取代理IP

在GitHub 上找了個獲取代理IP的指令碼,發現已經失效了,所以自己改了下
使用python3.8
# -*- coding:UTF-8 -*-
from bs4 import BeautifulSoup
import subprocess as sp
import requests
import random
import re
import logging

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s- %(message)s')

"""
函式說明:獲取IP代理
Parameters:
page - 高匿代理頁數,預設獲取第一頁
Returns:
proxys_list - 代理列表
Modify:
2017-05-27
"""


def get_proxys():
# requestsSession可以自動保持cookie,不需要自己維護cookie內容
S = requests.Session()
# 西祠代理高匿IP地址
target_url = 'http://www.xiladaili.com/gaoni/'
# 完善的headers
target_headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/88.0.4324.146 Safari/537.36'}
# get請求
target_response = S.get(url=target_url, headers=target_headers)
# utf-8編碼
target_response.encoding = 'utf-8'
# 獲取網頁資訊
target_html = target_response.text
# 獲取idip_listtable
bf1_ip_list = BeautifulSoup(target_html, 'lxml')
bf2_ip_list = bf1_ip_list.find('tbody').find_all('tr')
proxys_list = []

for i in bf2_ip_list:
iptxt = i.find('td').string
try:
ph = re.compile(r'\d+\.\d+\.\d+\.\d+')
mo = ph.search(iptxt)
ipmo = mo.group()
proxys_list.append(ipmo)
logging.debug(proxys_list)
except AttributeError:
return None
# print(proxys_list)
return proxys_list


"""
函式說明:檢查代理IP的連通性
Parameters:
ip - 代理的ip地址
lose_time - 匹配丟包數
waste_time - 匹配平均時間
Returns:
average_time - 代理ip平均耗時
"""


def check_ip(ip, lose_time, waste_time):
# 命令 -n 要傳送的回顯請求數 -w 等待每次回覆的超時時間(毫秒)
cmd = "ping -n 3 -w 3 %s"
# 執行命令
p = sp.Popen(cmd % ip, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE, shell=True)
# 獲得返回結果並解碼
out = p.stdout.read().decode("gbk")
# 丟包數
lose_time = lose_time.findall(out)
# 當匹配到丟失包資訊失敗,預設為三次請求全部丟包,丟包數lose賦值為3
if len(lose_time) == 0:
lose = 3
else:
lose = int(lose_time[0])
# 如果丟包數目大於2,則認為連線超時,返回平均耗時1000ms
if lose > 2:
# 返回False
return 1000
# 如果丟包數目小於等於2,獲取平均耗時的時間
else:
# 平均時間
average = waste_time.findall(out)
# 當匹配耗時時間資訊失敗,預設三次請求嚴重超時,返回平均好使1000ms
if len(average) == 0:
return 1000
else:
average_time = int(average[0])
# 返回平均耗時
return average_time


"""
函式說明:初始化正則表示式
lose_time - 匹配丟包數
waste_time - 匹配平均時間
"""


def initpattern():
# 匹配丟包數
lose_time = re.compile(u"丟失 = (d+)", re.IGNORECASE)
# 匹配平均時間
waste_time = re.compile(u"平均 = (d+)ms", re.IGNORECASE)
return lose_time, waste_time


if __name__ == '__main__':
# 初始化正則表示式
lose_time, waste_time = initpattern()
# 獲取IP代理
proxys_list = get_proxys()
# 如果平均時間超過200ms重新選取ip
while True:
# 50IP中隨機選取一個IP作為代理進行訪問
split_proxy = random.choice(proxys_list)
# 獲取IP
ip = split_proxy
# 檢查ip
average_time = check_ip(ip, lose_time, waste_time)
if average_time > 200:
# 去掉不能使用的IP
proxys_list.remove(split_proxy)
print("ip連線超時, 重新獲取中!")
if average_time < 200:
break

# 去掉已經使用的IP
proxys_list.remove(split_proxy)
proxy_dict = split_proxy
print("使用代理:", proxy_dict)