当前位置: 首页 > news >正文

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (二)

继上一章:

CSDN

本次需要做的是进行有效ip的验证!

我们知道,从网页上爬取上千上万个ip之后,因为是免费的代理,所以,对这上千上万个ip进行验证有效性就需要考虑效率上的问题了;

而验证ip有效性的唯一办法,就是通过对网络发起请求;如果state=200,就是有效,否则就是无效;

而上千万次的发起请求,如果通过多线程去做,势必会增加服务器的压力;

因此,只能通过异步去验证IP是否有效:

async def check_ip(session, proxy):"""...略去其它注释,同时函数的docstring也要更新..."""proxy_url = f"http://{proxy['ip']}:{proxy['port']}"try:async with session.get(url="http://httpbin.org/ip", timeout=1.5, proxy=proxy_url) as response:# 返回原始代理信息和有效性状态return proxy, response.status == 200except (aiohttp.ClientError, asyncio.TimeoutError):# 返回原始代理信息和无效状态return proxy, Falseasync def check_ip_main(proxies):"""检查IP有效性并返回所有有效的IP列表"""async with aiohttp.ClientSession() as session:tasks = [asyncio.create_task(check_ip(session, proxy)) for proxy in proxies]valid_proxies = []  # 初始化一个空列表来存放有效的代理for task in asyncio.as_completed(tasks):proxy, is_valid = await task  # 这里我们期望 check_ip 也返回对应的 proxy 信息if is_valid:#当返回来是True的时候,他就会加入到valid_proxies里面;valid_proxies.append(proxy)return valid_proxies

