Python urllib urlopen() 详解:URL协议、代理设置与数据传递
本文详细解析Python标准库urllib中urlopen()方法的使用。涵盖URL协议规范(http/ftp/file)、代理服务器配置技巧,以及通过data参数传递字典数据的方法。结合源码分析,说明Python 2.3后支持的代理功能及文件对象行为,帮助开发者掌握基础网络抓取与高级请求配置。
Python urllib urlopen() 对象方法详解与代理配置补充
urllib 是 Python 内置的网页抓取接口,其核心方法是 urlopen(),该函数基于 Python 原生的 open() 方法实现。以下为主要功能说明:
urllib.urlopen('网址')
传入 urlopen() 的参数需严格遵循网络协议规范,例如 http 或 ftp。因此,URL 字符串必须以协议头开头,如 http://,示例如下:urllib.urlopen('http://www.baidu.com')。
若访问本地文件,需使用 file 关键字,例如:urllib.urlopen('file:nowamagic.py')。此处 nowamagic.py 指的是当前 classpath 指定的内容。若对路径查找有疑问,通常是因为对 Python 的 classpath 搜索顺序不熟悉。也可直接指定绝对路径,如:urllib.urlopen('file:F:\pythontest\nowamagic.py')。
同样支持打开 FTP 文件,语法格式为:urllib.urlopen(url='ftp://用户名:密码@ftp地址/')。
示例程序如下:
import urllib
f = urllib.urlopen('file:F:\pythontest\nowamagic.py')
a = f.read()
print a
若传入参数正确且网站可正常访问(无代理、封禁等特殊情况),urlopen() 将返回一个类似文件对象的对象,即上述代码中的 f。可通过 dir(f) 查看该对象支持的操作方法:
['__doc__', '__init__', '__iter__', '__module__', '__repr__', 'close', 'fileno', 'fp', 'geturl', 'headers', 'info', 'next', 'read', 'readline', 'readlines', 'url']
调用 read() 方法可读取全部内容。由于 f 对象遵循先进先出(FIFO)机制,一旦执行 f.read(),后续再次调用 read() 将无法获取数据。因此,若需对数据进行后续处理,应将其存储至其他对象,如示例中的 a。此外,info() 和 geturl() 方法也是基于 f 这个文档对象实现的,因此使用
>>>f.geturl() 'F://pythontest//nowamagic.py'
接下来介绍 urllib 的代理设置:
import urllib
proxies = {'http':'http://***.***.***.***:1984'}
filehandle = urllib.urlopen('http://www.需要代理才能访问的网站.com/',proxies = proxies)
a = filehandle.read()
print a
上述配置实现了通过代理访问网站并获取内容的基本功能。但若目标网站需要登录或 Cookie 支持,该如何处理?
查看 urllib 的源码:
def urlopen(url, data=None, proxies=None):
"""urlopen(url [, data]) -> open file-like object"""
global _urlopener
if proxies is not None:
opener = FancyURLopener(proxies=proxies)
elif not _urlopener:
opener = FancyURLopener()
_urlopener = opener
else:
opener = _urlopener
if data is None:
return opener.open(url)
else:
return opener.open(url, data)
从 urlopen 的源码可以看出,该方法还接受一个 data 参数。data 应为字典类型,因为浏览器向服务器发送数据时,通常也是以字典形式提交。
另外需注意,代理支持功能是在 Python 2.3 版本之后加入的。
感谢阅读,希望本文能对大家有所帮助,谢谢各位对本站的支持!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













