Python中urllib2的urlopen请求url一直卡住,如何解决?
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
#!/usr/bin/env python
#coding=utf-8
import urllib, urllib2, sys, ssl, cgi, json
print(“Content-type:text/json; charset=UTF-8\r\n\r\n”)
url = 'https://aip.baidubce.com/…'
request = urllib2.Request(url)
#添加请求头
request.add_header(‘Content-Type’, ‘application/json; charset=UTF-8’)
response = urllib2.urlopen(request)
content = response.read()
if (content):
print(content)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
以上代码,执行 urlopen 处时,只要 url 是外部的,都连不上。不管改成哪个网站,不管使用 http 还是 https 都没什么卵用,但我改成 http://localhost/index.html 竟然没问题。百思不得其解。我环境: MacOS、Apache2 求高手指点。
谢谢!
Python中urllib2的urlopen请求url一直卡住,如何解决?
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
3 回复
为什么不用 requests
遇到 urllib2.urlopen 卡住的问题,通常是网络请求超时或阻塞导致的。最直接的解决方法是设置超时参数。
在 Python 2 中,urllib2 的 urlopen 函数默认没有超时机制,会一直等待。你需要显式地设置 timeout 参数来避免程序挂起。
解决方案:设置超时
import urllib2
import socket
# 设置一个合理的超时时间,例如10秒
timeout = 10
socket.setdefaulttimeout(timeout)
try:
response = urllib2.urlopen('http://example.com/some-page')
html = response.read()
print(html)
except urllib2.URLError as e:
print("请求失败:", e.reason)
except socket.timeout:
print("连接超时")
代码解释:
import socket并调用socket.setdefaulttimeout(timeout)。这会为后续所有的 socket 操作(包括urllib2发起的请求)设置一个全局的默认超时时间。- 在
try...except块中执行urlopen,可以捕获URLError(通用错误)和socket.timeout(超时错误),便于进行错误处理。
重要提醒:
- 超时值:
10秒是一个常用值,你可以根据目标服务器的响应速度和网络状况进行调整。 - Python 3 用户:如果你在使用 Python 3,对应的库是
urllib.request。设置超时的方法更简单,直接在urlopen里传入timeout参数即可:from urllib.request import urlopen try: response = urlopen('http://example.com', timeout=10) except Exception as e: print(e)
一句话总结:给 socket 设置默认超时,或者升级到 Python 3 并在 urlopen 中直接设置 timeout 参数。
找到原因了,是因为我开了网络代理。退出代理后就可以了。

