首页 > 其他分享 >【http代理】ProxyPool代码样例

【http代理】ProxyPool代码样例

时间:2022-10-21 10:44:05浏览次数:78  
标签:count ProxyPool http IP self 样例 alive list proxy

1.此样例是私密代理简单IP池管理的实现

2.requests不是python原生库,需要安装才能使用: pip install requests


3.支持Python2.7和Python3


#!/usr/bin/env python
# -*- encoding: utf-8 -*-
import time
import random
import threading
import requests
class ProxyPool():
def __init__(self, secretid, proxy_count):
self.secretid = secretid
self.signature = signature
self.proxy_count = proxy_count if proxy_count < 50 else 50 # 池子维护的IP总数,建议一般不要超过50
self.alive_proxy_list = [] # 活跃IP列表
def _fetch_proxy_list(self, count):
"""调用快代理API获取代理IP列表"""
try:
res = requests.get("https://dps.jshkapi.com/api/getdps/?secret_id=%s&signature=%s&num=%s&pt=1&sep=1&f_et=1&format=json" % (self.secretid, self.signature, count))
return [proxy.split(',') for proxy in res.json().get('data').get('proxy_list')]
except:
print("API获取IP异常,请检查订单")
return []
def _init_proxy(self):
"""初始化IP池"""
self.alive_proxy_list = self._fetch_proxy_list(self.proxy_count)
def add_alive_proxy(self, add_count):
"""导入新的IP, 参数为新增IP数"""
self.alive_proxy_list.extend(self._fetch_proxy_list(add_count))
def get_proxy(self):
"""从IP池中获取IP"""
return random.choice(self.alive_proxy_list)[0] if self.alive_proxy_list else ""
def run(self):
sleep_seconds = 1
self._init_proxy()
while True:
for proxy in self.alive_proxy_list:
proxy[1] = float(proxy[1]) - sleep_seconds # proxy[1]代表此IP的剩余可用时间
if proxy[1] <= 3:
self.alive_proxy_list.remove(proxy) # IP还剩3s时丢弃此IP
if len(self.alive_proxy_list) < self.proxy_count:
self.add_alive_proxy(self.proxy_count - len(self.alive_proxy_list))
time.sleep(sleep_seconds)
def start(self):
"""开启子线程更新IP池"""
t = threading.Thread(target=self.run)
t.setDaemon(True) # 将子线程设为守护进程,主线程不会等待子线程结束,主线程结束子线程立刻结束
t.start()
def parse_url(proxy):
# 用户名密码认证(私密代理/独享代理)
username = "username"
password = "password"
proxies = {
"http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": proxy},
"https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": username, "pwd": password,"proxy": proxy}
}
# 白名单方式(需提前设置白名单)
# proxies = {
# "http": "http://%(proxy)s/" % {"proxy": proxy_ip},
# "https": "http://%(proxy)s/" % {"proxy": proxy_ip}
# }
# 要访问的目标网页
target_url = "https://dev.jshkapi.com/testproxy"
# 使用代理IP发送请求
response = requests.get(target_url, proxies=proxies)
# 获取页面内容
if response.status_code == 200:
print(response.text)
if __name__ == '__main__':
proxy_pool = ProxyPool('o1fjh1re9o28876h7c08', 'xxxxxx', 30) # 订单SecretId, 签名(secret_token), 池子中维护的IP数
proxy_pool.start()
time.sleep(1) # 等待IP池初始化
proxy = proxy_pool.get_proxy() # 从IP池中提取IP
if proxy:
parse_url(proxy)

 

标签:count,ProxyPool,http,IP,self,样例,alive,list,proxy
From: https://www.cnblogs.com/huakexiaopeng/p/16812677.html

相关文章

  • 911s5退出舞台后,哪个海外HTTP代理才是最佳的候补?
    在体育比赛中,往往在主力球员受伤或离队后,便会由替补球员候补登场完成比赛或是成为队里的新主力。而对于海外业务从业者最青睐的海外HTTP代理之一911s5来说,也是如此,前不久,911......
  • FileChooser文件保存样例
    FileChooserfc=newFileChooser();fc.setTitle("请选择文件保存位置");fc.setInitialDirectory($原始文件位置$);//桌面位置privatefinalstaticFilehomeDirecto......
  • 《吐血整理》高级系列教程-吃透Fiddler抓包教程(29)-Fiddler如何抓取Android7.0以上的
    1.简介上一篇宏哥介绍的Xposed是一款可以在不修改APK的情况下影响程序运行的框架。可以编写并加载自己编写的插件app,实现对目标apk的注入、拦截等。一般研究移动安全的都......
  • WCF部署HTTP错误404.3
    错误:WCF部署HTTP错误404.3-NotFound由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加MIME映射。解决步骤如下:控制面板......
  • HTTP协议
    HTTP协议概念:超文本传输协议,规定了浏览器和服务器之间数据的传输规则特点:基于TCP协议:面向连接,安全基于请求-响应模型的:一次请求对应一次响应HTTP协议是无状态......
  • Servlet&HTTP&Request笔记
    今日内容:1.Servlet2.HTTP协议3.RequestServlet:1.概念2.步骤3.执行原理4.生命周期5.Servlet3.0注解配置6.Servlet的体系结构 Servlet--接口 | ......
  • HTTP和HTTPS的区别
    httpHTTp什么是HTTP超文本传输协议(HTTP)是万维网的基础,用于使用超文本链接加载网页。HTTP是一种应用层协议,旨在在联网设备之间传输信息,并在网络协议栈的其他层之上......
  • HttpContext学习
    https://www.cnblogs.com/wujy/p/3264475.html一:HttpContext理论知识:1:HttpContext类它对Request、Respose、Server等等都进行了封装,并保证在整个请求周期内都可以随时随......
  • 记录|在WordPress设立HTTPS
    TL;DR:根据HTTPSforWordPress–WordPress.orgForums上的指示操作即可。获取HTTPS证书到Certbot上去,填MyHTTPwebsiteisrunning[Nginx]on[Ubuntu20]......
  • java实现调用http请求的几种常见方式
    一、概述在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适。很多项目都会封装规定好本身项目的接口规范,所以大多数需要去调用对方提供的接口或......