简介
相关文章
你还可以在这篇文章中找到对使用Python获取网络资源有帮助的信息:
- 基础认证 带有Python示例的基础认证教程
urllib.request是一个用于获取URL(Uniform Resource Locators)的Python模块。它提供的接口(以urlopen函数的形式)非常简单。它可以用不同的协议去获取URL。同时它还提供了稍微复杂些的接口,让我们能在一些常见的场景下使用,如基础认证,Cookies,代理等等。这些接口是通过handler和opener对象来提供的。
urllib.request通过相关的网络协议(例如FTP,Http)支持多种“URL模式”下(以URL中的冒号之前的字符串识别,例如“ftp”是“ftp://python.org/”的 URL模式)的URL获取。本篇教程重点放在最常见的场景中,即Http。
urlopen在简单的场景中极易使用。然而当你在打开Http URL的时候遇到错误或是不正常的情况时,你将会需要一些超文本传输协议的知识。最全面且最权威的Http参考文是RFC 2616。但这不是一个通俗易懂的技术文档。本篇HOWTO意在讲述urllib的使用方法,辅以足够的Http细节去帮助你理解。本文并不是 urllib.request
文档的替代, 而是一个补充。
URL的获取
urllib.request最简单的用法如下:
1 2 3 |
import urllib.request response = urllib.request.urlopen('http://python.org/') html = response.read() |
如果你想通过URL获取一个资源并存储在某个临时的空间,你可以通过urlretrieve()
函数去实现:
1 2 3 |
import urllib.request local_filename, headers = urllib.request.urlretrieve('http://python.org/') html = open(local_filename) |
urllib的许多用法就是这么简单(注意,除了“http”,我们还以使用以“ftp”,“file”等开头的URL)。无论如何,本教程的目的在于讲解更复杂的案例,且重点放在Http的案例上。
Http基于请求和响应——客户端作出请求而服务器发送响应。urllib.request通过Request
对象映射了你正在做的Http请求。创建最简单的Request对象实例 ,你只需要指定目标URL。调用urlopen
并传入所创建的Request实例,将会返回该URL请求的response对象。该response对象类似于file,这意味着你可以在它上面调用.read()
:
1 2 3 4 5 |
import urllib.request req = urllib.request.Request('http://www.voidspace.org.uk') response = urllib.request.urlopen(req) the_page = response.read() |
应该注意到urllib.request使用了同样的Request的接口去处理所有的URL模式。比如,你可以像这样做一个FTP请求:
1 |
req = urllib.request.Request('ftp://example.com/') |
在Http的案例中,Request对象可以做两样额外的事情。首先,你可以传入要发给服务器的数据。其次,你可以传入额外的关于数据或关于该请求本身的信息(“元数据”)给服务器端——这些信息会作为Http的“headers”传输。接下来让我们依次来了解他们。
Data
有时你会想要向一个URL传输数据(通常这里的URL指的是一个CGI(Common Gateway Interface公共网关接口)脚本或是其他的网络应用)。在Http里,这常常是通过POST请求所完成的。这也是当你填好一个页面中的HTML表单并提交时,你的浏览器所做之事。但并不是所有的POST请求都是来自表单:你可以在你自己的网络应用里用POST请求去传送任意数据。通常在HTML表单中,数据需要以标准方式编码然后通过data
参数传给Request对象。一般会使用 urllib.parse
库来进行编码。
1 2 3 4 5 6 7 8 9 10 11 |
import urllib.parse import urllib.request url = 'http://www.someserver.com/cgi-bin/register.cgi' values = {'name' : 'Michael Foord', 'location' : 'Northampton', 'language' : 'Python' } data = urllib.parse.urlencode(values) data = data.encode('utf-8') # data should be bytes 数据应为字节码 req = urllib.request.Request(url, data) response = urllib.request.urlopen(req) the_page = response.read() |
注意,有时候我们也会需要到其他类型的编码(比如,通过HTML表单上传文件 —— 点击 HTML规范, 表单的提交 了解更多细节).
如果你不给data
参数传值,urllib将使用GET请求。GET请求和POST请求之间的一个不同点在于,POST请求通常有“副作用”:它们在某种意义上改变了系统的状态(例如给网站下一个订单,要求送100斤的猪肉罐头到你家门口)。虽然Http标准声称POST请求很有可能造成副作用,同时GET请求从不造成副作用,但是GET请求仍可能产生副作用,POST请求也不一定就会造成副作用。在Http GET请求里,数据也可以被编码进URL。
实现方法:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> import urllib.request >>> import urllib.parse >>> data = {} >>> dataayon-line crayon-striped-line" id="crayon-5812a8f800605382840354-4">>>> dataont-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;font-size: 24px;font-style: normal;font-weight: bold;line-height: 36px">简介
相关文章 你还可以在这篇文章中找到对使用Python获取网络资源有帮助的信息:
urllib.request是一个用于获取URL(Uniform Resource Locators)的Python模块。它提供的接口(以urlopen函数的形式)非常简单。它可以用不同的协议去获取URL。同时它还提供了稍微复杂些的接口,让我们能在一些常见的场景下使用,如基础认证,Cookies,代理等等。这些接口是通过handler和opener对象来提供的。 urllib.request通过相关的网络协议(例如FTP,Http)支持多种“URL模式”下(以URL中的冒号之前的字符串识别,例如“ftp”是“ftp://python.org/”的 URL模式)的URL获取。本篇教程重点放在最常见的场景中,即Http。 urlopen在简单的场景中极易使用。然而当你在打开Http URL的时候遇到错误或是不正常的情况时,你将会需要一些超文本传输协议的知识。最全面且最权威的Http参考文是RFC 2616。但这不是一个通俗易懂的技术文档。本篇HOWTO意在讲述urllib的使用方法,辅以足够的Http细节去帮助你理解。本文并不是 URL的获取urllib.request最简单的用法如下:
如果你想通过URL获取一个资源并存储在某个临时的空间,你可以通过
urllib的许多用法就是这么简单(注意,除了“http”,我们还以使用以“ftp”,“file”等开头的URL)。无论如何,本教程的目的在于讲解更复杂的案例,且重点放在Http的案例上。 Http基于请求和响应——客户端作出请求而服务器发送响应。urllib.request通过
应该注意到urllib.request使用了同样的Request的接口去处理所有的URL模式。比如,你可以像这样做一个FTP请求:
在Http的案例中,Request对象可以做两样额外的事情。首先,你可以传入要发给服务器的数据。其次,你可以传入额外的关于数据或关于该请求本身的信息(“元数据”)给服务器端——这些信息会作为Http的“headers”传输。接下来让我们依次来了解他们。 Data有时你会想要向一个URL传输数据(通常这里的URL指的是一个CGI(Common Gateway Interface公共网关接口)脚本或是其他的网络应用)。在Http里,这常常是通过POST请求所完成的。这也是当你填好一个页面中的HTML表单并提交时,你的浏览器所做之事。但并不是所有的POST请求都是来自表单:你可以在你自己的网络应用里用POST请求去传送任意数据。通常在HTML表单中,数据需要以标准方式编码然后通过
注意,有时候我们也会需要到其他类型的编码(比如,通过HTML表单上传文件 —— 点击 HTML规范, 表单的提交 了解更多细节). 如果你不给 实现方法:
|