如何使用Python最快发送百万条带固定url、headers、body的POST请求
关于Python批量发送百万级POST请求的解答
首先明确结论:可以实现,但你当前使用的同步requests单线程串行方案完全无法满足百万级请求的效率要求,需要改用并发/异步实现,同时需要留意服务端限流、本地资源占用等限制条件。
现有代码的问题
你当前的代码是单线程同步执行逻辑:每次发送请求后必须等待服务端响应返回,才会执行下一次请求。按照单请求平均响应耗时100ms估算,每秒最多发送10条请求,跑完百万条需要超过27小时,完全不具备可行性。
另外你当前代码中的headers和body赋值为字符串格式,实际使用时需要调整为符合接口要求的字典格式:如果提交的是JSON格式请求体,建议直接使用requests.post的json参数传参,无需手动序列化/反序列化。
推荐实现方案
百万级请求优先选择异步IO方案,性能远高于多线程/多进程方案,推荐使用aiohttp库实现,核心逻辑是通过协程实现高并发,同时控制并发上限避免资源耗尽。
异步实现示例代码
import asyncio import aiohttp # 你的配置信息 URL = "https://abcd.com" HEADERS = {"Content-Type": "application/json"} # 替换为实际请求头 BODY = {"key": "value"} # 替换为实际请求体 # 并发上限,根据服务端承载能力调整,建议先从几百开始测试,避免打崩服务端 MAX_CONCURRENT = 500 # 总请求量 TOTAL_REQUESTS = 1000000 # 信号量控制并发数 semaphore = asyncio.Semaphore(MAX_CONCURRENT) async def send_post(session): async with semaphore: try: async with session.post(URL, headers=HEADERS, json=BODY) as resp: if resp.status == 200: json_resp = await resp.json() return json_resp.get("data") else: # 记录错误请求 return f"error_status_{resp.status}" except Exception as e: # 异常捕获,避免单个请求失败导致整个程序崩溃 return f"request_fail_{str(e)}" async def main(): async with aiohttp.ClientSession() as session: tasks = [send_post(session) for _ in range(TOTAL_REQUESTS)] results = await asyncio.gather(*tasks) # 这里可以添加结果持久化逻辑,比如写入文件、数据库 print(f"完成请求数:{len(results)}") if __name__ == "__main__": asyncio.run(main())
注意事项
- 并发数不要盲目调大:过高的并发会耗尽本地网络、内存资源,也很容易触发服务端的限流、反爬规则,导致IP被封禁或者请求批量失败
- 建议添加失败重试逻辑:对于网络波动、服务端临时报错的请求,可以设置3次以内的重试机制,提升请求成功率
- 结果不要仅做打印输出:百万级请求的结果建议直接写入文件或者数据库,避免程序崩溃后数据全部丢失
- 如果你没有服务端的授权,批量发送大量请求可能属于违反服务使用条款的行为,必要请提前确认合规性
内容的提问来源于stack exchange,提问作者Adsce
相关产品推荐
相关产品推荐

