You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python批量爬取20万条URL耗时过长 如何优化提升爬取速度

批量爬取20万条URL提速方案

你的代码目前的核心瓶颈是同步串行请求,单线程下每次请求都要等待服务器响应后才会发起下一个请求,绝大多数时间都浪费在IO等待上,自然跑不完20万条量级的任务。可参考以下方案优化:

  • 替换同步请求库为异步框架
    放弃requests同步库,改用aiohttp异步请求库,基于协程并发发起请求,可大幅压榨IO等待时间。并发数建议控制在10~50区间,可根据目标站的反爬策略灵活调整,避免触发封禁。示例核心代码如下:
import aiohttp
import asyncio
from bs4 import BeautifulSoup

async def fetch(session, id, semaphore):
    headers = {"Referer": "https://www.betexplorer.com",
               'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'}
    url = f'https://www.betexplorer.com{id}'
    async with semaphore:
        async with session.get(url, headers=headers) as response:
            text = await response.text()
            soup = BeautifulSoup(text, 'lxml')
            season = url.split('/')[5]
            # 原有处理逻辑
            return result

async def get_odds(ids):
    semaphore = asyncio.Semaphore(20) # 控制并发数为20
    async with aiohttp.ClientSession() as session:
        tasks = [fetch(session, id, semaphore) for id in ids]
        results = await asyncio.gather(*tasks)
    return results
  • 优化HTML解析速度
    将BeautifulSoup的解析器从默认的html.parser替换为lxml,仅需提前安装lxml库(pip install lxml),解析速度可提升30%以上,对20万条量级的任务收益非常明显。
  • 多进程+协程结合压榨性能
    如果单进程协程跑满后CPU仍有富余,可将20万条URL拆分为多个分片,每个分片交给独立的进程处理,每个进程内部单独跑异步协程逻辑,充分利用CPU多核性能,进一步提升整体处理速度。
  • 增加失败重试机制
    给请求逻辑增加重试规则,仅对5xx错误、连接超时、429限流错误进行重试,404等不存在的页面直接跳过,避免因为网络波动或临时限流导致部分数据丢失,不需要后续重爬全量数据。
  • 调整反爬策略减少拦截
    可以准备多个User-Agent值,每次请求随机取用,同时根据目标站的返回情况灵活调整并发数和请求间隔,避免被封IP导致整体任务中断。

内容的提问来源于stack exchange,提问作者luka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:57:02