推荐从10–30起步,用asyncio.Semaphore(20)控制协程并发数;显式配置TCPConnector(limit=30, limit_per_host=5, ttl_dns_cache=300)以平衡反爬与资源利用率。

并发数设多少才不被封又不浪费资源
设太高会触发目标站的反爬(比如 502/429 错误),太低又拖慢整体速度。实际中 aiohttp 的并发上限主要受三方面限制:DNS 解析、TCP 连接池、本地文件描述符。推荐从 10–30 起步,用 asyncio.Semaphore(20) 控制协程并发数,而不是盲目加大 connector.limit。
常见错误是只调大 connector.limit 却忽略 DNS 缓存——默认 aiohttp.TCPConnector 不缓存 DNS,高频请求下 DNS 查询可能成为瓶颈。应显式启用:TCPConnector(limit=30, limit_per_host=5, keepalive_timeout=30, ttl_dns_cache=300)。
如何安全处理超时、重试和异常响应
直接用 session.get(url) 不设超时,协程可能卡死;不处理 ClientConnectorError 或 ServerDisconnectedError,整个任务流会中断。必须为每次请求配独立超时,并区分网络层与业务层失败。
-
timeout=ClientTimeout(total=15, connect=5, sock_read=10):避免单个请求拖垮整批 - 对
503、429做指数退避重试(最多 2 次),但跳过404、403 - 用
raise_for_status()前先检查response.status,否则 4xx/5xx 会抛异常打断流程
保存 HTML 时怎么避免乱码和文件名冲突
很多网页 Content-Type 缺少 charset,或声明了 gbk 却实际发 utf-8,直接用 response.text() 容易解码失败。更稳妥的是用 response.read() 拿原始 bytes,再交由 chardet 或 charset_normalizer 推测编码。
librosa 是一个用于音频和音乐分析的 Python 库。它提供了特征提取、频谱分析、节拍跟踪、起始检测和音频可视化的工具,基于 NumPy 和 SciPy 构建,用于科学音频计算。
立即学习“Python免费学习笔记(深入)”;
文件名方面,URL 中的 /、?、& 不能直接作路径,也别用完整 URL 哈希(如 sha256(url.encode()).hexdigest())——不同参数的 URL 可能对应同一页面,导致覆盖。建议取域名 + 路径最后一段 + 截断到 64 字符,再过滤非法字符:re.sub(r'[:"/\|?*]', '_', safe_part)。
内存爆掉前必须做的三件事
下载数万个网页时,如果把所有 response.text() 结果全塞进一个 list,很容易 OOM。关键不是“怎么快”,而是“怎么稳住内存”。
- 用
async for chunk in response.content.iter_chunked(8192)流式写入文件,不缓存全文本 - 每完成一批(比如 100 个)就显式
await asyncio.sleep(0.01),给事件循环喘息机会,防 CPU 占满 - 别在协程里做耗时解析(如
BeautifulSoup),先存原始 HTML,后续用多进程单独处理
真正卡住的往往不是网络,而是没控制好内存释放节奏和系统级资源竞争。跑之前记得用 ulimit -n 看下文件描述符上限,Linux 默认常是 1024,不够用得调高。

















