Python的urlopen在慢网速下打开更快?

1 投票
2 回答
609 浏览
提问于 2025-04-30 17:52

我正在尝试制作一个程序,用来从网站读取网页。要读取的数据只有18KB。我的大学WiFi连接非常快(2 Mbps),并且有一个代理服务器在运行。

当我尝试运行以下代码:

import urllib
data=urllib.urlopen("http://www.google.com")

它大约需要8到10秒才能运行(同样的链接在浏览器中打开非常快)。

但是,当我在其他网速没有大学WiFi那么快的网络上运行相同的代码时,代码运行不到一秒。

我很困惑,为什么在WiFi上会这么慢。这是因为代理服务器的原因吗?如果真的是这样,那为什么在浏览器中打开同样的链接却花的时间更少呢?

提前谢谢你!

暂无标签

2 个回答

0

下载一个18kb的小文件并不能代表你网络的速度。因为文件小,我们主要关注的是延迟,也就是数据传输的反应时间。

当你运行 urllib.urlopen("http://www.google.com") 时,背后会发生很多事情。举几个例子:

  • 它会请求DNS,把 www.google.com 转换成IP地址。
  • 可能谷歌会把你重定向到HTTPS网站。
  • 在你和服务器之间的任何节点(比如代理服务器或网络质量管理)都可能影响请求的时间。

不过,如果你想解决你的网络问题,我建议你使用 traceroute(ICMP)和 traceproto 来查看你、谷歌以及两者之间每个节点的延迟。举个例子:

$ traceroute google.com
traceroute to google.com (173.194.40.135), 30 hops max, 60 byte packets
 1  par10s10-in-f7.1e100.net (173.194.40.135)  18.142 ms  18.116 ms  18.111 ms

但是在考虑网络通信时,你需要关注OSI模型中的所有元素,了解它们是如何相互作用的。OSI模型

0

A: 因为有缓存页面

作为一个常见的功能,网页浏览器和校园网络基础设施(作为一种减少传输延迟的政策)可以利用缓存页面的存储,这样就不需要等待从远程服务器获取页面描述时的延迟。

相比于从远程服务器重新加载整个页面,缓存页面可以瞬间加载。

关于删除缓存页面的评论:

虽然用户可以清除本地缓存,但这里讨论的是校园或互联网服务提供商(ISP)在基础设施层面进行的缓存,这样可以减少整个网络的流量,而这些是用户无法控制的。

在问题被修改后,包含了明确的URL目标:

在你测试的过程中,如果是针对 www.google.com 的 http 会话,你应该查看在这个指令“幕后”发生的前向交易。DNS解析(如果没有缓存)在浏览器和Python中所需的时间是一样的,重定向的握手、加密服务的导入、加密密钥的交换握手以及设置 httpS 会话所需的其他导入和处理都是接下来隐藏的步骤。Python作为一种通用语言解释器,需要即时导入和处理这些,而浏览器作为一种专业软件则已经准备好进行处理。如果使用性能分析工具(从处理的跟踪/时间)和/或网络嗅探器(从传输的跟踪/时间),你会看到更多细节。

撰写回答