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

Python 3.7(Anaconda/Spyder)中如何复用网络连接批量读取网页以提升数据抓取效率

解决requests循环请求慢的问题:复用网络连接

嘿,你猜的完全没错!每次调用requests.get()都会新建一个TCP连接,请求完就关闭,反复的握手/挥手操作就是拖慢速度的核心原因——和你之前VBA里反复打开关闭IE的情况一模一样。好在requests早就为我们准备了简单的解决方案——Session会话对象,它能帮你保持连接,复用同一个TCP连接发送多个请求,直接砍掉重复的连接开销。

怎么修改你的代码?

改动非常小,只需要把创建Session的步骤放在循环外面,然后用Session对象来发送请求就行:

# Libraries
import requests
import pandas as pd
import lxml.html as LH

# 创建Session对象,这一步一定要放在循环外面!
session = requests.Session()

# Get link for part results from hyperlink list
for link in hyperlink_list:
    # Add part number to database link
    process_url = database_link + link
    # 用session.get()替代原来的requests.get()
    html = session.get(process_url).content
    # Read data to dataframe
    df_list = pd.read_html(html)

# 循环结束后可以显式关闭会话(可选,Python会自动回收资源,但显式关闭更规范)
session.close()

为什么这能提速?

Session对象内部会维护一个连接池:第一次请求建立连接后,这个连接不会立即关闭,而是被存进连接池里。后续的请求会直接复用这个已经建立好的连接,省去了TCP三次握手、SSL握手这些耗时的步骤——这和你把IE保持打开状态的思路完全一致,效率提升会非常明显,应该能让你的耗时降到和VBA差不多的水平。

额外的小优化(可选)

如果你想进一步压榨性能,还可以试试这些:

  • 设置合理的超时时间:比如session.get(process_url, timeout=5),避免某个请求卡住拖慢整体速度
  • 开启HTTP/2支持:如果目标服务器支持HTTP/2,可以安装requests[http2],然后给Session配置对应的适配器,能进一步提升多路复用的效率(不过对于你的场景,Session本身已经足够解决核心问题了)
  • 异步请求(进阶):如果零件号数量特别多,可以试试异步请求库(比如aiohttp),但这个需要你对异步编程有一点基础,经验有限的话先把Session用起来就足够啦

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 07:22:37