通过这两个方法:

 首先:

    一页url假设有100个ip,我们获取他之后,他就是成这样的格式:[{ip:122.250.32.1,port:5212},{///}...]

     所以,我们将它添加到异步列表里,再进行单个检查,返回true\false 就可以定义他的有效性了!

最后,将得到的有效ip添加到redis里即可;

这里是本章+上章的全部代码:

import logging
import asyncio
import aiohttp
import time
from bs4 import BeautifulSoup
from db.redis_task import temp_for_ippoollogger = logging.getLogger(__name__)
logging.basicConfig(level=logging.INFO)#请求头
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',
}# 异步获取URL的函数
async def fetch_url(session, url):try:async with session.get(url, timeout=3,headers=headers) as response:return await response.text()except aiohttp.ClientError as e:logger.exception("爬取相关url出错: %s", url)async def parse_html(html):'''解析代码,如果标题包含'89免费代理',如果包含"快代理"--->就是快代理:param html::return:'''soup = BeautifulSoup(html, 'html.parser')title = soup.find('title')if '89免费代理' in title.getText():table = soup.find('table', class_='layui-table')tbody = table.find('tbody')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_list.append(proxy)return proxy_listasync def check_ip(session, proxy):"""...略去其它注释,同时函数的docstring也要更新..."""proxy_url = f"http://{proxy['ip']}:{proxy['port']}"try:async with session.get(url="http://httpbin.org/ip", timeout=1.5, proxy=proxy_url) as response:# 返回原始代理信息和有效性状态return proxy, response.status == 200except (aiohttp.ClientError, asyncio.TimeoutError):# 返回原始代理信息和无效状态return proxy, Falseasync def check_ip_main(proxies):"""检查IP有效性并返回所有有效的IP列表"""async with aiohttp.ClientSession() as session:tasks = [asyncio.create_task(check_ip(session, proxy)) for proxy in proxies]valid_proxies = []  # 初始化一个空列表来存放有效的代理for task in asyncio.as_completed(tasks):proxy, is_valid = await task  # 这里我们期望 check_ip 也返回对应的 proxy 信息if is_valid:#当返回来是True的时候,他就会加入到valid_proxies里面;valid_proxies.append(proxy)return valid_proxies# 异步操作,在其中打开会话和调用fetch任务
async def main(urls):async with aiohttp.ClientSession() as session:tasks = [fetch_url(session, url) for url in urls]for future in asyncio.as_completed(tasks):html = await futureif html:proxys = await parse_html(html)# 适当等待chek_ip_main 协程proxys_list= await check_ip_main(proxys)print(proxys_list)# URL 列表
urls = ["https://www.89ip.cn/index_{}.html".format(i+1) for i in range(25)]# 运行协程
stat =time.time()
asyncio.run(main(urls))
end =time.time()print(f'一共用了{(end-stat)}秒')

我做的效果图:

相关文章:

异步爬取+多线程+redis构建一个运转丝滑且免费http-ip代理池 (二)

继上一章: CSDN 本次需要做的是进行有效ip的验证! 我们知道,从网页上爬取上千上万个ip之后,因为是免费的代理,所以,对这上千上万个ip进行验证有效性就需要考虑效率上的问题了; 而验证ip有效性的唯一办法,就是通过对网络发起请求;如果state200,就是有效,否则就是无效; 而上…...

HugeGraph安装与使用

1、HugeGraph-Server与HugeGraph-Hubble下载 HugeGraph官方地址:https://hugegraph.apache.org/ 环境为:linux 官网是有模块版本对应关系,尽量下载较新版本,hubble1.5.0之前是studio功能比较少。官网已经下架server,其他模块下载也比较慢。可以在网上找…...

计算机端口

前言 计算机端口(Port)是一种用于在计算机网络中标识特定服务或应用程序的机制。 端口是一个数字,范围从0到65535,用于将网络通信分配给不同的应用程序或服务。 在 Internet 协议套件(TCP/IP)中&#xff0…...

激发创新,助力研究:CogVLM,强大且开源的视觉语言模型亮相

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…...

centos 6.10 安装 perl 5.14

下载安装包 运行下面命令: wget http://www.cpan.org/src/5.0/perl-5.14.2.tar.gz也可以直接下载好安装包,再拷到虚拟机 安装 执行下面命令 tar -xvzf perl-5.14.2.tar.gz #解压安装包 cd perl-5.14.2 ./Configure -des -Dprefix/usr/local/perl ma…...

Elasticsearch:FMA 风格的向量相似度计算

作者:Chris Hegarty 在 Lucene 9.7.0 中,我们添加了利用 SIMD 指令执行向量相似性计算的数据并行化的支持。 现在,我们通过使用融合乘加 (Fused Mulitply-Add - FMA) 进一步推动这一点。 什么是 FMA 乘法和加法是一种常见的运算,…...

思维模型 等待效应

本系列文章 主要是 分享 思维模型 ,涉及各个领域,重在提升认知。越是等待,越是焦虑。 1 等待效应的应用 1.1 等待效应在管理中的应用 西南航空公司是一家美国的航空公司,它在管理中运用了等待效应。西南航空公司鼓励员工在工作中…...

Linux下使用宏定义判断系统架构和系统类型

文章目录 查看编译器当前支持的宏定义查找指定的宏不同架构不同系统 附录-编译器内部常用的一些宏定义宏定义实际应用使用宏定义判断系统架构使用宏定义判断系统类型 一般情况下在linux下做C/C方面的开发不需要太关注系统架构,当然如果涉及到不同架构下的适配问题&a…...

Python---把函数的返回值作为另外一个函数的参数

def test1():return 50def test2(num):print(num)# 1. 保存函数test1的返回值 result test1()# 2.将函数返回值所在变量作为参数传递到test2函数 test2(result) # 50...

231123 刷题日报-动态规划

今天主要看了DP,前几天频繁遇到DP打击有点大。。 1. 0-1背包问题 要点: a. 三部曲: 1. 状态和选择 状态:物品序号、背包容量 选择:放、不放 2. dp数组定义、base case dp[i][w] 对于前i个物品,当前背包…...

微信小程序前端环境搭建

搭建微信小程序前端环境 申请小程序测试账号 访问路径 使用微信扫描二维码进行申请,申请成功之后,进入界面,获取小程序ID(AppID)和秘钥(AppSecret) 安装微信web开发者工具 访问路径 选择稳定开发的版本 需要在小程序的设置中将默认关闭…...

【Qt一坑】qt编译出现“常量中有换行符”

在qt编译过程中出现“常量中有换行符”,原因有以下几点(qt版本5.14.2): 1.中文编码格式问题,将UTF-8编码格式改成 UTF-8 BOM。 或者使用QtCreator 进行如下设置(找到Qt的左边列表里的项目,下的…...

C++每日选择题—Day1

第一题 以下C代码会输出什么? #include <iostream> using namespace std; class A { public:A() {}~A() {} private:static int a; }; int main() {cout << sizeof(A) << endl;return 0; } A&#xff1a;0 B&#xff1a;1 C&#xff1a;4 D&#xff1a;8 答…...

【实用】mysql配置 及将线上数据导入本地 问题解决及记录

[ERR] 1292 - Incorrect datetime value: ‘0000-00-0000:00:00‘ for column ‘BIRTH_DATE‘ at row 1 此问题是mysql当前配置不支持日期为空&#xff0c;或者为‘0000-00-0000:00:00‘得情况 1、直接在数据库执行 # 修改全局 set global.sql_mode ONLY_FULL_GROUP_BY,STR…...

如何下载OpenJDK及其源码

如果想下载 OpenJDK&#xff0c;存在以下几种办法&#xff1a; 最简单的办法是去 OpenJDK 官网&#xff0c;这里能下载 JDK9 及其以上的版本&#xff0c;还有 JDK 源码所在的 github 地址。 第二种方法是使用 IDEA 下载&#xff0c;位置在 File->Project Structure->SD…...

[Android]使用Retrofit进行网络请求

以下是使用 Retrofit 发送 POST 请求获取分页城市列表的 Kotlin 代码示例 1.在你的 build.gradle 文件中添加 Retrofit 和 Gson 的依赖 dependencies {......implementation("com.squareup.retrofit2:retrofit:2.9.0")implementation("com.squareup.retrofit2…...

OpenGL 绘制圆形平面(Qt)

文章目录 一、简介二、代码实现三、实现效果一、简介 这里使用一种简单的思路来生成一个圆形平面: 首先,我们需要生成一个单位圆,半径为1,法向量为(0, 0, 1),这一步我们可以使用一些函数生成圆形点集。之后,指定面片的索引生成一个圆形平面。当然这里为了后续管理起来方便…...

JAVA系列---Servlet详解

目录 背景为何会出现ServletWeb开发的本质 ServletsCGIFastCGIWSGIServlet总结 wsgi与servlet出现时间社区特点对web开发的影响 servlet详解特性主要工作执行逻辑 应用Tomcat背景embedded tomcat本质 背景 为何会出现Servlet Servlet是Server Applet 的缩写&#xff0c;译为“…...

机器人制作开源方案 | 钻孔植树一体化沙漠车

作者&#xff1a;徐邦国、张博宇、刘露、李晶晶、吕洁秀单位&#xff1a;天津职业技术师范大学 机械工程学院指导老师&#xff1a;何永利 摘要&#xff1a;本项目旨在设计一种专用于沙漠植树的植树车&#xff0c;以沙漠自动化植树为研究对象&#xff0c;提出一种创新式钻…...

OmniGraffle

安装 在mac上安装OmniGraffle&#xff0c;找一个正版或者啥的都行&#xff0c;安装好后&#xff0c;可以直接在网上找一个激活码&#xff0c;然后找到软件的许可证&#xff0c;进行添加即可。 使用 新建空白页 然后图形啥的看一眼工具栏就知道了&#xff0c;颜色形状还是挺…...

Phi-4-mini-reasoning轻量模型部署成本分析:单卡月均电费与推理QPS性价比

Phi-4-mini-reasoning轻量模型部署成本分析&#xff1a;单卡月均电费与推理QPS性价比 1. 模型概述 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它经过专门微调以提升…...

QMCDecode终极指南:3步轻松解密QQ音乐加密格式

QMCDecode终极指南&#xff1a;3步轻松解密QQ音乐加密格式 【免费下载链接】QMCDecode QQ音乐QMC格式转换为普通格式(qmcflac转flac&#xff0c;qmc0,qmc3转mp3, mflac,mflac0等转flac)&#xff0c;仅支持macOS&#xff0c;可自动识别到QQ音乐下载目录&#xff0c;默认转换结果…...

百度网盘解析工具:免费突破限速的终极指南

百度网盘解析工具&#xff1a;免费突破限速的终极指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾为百度网盘的下载速度而烦恼&#xff1f;非会员下载大文件时&am…...

coze-loop常见问题解决:页面打不开、优化无响应怎么办?

coze-loop常见问题解决&#xff1a;页面打不开、优化无响应怎么办&#xff1f; 1. 问题概述&#xff1a;为什么我的coze-loop无法正常工作&#xff1f; 当你兴冲冲地部署好coze-loop&#xff0c;准备体验AI代码优化时&#xff0c;却遇到了页面打不开或者优化无响应的情况&…...

详解CN域名注册:流程、要求、材料及注意事项全解析

CN域名作为中国国家顶级域名&#xff0c;凭借其本土标识和稳定性能&#xff0c;成为深耕国内市场的首选。注册受CNNIC严格监管&#xff0c;遵循规范流程至关重要。本文国科云将系统梳理cn域名注册全流程、核心要求及关键注意事项。一、CN域名注册核心流程CN域名注册遵循“先申请…...

记事本txt文件里面内容中下划线看不见

这是 Win11 23H2/24H2 记事本的已知渲染 Bug&#xff1a;在默认字体&#xff08;微软雅黑/Consolas&#xff09; 非 100% DPI 缩放&#xff08;常见 125%/150%&#xff09;时&#xff0c;下划线 _ 会被“吃掉”&#xff0c;显示成空白。 快速解决&#xff08;任选其一&#xff…...

TensorRT-LLM与Triton部署AI编程助手实战

1. 基于TensorRT-LLM和Triton的AI编程助手部署指南在当今软件开发领域&#xff0c;AI编程助手正迅速成为开发者日常工作的标配工具。根据行业预测&#xff0c;到2025年&#xff0c;80%的产品开发生命周期将使用生成式AI进行代码编写。本文将手把手教你如何利用NVIDIA TensorRT-…...

数据科学家成长路线图:从零到一构建核心技能与项目实战

1. 项目概述&#xff1a;一份数据科学家的成长蓝图最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“Data-Science-Roadmap”&#xff0c;作者是Moataz Elmesmary。这本质上是一份开源的学习路线图&#xff0c;旨在为想进入数据科学领域的人&#xff0c;或者已经在这个领域…...

【困难】用栈来求解汉诺塔问题-Java:解法一

分享一个大牛的人工智能教程。零基础&#xff01;通俗易懂&#xff01;风趣幽默&#xff01;希望你也加入到人工智能的队伍中来&#xff01;请轻击人工智能教程大家好&#xff01;欢迎来到我的网站&#xff01; 人工智能被认为是一种拯救世界、终结世界的技术。毋庸置疑&#x…...

云原生环境中的边缘计算:从K3s到KubeEdge的全面指南

云原生环境中的边缘计算&#xff1a;从K3s到KubeEdge的全面指南 &#x1f525; 硬核开场 各位技术大佬们&#xff0c;今天咱们来聊聊云原生环境中的边缘计算。别跟我说你的边缘设备还在裸跑&#xff0c;那都不叫现代化&#xff01;在云原生时代&#xff0c;边缘计算已经成为连…...