数据分析异步进阶:aiohttp与Asyncio性能提升

本文涉及的产品
实时数仓Hologres,5000CU*H 100GB 3个月
实时计算 Flink 版,5000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 本项目基于aiohttp与Asyncio开发异步爬虫,目标采集今日头条新闻数据。初期因网站限制机制导致请求异常,通过设置代理IP、Cookie和UserAgent解决拦截问题,并优化异步任务调度与异常捕获提升性能。方案包括动态代理池、统一请求头配置及日志监控,确保高并发下的稳定性。示例代码展示代理IP、请求头设置与错误处理方法,为类似项目提供参考。

爬虫代理

一、时间轴呈现方案进程

  • 2023-04-01:需求确认
    确定目标:使用aiohttp与Asyncio提升采集性能,目标采集今日头条网站的新闻数据(标题、内容、时间等)。同时要求在程序中加入代理IP、Cookie和UserAgent的设置,保证反爬策略应对得当。
  • 2023-04-02:初步开发与测试
    开发基础异步爬虫框架,实现对目标网站的异步请求。初步测试发现由于目标网站限制措施,直接请求经常返回异常或内容不全。
  • 2023-04-03:故障排查与代理接入
    针对请求失败和响应延迟问题,通过接入爬虫代理,调整代理IP设置,同时补充Cookie和UserAgent信息。测试后部分请求得到正常返回,但在并发量较大时仍有部分超时现象。
  • 2023-04-04:架构优化与性能提升
    对异步任务调度、连接超时和异常捕获进行了优化。改进后的方案显著提升了响应速度和成功率,爬取任务运行稳定。

二、方案分析

在开发过程中遇到的主要问题包括:

  • 直接请求被目标网站防爬机制拦截
    由于今日头条对采集有较高的防护力度,直接请求时会被判定为恶意访问,返回的数据可能为空或错误信息。
    解决方案:
    • 设置合理的Cookie与UserAgent,模拟浏览器正常访问行为。
    • 使用代理IP技术(如爬虫代理),通过代理切换IP,降低单一IP被限制的风险。
  • 异步请求管理与异常捕获不足
    在高并发场景下,网络延迟和异常情况频发,导致部分任务中断。
    解决方案:
    • 采用aiohttp的异步请求和合理的超时设置,保障请求超时能够及时中断。
    • 加强异常捕获和重试机制,确保即使部分请求失败,也不会影响整体任务执行。
  • 性能瓶颈与资源浪费
    未充分利用Asyncio的并发优势,任务调度不够高效。
    解决方案:
    • 优化异步任务调度,合理设置并发数,避免因大量任务同时发起请求而引发连接阻塞。
    • 分析任务执行情况,针对耗时环节进行针对性优化。

三、架构改进方案

经过前期的故障排查,架构改进的核心在于以下几点:

  1. 完善代理IP配置
    将代理IP接入作为全局配置,并支持动态代理池扩展,以应对IP限制风险。
  2. 统一请求头设置
    在代码中统一配置Cookie与UserAgent信息,模拟真实浏览器请求,并在请求前后动态调整以适应目标网站变化。
  3. 异步请求与异常捕获优化
    利用aiohttp与Asyncio构建高性能异步爬虫,设置合理的连接超时和重试机制,确保在高并发场景下的稳定性。
  4. 日志与监控机制
    引入日志记录系统,实时监控请求状态与异常情况,便于故障定位和后续性能调优。

四、示例代码实现

下面是一段示例代码,展示了如何使用aiohttp与Asyncio构建一个异步爬虫,并集成代理IP(参考爬虫代理的配置)、Cookie、UserAgent以及简单的错误处理。
请根据实际情况替换代理域名、端口、用户名、密码与Cookie信息。

import asyncio
import aiohttp

# 异步请求函数,爬取今日头条首页内容
async def fetch_news(session, url):
    # 设置请求头,包括UserAgent和Cookie(根据实际情况替换)
    headers = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                      '(KHTML, like Gecko) Chrome/90.0.4430.85 Safari/537.36',
        'Cookie': 'your_cookie_string_here'
    }
    try:
        # 发送GET请求
        async with session.get(url, headers=headers) as response:
            if response.status == 200:
                # 成功获取页面内容
                html = await response.text()
                print("成功获取页面内容")
                # TODO:在此处解析html,提取新闻标题、内容、时间等信息
                return html
            else:
                print(f"请求失败,状态码:{response.status}")
    except Exception as e:
        print(f"请求过程中出现异常:{e}")

