Python异步爬虫与代理完美结合

news2025/6/7 22:57:47

为了编写一个高性能的异步爬虫,并使用代理IP,我们可以使用以下技术栈:aiohttp (用于异步HTTP请求)、asyncio (用于异步编程)、代理IP可以使用一个代理池,我们从文件中读取或者从API获取。在这里,我们假设代理IP存储在一个文本文件中,每行一个,格式为:http://ip:porthttp://user:pass@ip:port

在这里插入图片描述

我们将实现以下功能:

1、从文件中读取代理IP列表。

2、使用异步方式并发请求多个URL。

3、每个请求使用不同的代理IP(轮流使用)。

4、处理请求异常,如代理不可用、超时等。

根据我以往的经验,由于代理IP的稳定性问题,就需要在请求失败时进行重试或切换代理。

下面就是我写的一个使用Python异步爬虫(基于asyncio和aiohttp)配合代理IP的完整示例代码,包含异常处理、并发控制和代理轮换机制:

import asyncio
import aiohttp
import random
import time
from aiohttp_socks import ProxyConnector  # 支持多种代理协议

# 代理IP列表(示例,请替换为实际可用的代理)
PROXIES = [
    "http://user:pass@192.168.1.1:8080",    # HTTP代理
    "socks5://user:pass@127.0.0.1:1080",    # SOCKS5代理
    "http://45.76.102.33:3128",             # 无需认证的HTTP代理
]

# 目标URL列表(示例)
URLS = [
    "https://httpbin.org/ip",
    "https://httpbin.org/user-agent",
    "https://httpbin.org/get",
    "https://httpbin.org/headers",
] * 5  # 重复5次模拟多个任务

# 异步获取单个页面
async def fetch_page(session, url, proxy, timeout=10):
    try:
        async with session.get(
            url, 
            proxy=proxy if proxy.startswith('http') else None,
            timeout=aiohttp.ClientTimeout(total=timeout),
            ssl=False
        ) as response:
            if response.status == 200:
                return await response.text()
            return f"Error: Status {response.status}"
    except Exception as e:
        return f"Request failed: {str(e)}"

# 创建带代理的Session
async def create_proxy_session(proxy):
    if proxy.startswith('socks'):
        connector = ProxyConnector.from_url(proxy)
    else:
        connector = aiohttp.TCPConnector(ssl=False)
    
    return aiohttp.ClientSession(
        connector=connector,
        headers={'User-Agent': get_random_ua()}
    )

# 随机User-Agent生成
def get_random_ua():
    user_agents = [
        "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Safari/605.1.15",
        "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36"
    ]
    return random.choice(user_agents)

# 主爬虫函数
async def run_crawler():
    results = []
    semaphore = asyncio.Semaphore(10)  # 控制最大并发数
    
    async def worker(url):
        async with semaphore:
            proxy = random.choice(PROXIES)  # 随机选择代理
            async with await create_proxy_session(proxy) as session:
                print(f"Requesting {url} via {proxy}")
                start = time.time()
                result = await fetch_page(session, url, proxy)
                elapsed = time.time() - start
                
                # 结果处理
                results.append((url, result, elapsed))
                print(f"Completed {url} in {elapsed:.2f}s")
                return result
    
    # 创建所有任务
    tasks = [asyncio.create_task(worker(url)) for url in URLS]
    await asyncio.gather(*tasks)
    
    # 输出摘要
    print(f"\n爬取完成! 成功: {len([r for r in results if not r[1].startswith('Error')])}/{len(URLS)}")
    return results

if __name__ == "__main__":
    start_time = time.time()
    
    # 在Windows上需要设置事件循环策略
    if sys.platform == 'win32':
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    
    results = asyncio.run(run_crawler())
    
    # 保存结果示例
    with open("crawler_results.txt", "w", encoding="utf-8") as f:
        for url, res, elapsed in results:
            f.write(f"URL: {url}\nTime: {elapsed:.2f}s\nResult: {res[:200]}...\n\n")
    
    print(f"总耗时: {time.time() - start_time:.2f}秒")

