python3獲取代理IP
阿新 • • 發佈:2021-09-15
在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():
# requests的Session可以自動保持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
# 獲取id為ip_list的table
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(