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会更新的,一般都是比较不错的网站!!!    

把这代码搞懂了,需要"素材"的可以私

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/149947.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows环境搭建Zblog博客并发布上线公网可访问

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

总结 CNN 模型:将焦点转移到基于注意力的架构

一、说明 在计算机视觉时代&#xff0c;卷积神经网络&#xff08;CNN&#xff09;几十年来一直是主导范式。直到 2021 年 Vision Transformers (ViTs) 出现&#xff0c;这个领域才开始发生变化。现在&#xff0c;是时候采用受 Transformer 架构启发的基于注意力的模型了&#x…

Springboot+vue的机动车号牌管理系统(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频: Springbootvue的机动车号牌管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的机动车号牌管理系统&#xff0c;采用M&#xff08;model&#xff09…

项目九、无线组网

目录 1 配置AC使AP放出Wifi1.1 确保AP和AC三层互通且AP知道AC的IP1.1.1 配置管理SVI的IP1.1.2 该SVI配置DHCP下发IP给AP 1.2 AC为AP下发配置1.2.1 AC用哪个接口回复AP1.2.2 AC验证AP身份&#xff08;可以不认证&#xff09;1.2.3 配置ssid 文件确定Wifi名称1.2.4 配置security …

Apache Pulsar 技术系列 - 基于 Pulsar 的海量 DB 数据采集和分拣

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制、快速扩容、灵活容错等特性。本文是 Pulsar 技术系列中的一篇&#xff0c;主要介绍 Pulsar 在海量DB Binlog 增量数据采集、分拣场景下的应用。 前言…

程序员开发者神器:10个.Net开源项目

今天一起盘点下&#xff0c;8月份推荐的10个.Net开源项目&#xff08;点击标题查看详情&#xff09;。 1、基于C#开发的适合Windows开源文件管理器 该项目是一个基于C#开发、开源的文件管理器&#xff0c;适用于Windows&#xff0c;界面UI美观、方便轻松浏览文件。此外&#…

课程设计:C++实现哈夫曼编码

功能实现&#xff1a; //1:先计算每个字符的权重//2&#xff1a;构建哈夫曼树//3&#xff1a;得出每个字符的哈夫曼编码。//4:根据哈夫曼编码转化为字符 代码实现&#xff1a; // 哈夫曼编码.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 //1:先计…

【如何让你的建筑设计更高效】推荐7个3DMAX建筑设计的实用插件

3DMAX是创建具有复杂对象和照片级真实感材质的大型三维项目的绝佳工具。它有用于粒子模拟和参数化建模的内置工具&#xff0c;只要有足够的时间和练习&#xff0c;你就可以创建任何东西。然而&#xff0c;总有改进的余地。许多第三方开发人员已经发布了自己的扩展&#xff0c;也…

YOLOv8优化策略:轻量级Backbone改进 | VanillaNet极简神经网络模型 | 华为诺亚2023

🚀🚀🚀本文改进:一种极简的神经网络模型 VanillaNet,支持vanillanet_5, vanillanet_6, vanillanet_7, vanillanet_8, vanillanet_9, vanillanet_10, vanillanet_11等版本 🚀🚀🚀YOLOv8改进专栏:http://t.csdnimg.cn/hGhVK 学姐带你学习YOLOv8,从入门到创新,…

Spring高级bean的实例化方法

bean的实例化方法 构造方法 实例化bean第一种&#xff1a;使用默认无参构造函数(常用) 第二种创建bean实例&#xff1a;静态工厂实例化&#xff08;了解&#xff09; 第三种&#xff1a;实例工厂&#xff08;了解&#xff09;与FactoryBean&#xff08;实用&#xff09;

JVM判断对象是否存活之引用计数法、可达性分析

目录 前言 引用计数法 概念 优点 缺点 可达性分析 概念 缺点&#xff1a; 扩展&#xff1a; 1.GC Roots 概念 2.STW (Stop the world) 前言 JVM有两种算法来判断对象是否存活&#xff0c;分别是引用计数法和可达性分析算法&#xff0c;针对可达性分析算法STW时间长、…

【MySQL】_JDBC

目录 1. JDBC原理 2. 导入JDBC驱动包 3. 编写JDBC代码实现Insert 3.1 创建并初始化一个数据源 3.2 和数据库服务器建立连接 3.3 构造SQL语句 3.4 执行SQL语句 3.5 释放必要的资源 4. JDBC代码的优化 4.1 从控制台输入 4.2 避免SQL注入的SQL语句 5. 编写JDBC代码实现…

〖大前端 - 基础入门三大核心之JS篇㊲〗- DOM改变元素节点的css样式、HTML属性

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

Python数据分析实战① Python实现数据可视化

文章目录 一、数据可视化介绍二、matplotlib和pandas画图1.matplotlib简介和简单使用2.matplotlib常见作图类型3.使用pandas画图4.pandas中绘图与matplotlib结合使用 三、订单数据分析展示四、Titanic灾难数据分析显示 一、数据可视化介绍 数据可视化是指将数据放在可视环境中…

.Net中Redis的基本使用

前言 Redis可以用来存储、缓存和消息传递。它具有高性能、持久化、高可用性、扩展性和灵活性等特点&#xff0c;尤其适用于处理高并发业务和大量数据量的系统&#xff0c;它支持多种数据结构&#xff0c;如字符串、哈希表、列表、集合、有序集合等。 Redis的使用 安装包Ser…

wpf devexpress 排序、分组、过滤数据

这个教程示范在GridControl如何排序数据&#xff0c;分组数据给一个行创建一个过滤。这个教程基于前一个教程。 排序数据 可以使用GridControl 排序数据。这个例子如下过滤数据对于Order Date 和 Customer Id 行&#xff1a; 1、对于Order Date 和 Customer Id 行指定Colum…

Linux虚拟机中网络连接的三种方式

Linux 虚拟机中网络连接的三种方式 先假设一个场景&#xff0c;在教室中有三个人&#xff1a;张三、李四和王五&#xff08;这三个人每人有一台主机&#xff09;&#xff0c;他们三个同处于一个网段中&#xff08;192.169.0.XX&#xff09;&#xff0c;也就是说他们三个之间可…

深度学习_13_YOLO_图片切片及维度复原

需求&#xff1a; 在对获取的图片进行识别的时候&#xff0c;如果想减少不必要因素的干扰&#xff0c;将图片切割只对有更多特征信息的部分带入模型识别&#xff0c;而剩余有较多干扰因素的部分舍弃&#xff0c;这就是图片切割的目的&#xff0c;但是又由于模型对图片的维度有较…

Spring Cloud学习(十)【Elasticsearch搜索功能 分布式搜索引擎02】

文章目录 DSL查询文档DSL查询分类全文检索查询精准查询地理坐标查询组合查询相关性算分Function Score Query复合查询 Boolean Query 搜索结果处理排序分页高亮 RestClient查询文档快速入门match查询精确查询复合查询排序、分页、高亮 黑马旅游案例 DSL查询文档 DSL查询分类 …

QT day3作业

1.思维导图 2、 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密…