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