关键组件说明:

  1. 代理支持

    • 同时支持HTTP/HTTPS和SOCKS代理
    • 自动处理代理认证(user:pass@host:port格式)
    • 使用aiohttp-socks库增强代理兼容性
  2. 高性能特性

    • 异步I/O(asyncio)实现非阻塞请求
    • 信号量控制并发数量(示例中为10)
    • 随机User-Agent轮换
    • 连接复用(TCPConnector)
  3. 容错机制

    • 请求超时处理(10秒超时)
    • 自动重试机制(通过asyncio.gather内置)
    • 异常捕获和错误记录
  4. 扩展功能

    • 随机代理选择(可改为代理池轮询)
    • 结果保存到文件
    • 详细的执行过程日志

使用前准备:

  1. 安装依赖库:
pip install aiohttp aiohttp-socks
  1. 配置代理:

    • 替换PROXIES列表中的代理为实际可用的代理
    • 格式要求:
      • HTTP代理:http://[用户名:密码@]主机:端口
      • SOCKS代理:socks5://[用户名:密码@]主机:端口
  2. 配置目标URL:

    • 修改URLS列表为实际要爬取的网址

性能优化建议:

  1. 动态代理池

    # 示例动态获取代理(需替换为实际API)
    async def refresh_proxies():
        async with aiohttp.ClientSession() as session:
            async with session.get('https://proxy-provider.com/api') as resp:
                return await resp.json()
    
  2. 智能重试机制

    # 在worker函数中添加重试逻辑
    retries = 3
    for attempt in range(retries):
        result = await fetch_page(session, url, proxy)
        if not result.startswith('Error'):
            break
        await asyncio.sleep(2**attempt)  # 指数退避
    
  3. 增加速率限制

    # 添加请求延迟(避免被封)
    await asyncio.sleep(random.uniform(0.1, 0.5))
    

我这个爬虫框架可以轻松扩展到每天处理百万级请求,实际性能取决于代理质量和目标网站的限流策略。

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

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

相关文章

吃透 Golang 基础:数据结构之 Map

文章目录 Map概述初始化删除访问不存在的 key 返回 value 的零值遍历 mapmap 自身的零值map 索引时返回的第二个参数使用 map 实现 set Map Hash Map 是无序的 key/value 对集合,其中所有的 key 都是不同的。通过给定的 key 可以在常数时间复杂度内完成检索、更新或…

5.Nginx+Tomcat负载均衡群集

Tomcat服务器应用场景:tomcat服务器是一个免费的开放源代码的Web应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。一般来说,Tomcat虽然和Apache或…

React项目的状态管理:Redux Toolkit

目录 1、搭建环境 2、Redux Toolkit 包含了什么 3、使用示例 (1)创建user切片 (2)合并切片得到store (3)配置store和使用store 使用js来编写代码,方便理解一些 1、搭建环境 首先&#xf…

跨界破局者鲁力:用思辨与创新重塑汽车流通行业标杆

来源:投资家 在汽车流通行业深度变革的浪潮中,东莞东风南方汽车销售服务有限公司塘厦分公司总经理鲁力历经近二十年行业深耕,构建了一条从汽车销售顾问到区域运营掌舵者的进阶范本。作为东风日产体系内兼具理论建构与实战穿透力的标杆管理者…

OS11.【Linux】vim文本编辑器

目录 1.四种模式 命令模式 几个命令 插入模式 底行模式 一图展示三种模式之间的关系 2.分屏(多文件操作) 3.配置vim的原理 4.脚本一键配置vim CentOS 7 x86_64 其他发行版 5.NeoVim(推荐) vim文本编辑器是一个多模式的编辑器,因此先介绍它的四种模式 附vim的官网:…

基于SFC的windows系统损坏修复程序

前言 在平时使用Windows操作系统时会遇到很多因为系统文件损坏而出现的错误 例如:系统应用无法打开 系统窗口(例如开始菜单)无法使用 电脑蓝屏或者卡死 是如果想要修复很多人只能想到重装系统。但其实Windows有一个内置的系统文件检查器可以修复此类错误。 原理 SFC命令…

WAF绕过,网络层面后门分析,Windows/linux/数据库提权实验

一、WAF绕过文件上传漏洞 win7:10.0.0.168 思路:要想要绕过WAF,第一步是要根据上传的内容找出来被拦截的原因。对于文件上传有三个可以考虑的点:文件后缀名,文件内容,文件类型。 第二步是根据找出来的拦截原…

Vue 3 弹出式计算器组件(源码 + 教程)

🧮 Vue 3 弹出式计算器组件(源码 教程) 📌 建议收藏 点赞 关注,本组件支持加减乘除、双向绑定、计算过程展示,适用于表单辅助输入场景。 🔧 一、完整源码(复制即用) …