# 主异步任务入口
async def main():
    # 目标网站
    url = "https://www.toutiao.com"
    # 配置爬虫代理参数(请替换为实际值,参考亿牛云爬虫代理 www.16yun.cn)
    proxy_url = "http://16YUN:16IP@proxy.16yun.cn:8100"
    # 设置客户端请求超时时间
    timeout = aiohttp.ClientTimeout(total=10)

    # 创建异步会话,设置代理参数
    async with aiohttp.ClientSession(timeout=timeout) as session:
        # 使用代理IP发起请求
        try:
            # aiohttp支持在请求中指定代理
            async with session.get(url, proxy=proxy_url) as response:
                if response.status == 200:
                    html = await response.text()
                    print("使用代理IP成功获取页面内容")
                    # TODO:解析html内容,提取新闻数据
                else:
                    print(f"代理请求失败,状态码:{response.status}")
        except Exception as e:
            print(f"代理请求过程中出现异常:{e}")

        # 额外测试:直接调用fetch_news函数
        result = await fetch_news(session, url)
        print(result)

# 启动异步任务
if __name__ == '__main__':
    asyncio.run(main())
AI 代码解读

代码说明

  • 代理IP设置:在proxy_url中按照格式 http://用户名:密码@代理域名:端口 配置代理,示例中使用了亿牛云爬虫代理的参考格式。
  • 请求头设置:通过headers参数统一配置UserAgent和Cookie,模拟真实浏览器访问,提升请求成功率。
  • 异步请求与错误捕获:利用aiohttp和Asyncio实现异步请求,并在请求过程中捕获异常,保证在高并发下任务的稳定执行。
  • 数据解析部分:示例代码中预留了解析HTML提取新闻信息的TODO部分,可根据需要引入BeautifulSoup、lxml或正则表达式进一步解析。

五、结语

本文从故障排查的实际场景出发,记录了项目从需求确认、问题排查到架构改进的全过程。在开发过程中,通过合理设置代理IP、Cookie、UserAgent以及优化异步请求流程,有效提升了aiohttp与Asyncio爬虫的性能与稳定性。希望本文提供的方案和示例代码能为各位在实际开发中遇到类似问题时提供借鉴和帮助。

目录
打赏
0
1
1
0
203
分享
相关文章
Polars库:数据分析的新星,性能与易用性的完美结合
Polars库:数据分析的新星,性能与易用性的完美结合
241 1
无缝集成 MySQL,解锁秒级数据分析性能极限
在数据驱动决策的时代,一款性能卓越的数据分析引擎不仅能提供高效的数据支撑,同时也解决了传统 OLTP 在数据分析时面临的查询性能瓶颈、数据不一致等挑战。本文将介绍通过 AnalyticDB MySQL + DTS 来解决 MySQL 的数据分析性能问题。
利用数据分析工具评估特定业务场景下扩缩容操作对性能的影响
通过以上数据分析工具的运用,可以深入挖掘数据背后的信息,准确评估特定业务场景下扩缩容操作对 PolarDB Serverless 性能的影响。同时,这些分析结果还可以为后续的优化和决策提供有力的支持,确保业务系统在不断变化的环境中保持良好的性能表现。
107 48
性能碾压pandas、polars的数据分析神器来了
性能碾压pandas、polars的数据分析神器来了
195 2
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level
第4代 AMD EPYC加持,云原生数仓AnalyticDB分析轻松提速。
性能30%↑|阿里云AnalyticDB*AMD EPYC,数据分析步入Next Level
关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理,进行数据探索,选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。
【7月更文挑战第5天】这是一个关于Python数据分析项目的简要概述:从CSV加载数据,执行数据预处理(填充缺失值,处理异常值),进行数据探索(可视化和统计分析),选择线性回归模型进行训练,评估模型性能并优化,最后结果解释与可视化。此案例展示了数据科学的典型流程。
128 2
性能30%↑|阿里云AnalyticDB X AMD EPYC,数据分析步入Next Level
阿里云原生数仓 AnalyticDB for PostgreSQL 与 AMD 新一代硬件深度优化,结合全自研计算引擎及行列混合存储实现性能升级,综合性能提升30%。结合丰富的企业级能力帮助企业构建离在线一体、流批一体综合数据分析平台,采用同一引擎即可满足离线批处理、流式加工,交互式分析三种场景,在开发运维、时效性及成本上具备更高的性价比。
552 0
Arm 发布 Neoverse 新品:数据分析性能提升 196%,奠定未来计算及 AI 的基石
北京时间 2 月 22 日,半导体巨头 Arm 更新了 Arm® Neoverse™ 产品路线图,宣布推出两款基于全新第三代 Neoverse IP 构建的全新计算子系统(CSS):Arm Neoverse CSS V3 和 Arm Neoverse CSS N3。