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

Python Requests.Session()访问同站唯一链接的性能疑问

关于requests.Session()在爬虫中的疑问解答

核心疑问解答

1. 使用Session访问唯一链接会不会拖慢脚本?

不会。Session的核心优势是复用TCP连接和保留Cookie,即使每个链接都是唯一的,只要属于同域名,Session会复用连接池中的空闲连接,避免每次requests.get()都重新建立TCP连接(省去三次握手的开销),理论上应该比单次请求更快。你觉得性能没提升甚至更差,大概率是其他因素导致的,而非Session本身。

2. Session是否为同站内所有链接保留Cookie和连接?

是的。

  • Cookie保留:Session会自动存储服务器返回的Cookie,后续所有同域名的请求都会自动携带这些Cookie,无需手动处理;
  • 连接复用:Session内部维护了一个连接池,针对同域名的请求,会复用已建立的TCP连接,减少重复建立连接的耗时。

3. 用Session访问新链接时会发生什么?会不会把链接加入列表?

当你调用session.get(link)时:

  1. Session会先检查连接池中是否有该域名的空闲TCP连接;
  2. 如果有空闲连接,直接复用它发起请求;如果没有,就新建一个连接并加入连接池;
  3. 它不会把具体的URL加入“待再次访问”的列表,连接池是按域名管理的,不是按单个URL。

所有链接唯一的情况下,不会拖慢GET请求,反而因为连接复用,比单次requests.get()更高效。

4. Session仅适用于重复访问同一URL的场景吗?

当然不是。只要是同域名下的多次请求(不管URL是否相同),Session都能发挥作用:比如你爬列表页后再爬详情页,都是同一个域名,用Session可以复用连接、自动携带Cookie,比每次用requests.get()更高效。


为什么你觉得性能没提升甚至更差?

可能的原因包括:

  • 你的脚本是同步串行执行的:即使复用了连接,25个请求还是要逐个等待完成,整体耗时的优化不明显;甚至Session内部的连接池维护有可忽略的微小开销,但绝不会显著拖慢;
  • 网站反爬机制:比如请求频率限制、UA检测等,导致请求耗时增加;
  • 网络波动或测试样本太少:偶然的网络延迟让你产生了“更慢”的错觉;
  • HTML解析耗时占比高:BeautifulSoup的解析时间掩盖了请求环节的优化效果。

效率优化建议

1. 改用异步请求(核心优化)

同步串行是效率低的主要原因,用aiohttp替代requests,并行发起请求,能大幅减少总耗时。示例:

import aiohttp
import asyncio
from bs4 import BeautifulSoup

async def fetch_detail(session, link):
    async with session.get(link) as response:
        html = await response.text()
        new_page = BeautifulSoup(html, 'lxml')
        # 处理数据逻辑

async def main():
    async with aiohttp.ClientSession() as session:
        # 先获取列表页链接
        list_response = await session.get("http://www.tunisie-annonce.com/AnnoncesImmobilier.asp")
        list_html = await list_response.text()
        # 解析得到links列表
        links = [...]
        # 并行处理所有详情页
        tasks = [fetch_detail(session, link) for link in links]
        await asyncio.gather(*tasks)

asyncio.run(main())

2. 优化Session的连接池配置

如果坚持用同步请求,可以调整连接池大小,让更多连接同时复用:

from requests import Session
from requests.adapters import HTTPAdapter

s = Session()
# 设置连接池大小,根据需求调整
adapter = HTTPAdapter(pool_connections=15, pool_maxsize=15)
s.mount('http://', adapter)

3. 模拟浏览器请求头

添加合理的User-Agent、Referer等请求头,避免被网站识别为爬虫:

s = Session()
s.headers.update({
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
})

4. 合理设置超时

避免请求长时间挂起,浪费时间:

html = session.get(link, timeout=10) # 设置10秒超时

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 23:53:23