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
相关产品推荐
相关产品推荐

