redis+python 建立免费http-ip代理池;验证+留接口
前言:
效果图:

对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个!
思路:
1.单页获取ip+port+time (获取time主要是为了后面使用的时候,依照时效可以做文章)
2.整页验证(一个page里面可能有N个ip,通过验证判断有多少个有效ip可以使用)----这里需要使用多线程进行验证;否则,光验证那么多ip都要耗掉不少时间!
import logging
from bs4 import BeautifulSoup
from datetime import datetime, timedelta
import time
import requests
from concurrent.futures import ThreadPoolExecutor# 配置日志记录器
logging.basicConfig(level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s',filename='get_ip_error.log')time_threshold = 15 # 录入IP的时间和当前时间差阈值小于等于15分钟时进行检查
page_valid = 3 # 当每次超过X个有效IP时返回url_kuai= 'http://www.kuaidaili.com/free/inha/'
#请求头
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36',
}def check_proxy(p):'''多线程检查代理IP的有效性:param p: 代理IP列表[]:return: 有效的代理IP列表'''url = "http://httpbin.org/ip" # 用于测试代理IP有效性的网站valid_proxies = []def check_single_proxy(proxy):proxies = {"http": f"http://{proxy['ip']}:{proxy['port']}",# "https": f"https://{proxy['ip']}:{proxy['port']}"}try:response = requests.get(url, proxies=proxies, timeout=1.5)if response.ok:valid_proxies.append(proxy)except requests.exceptions.RequestException as e:pass# 开启多线程检查with ThreadPoolExecutor() as executor:executor.map(check_single_proxy, p)return valid_proxiesdef get_kuaidaili(page):'''获取89ip的代理IP列表:param page: 页码:return: 有效的代理IP列表和页码'''try:valid_ip_list = []while page <= 25:#在这里,只有当有效ip数量>=3的时候,他才会停止;否则,就会不停增加page去爬取;full_url = url_kuai+str(page) # 根据页码构建URLprint('当前正在爬取网页--->:', full_url)response = requests.get(full_url,headers=headers)if response.ok:html = response.textsoup = BeautifulSoup(html, 'html.parser')table = soup.find('table', class_='table table-b table-bordered table-striped')tbody = table.find('tbody')# if time_diff(tbody,6): #如果时间差在XX分钟以内,就开始检验ip(第6个td是时间) 他更新不快,所以不能用时间去筛选valid_proxies = tbody_add_proxy(tbody,6) # 获取tbody的数据(time的位置=6)if valid_proxies is not None and len(valid_proxies) > 0:valid_ip_list.extend(valid_proxies)if len(valid_ip_list) >= page_valid: # 有效 IP 数量大于等于 page_valid 就停止爬取breakpage += 1else:page=0#当page>25的时候,page=1重新开始return valid_ip_list, pageexcept requests.exceptions.RequestException as e:print(f"爬取异常: {e}")return valid_ip_list, pagedef time_diff(table,much):'''查询当前页的IP更新时间,判断是否小于等于阈值 time_threshold,若是返回True:param table: IP表格:return: 时间是否小于等于阈值'''rows = table.find_all('tr')given_time = datetime.strptime(rows[0].find_all('td')[much].text.strip(), "%Y/%m/%d %H:%M:%S")current_time = datetime.now()time_difference = current_time - given_timereturn time_difference <= timedelta(minutes=time_threshold)def tbody_add_proxy(tbody,much):'''提取代理IP和端口信息,并将其构建为列表形式:param tbody: 表格内容:return: 代理IP和端口的列表'''proxy_list = []rows = tbody.find_all('tr')for row in rows:proxy = {}cells = row.find_all('td')proxy["ip"] = cells[0].text.strip()proxy["port"] = cells[1].text.strip()proxy["time"] = cells[much].text.strip()proxy_list.append(proxy)return check_proxy(proxy_list) #返回有效的ip[(list)]
3.存入redis(我需要考虑的是:ip是否重复了?ip提取的时候什么时候进行补充?)
import redis
import json# 创建连接池
pool_config = {'host': 'localhost','port': 6379,'db': 0,'max_connections': 10,'decode_responses': True,'encoding': 'utf-8'
}# 创建redis连接池
pool = redis.ConnectionPool(**pool_config)def add_to_sorted_set(ip):'''将IP添加到有序集合中,确保唯一性:param ip: IP信息的字典'''r = redis.Redis(connection_pool=pool)ip_de = json.dumps(ip)# 判断IP在有序集合中是否已存在if not r.zscore('valid', ip_de):r.zadd('valid', {ip_de: 0})def find_valid_ip():'''获取当前Redis中有效IP的数量:return: 有效IP的数量'''r = redis.Redis(connection_pool=pool)count = r.zcard('valid') #因为是有序集合,所以需要用zcardif count is None:return 0return countdef pop_from_sorted_set():'''从有序集合中弹出一个元素(按添加顺序):return: 弹出的IP信息字典'''r = redis.Redis(connection_pool=pool)ip_de = r.zrange('valid', 0, 0)[0]# 从有序集合中移除已弹出的元素r.zrem('valid', ip_de)return json.loads(ip_de)
4.如何合理去运行ip的爬取?
from redis_task import redis_task as redis,get_ipimport time
import requests# 配置日志记录器import timedef ip_control():'''1.检查redis里面是否有足够的有效ip(>10)- 足够- 达到目标数量(例如 20)后停止更新- 休眠一段时间后再继续更新- 不足够- 开始从 check_url(url_parse_dict) 获取新的有效ip- 新的ip如果与现有的 redis ip 重复,则不放入- 不重复则放入,直到 redis 有效 ip 数量达到目标数量'''target_count = 20 # 目标有效 IP 数量current_page = 1 # 保存当前页码while True:count = redis.find_valid_ip()print('*******************************************************************')print(f"目前redis里面有{count}个有效ip")if count < target_count:valid_ips, page = get_ip.get_kuaidaili(current_page) # 使用 current_pageprint(f"当前返回的页码:{page}")if valid_ips:print(f"有效代理IP有:{len(valid_ips)}")redis.add_to_sorted_set(valid_ips) #必须添加有序集合,确保唯一性 以及后期提取时可以自动移除current_page =page+1 # 更新 current_page,使其递增else:#此时是redis内的有效ip没达到20个print('此时没有达到20个,怎么办?')else:print(f"已经达到目标数量:{target_count},30秒后再更新")time.sleep(10)ip_control()
最后:
当然,此时的`快代理`已经有点不行了.经过我的测试,1~25page 平局只有 8个左右ip有效! 于是需要添加其他的网站------>那么什么是好的免费ip网站呢? 就是一小时内,他的免费ip会更新的,一般都是比较不错的网站!!!
把这代码搞懂了,需要"素材"的可以私
相关文章:
redis+python 建立免费http-ip代理池;验证+留接口
前言: 效果图: 对于网络上的一些免费代理ip,http的有效性还是不错的;但是,https的可谓是凤毛菱角; 正巧,有一个web可以用http访问,于是我就想到不如直接拿着免费的HTTP代理去做这个! 思路: 1.单页获取ipporttime (获取time主要是为了后面使用的时候,依照时效可以做文章) 2.整…...
虚幻C++ day5
角色状态的常见机制 创建角色状态设置到UI上 在MainPlayer.h中新建血量,最大血量,耐力,最大耐力,金币变量,作为角色的状态 //主角状态UPROPERTY(EditDefaultsOnly, BlueprintReadOnly, Category "Playe Stats&…...
C#中的DateTime类
C# 中的 DateTime 类是用于表示日期和时间的结构。它提供了一系列属性和方法,用于处理日期和时间的各种操作和计算。下面是一些常用的 DateTime 类的用法和方法解释,以及相应的示例说明: 创建 DateTime 对象: 使用当前日期和时间创…...
Flutter笔记:Matrix4矩阵变换与案例
Flutter笔记 Matrix4矩阵变换及其案例 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/134474764 【简介…...
数字IC前端学习笔记:时钟切换电路
相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 有些时候我们需要在系统运行时切换系统时钟,最简单的方法就是使用一个MUX(数据选择器)选择输出的时钟,如下代码片所…...
.NET6使用MiniExcel根据数据源横向导出头部标题及数据
.NET6MiniExcel根据数据源横向导出头部标题 MiniExcel简单、高效避免OOM的.NET处理Excel查、写、填充数据工具。 特点: 低内存耗用,避免OOM、频繁 Full GC 情况 支持即时操作每行数据 兼具搭配 LINQ 延迟查询特性,能办到低消耗、快速分页等复杂查询 轻量…...
表内容的操作(增删查改)【MySQL】
文章目录 表的 CRUDCreate(增加)插入记录插入冲突则更新记录替换记录 Retrieve(查找)查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update(修改&…...
C++快速入门 - 2(几分钟让你快速入门C++)
C快速入门 - 2 1. 内联函数1.1 概念1.2 特性 2. auto关键字(C11)2.1 类型别名思考2.2 auto简介2.3 auto的使用细则2.4 auto不能推导的场景 3. 基于范围的for循环(C11)3.1 范围for的语法3.2 范围for的使用条件 1. 内联函数 1.1 概念 以inline修饰的函数叫做内联函数,…...
Excel自定义函数提取超链接
通过自定义函数的方法,批量提取超链接 首选开启开发工具选项 文件-选项-自定义功能区-勾选开发工具选项-确认 AltF11或者直接点击跳转到开发工具-Visual Basic 在左上方VBA project空白处右键点击空白区域-插入-模块 在弹出的窗口中输入以下命令定义GetURL函数 F…...
计算矩阵边缘元素之和
Description 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。 Input 第一行分别为矩阵的行数m和列数n(m<100,n<100),…...
回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测
回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测 目录 回归预测 | Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现HPO-ELM猎食者算法优化极限学习机的数据回归预测(…...
Flutter笔记:目录与文件存储以及在Flutter中的使用(下)
Flutter笔记 目录与文件存储以及在Flutter中的使用(下) 文件读写与Flutter中文件管理 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:…...
机器学习笔记 - Ocr识别中的CTC算法原理概述
一、文字识别 在文本检测步骤中,分割出了文本区域。现在需要识别这些片段中存在哪些文本。 机器学习笔记 - Ocr识别中的文本检测EAST网络概述-CSDN博客文章浏览阅读300次。在 EAST 网络的这个分支中,它合并了 VGG16 网络不同层的特征输出。现在,该层之后的特征大小将等于 p…...
系列二、Lock接口
一、多线程编程模板 线程 操作 资源类 高内聚 低耦合 二、实现步骤 1、创建资源类 2、资源类里创建同步方法、同步代码块 三、12306卖票程序 3.1、synchronized实现 3.1.1、Ticket /*** Author : 一叶浮萍归大海* Date: 2023/11/20 8:54* …...
JVM虚拟机:通过日志学习PS+PO垃圾回收器
我们刚才设置参数的时候看到了-XXPrintGCDetails表示输出详细的GC处理日志,那么我们如何理解这个日志呢?日志是有规则的,我们需要按照这个规则来理解日志中的内容,它有两个格式,一个格式是GC的格式(新生代&…...
从0开始学习JavaScript--JavaScript使用Promise
JavaScript中的异步编程一直是开发中的重要话题。传统的回调函数带来了回调地狱和代码可读性的问题。为了解决这些问题,ES6引入了Promise,一种更现代、更灵活的异步编程解决方案。本文将深入探讨JavaScript中如何使用Promise,通过丰富的示例代…...
使用契约的链上限价订单
我们开发了链上限价订单。 它基于一种称为契约的智能合约,只有在花费输出的交易满足特定条件时才可以花费输出。 为了演示其工作原理,我们实施了以比特币支付的 Ordinals 代币买卖限价订单,无需托管人。 它可以运行在任何比特币协议链上&…...
Iceberg学习笔记(1)—— 基础知识
Iceberg是一个面向海量数据分析场景的开放表格式(Table Format),其设计的目的是解决数据存储和计算引擎之间的适配的问题 表格式(Table Format)可以理解为元数据以及数据文件的一种组织方式,处于计算框架&…...
springboot中动态api如何设置
1.不需要编写controller 等mvc层,通过接口动态生成api。 这个问题,其实很好解决,以前编写接口,是要写controller,需要有 RestController RequestMapping("/test1") public class xxxController{ ApiOperat…...
Java —— 抽象类和接口
目录 1. 抽象类 1.1 抽象类概念 1.2 抽象类语法与特性 1.3 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口的语法规则与特性 2.3 实现多个接口(解决多继承的问题) 2.4 接口间的继承 2.5 抽象类和接口的区别 2.6 接口的使用实例 2.7 Clonable 接口和深拷贝 2.7.1 Cloneable接口 …...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决
问题: pgsql数据库通过备份数据库文件进行还原时,如果表中有自增序列,还原后可能会出现重复的序列,此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”,…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
raid存储技术
1. 存储技术概念 数据存储架构是对数据存储方式、存储设备及相关组件的组织和规划,涵盖存储系统的布局、数据存储策略等,它明确数据如何存储、管理与访问,为数据的安全、高效使用提供支撑。 由计算机中一组存储设备、控制部件和管理信息调度的…...
