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 中,urllib2urlopen 函数默认没有超时机制,会一直等待。你需要显式地设置 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("连接超时")

代码解释:

  1. import socket 并调用 socket.setdefaulttimeout(timeout)。这会为后续所有的 socket 操作(包括 urllib2 发起的请求)设置一个全局的默认超时时间。
  2. 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 参数。

找到原因了,是因为我开了网络代理。退出代理后就可以了。

回到顶部