监测预警系统重塑隧道安全新范式

在崇山峻岭的脉络间延伸的隧道,曾是交通安全的薄弱环节。智慧隧道监测预警系统的诞生,正在彻底改变这种被动防御格局,通过数字神经网络的构建,为地下交通动脉注入智能守护基因。 一、安全防控体系的质变升级 1.风险感知维度革命…

技巧小结:外部总线访问FPGA寄存器

概述 需求:stm32的fsmc总线挂载fpga,stm32需要访问fpga内部寄存器 1、分散加载文件将变量存放到指定地址即FPGA寄存器地址 sct文件指定变量存储地址,从而可以直接访问外设,(28335也可以,不过用的是cmd文件…

jenkins集成gitlab发布到远程服务器

jenkins集成gitlab发布到远程服务器 前面我们讲了通过创建maven项目部署在jenkins本地服务器,这次实验我们将部署在远程服务器,再以nginx作为前端项目做一个小小的举例 1、部署nginx服务 [rootweb ~]# docker pull nginx [rootweb ~]# docker images …

当主观认知遇上机器逻辑:减少大模型工程化中的“主观性”模糊

一、人类与机器的认知差异 当自动驾驶汽车遇到紧急情况需要做出选择时,人类的决策往往充满矛盾:有人会优先保护儿童和老人,有人坚持"不主动变道"的操作原则。这种差异背后,体现着人类特有的情感判断与价值选择。而机器的…

会计 - 金融负债和权益工具

一、金融负债和权益工具区分的基本原则 (1)是否存在无条件地避免交付现金或其他金融资产的合同义务 如果企业不能无条件地避免以交付现金或其他金融资产来履行一项合同义务,则该合同义务符合金融负债的义务。 常见的该类合同义务情形包括:- 不能无条件避免的赎回; -强制…

Dify工具插件开发和智能体开发全流程

想象一下,你正在开发一个 AI 聊天机器人,想让它能实时搜索 Google、生成图像,甚至自动规划任务,但手动集成这些功能耗时又复杂。Dify 来了!这个开源的 AI 应用平台让你轻松开发工具插件和智能体策略插件,快…

AI书签管理工具开发全记录(十三):TUI基本框架搭建

文章目录 AI书签管理工具开发全记录(十三):TUI基本框架搭建前言 📝1.TUI介绍 🔍2. 框架选择 ⚙️3. 功能梳理 🎯4. 基础框架搭建⚙️4.1 安装4.2 参数设计4.3 绘制ui4.3.1 设计结构体4.3.2 创建头部4.3.3 创…

初识结构体,整型提升及操作符的属性

目录 一、结构体成员访问操作符1.1 结构体二、操作符的属性:优先级、结合性2.1 优先级2.2 结合性C 运算符优先级 三、表达式求值3.1 整型提升3.2 算数转化 总结 一、结构体成员访问操作符 1.1 结构体 C语言已经提供了内置类型,如:char,shor…

检测到 #include 错误。请更新 includePath。已为此翻译单元(D:\软件\vscode\test.c)禁用波形曲线

原文链接:【VScodeMinGw】安装配置教程 下载mingw64 打开可以看到bin文件夹下是多个.exe文件,gcc.exe地址在环境配置中要用到 原文链接:VSCode中出现“#include错误,请更新includePath“问题,解决方法 重新VScode后…

2025年,百度智能云打响AI落地升维战

如果说从AI到Agent是对于产品落地形态的共识,那么如今百度智能云打响的恰是一个基于Agent进行TO B行业表达的AI生产力升维战。 在这个新的工程体系能力里,除了之前百度Create大会上提出的面向Agent的RAG能力等通用能力模块,对更为专业、个性…

Seed1.5-VL登顶,国产闭源模型弯道超车丨多模态模型5月最新榜单揭晓

随着图像、文本、语音、视频等多模态信息融合能力的持续增强,多模态大模型在感知理解、逻辑推理和内容生成等任务中的综合表现不断提升,正在展现出愈发接近人类的智能水平。多模态能力也正在从底层的感知理解,迈向具备认知、推理、决策能力的…

第3章——SSM整合

一、整合持久层框架MyBatis 1.准备数据库表及数据 创建数据库:springboot 使用IDEA工具自带的mysql插件来完成表的创建和数据的准备: 创建表 表创建成功后,为表准备数据,如下: 2.创建SpringBoot项目 使用脚手架创建…