下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922
论坛 >编程语言 >如何使用 urllib 包获取网络资源(1)

如何使用 urllib 包获取网络资源(1)

希尔瓦娜斯发布于 2018-02-26 09:14查看:824回复:1

简介

相关文章

你还可以在这篇文章中找到对使用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最简单的用法如下:

image.png

如果你想通过URL获取一个资源并存储在某个临时的空间,你可以通过urlretrieve() 函数去实现:

image.png


urllib的许多用法就是这么简单(注意,除了“http”,我们还以使用以“ftp”,“file”等开头的URL)。无论如何,本教程的目的在于讲解更复杂的案例,且重点放在Http的案例上。

Http基于请求和响应——客户端作出请求而服务器发送响应。urllib.request通过Request对象映射了你正在做的Http请求。创建最简单的Request对象实例 ,你只需要指定目标URL。调用urlopen并传入所创建的Request实例,将会返回该URL请求的response对象。该response对象类似于file,这意味着你可以在它上面调用.read()

image.png


应该注意到urllib.request使用了同样的Request的接口去处理所有的URL模式。比如,你可以像这样做一个FTP请求:

image.png


在Http的案例中,Request对象可以做两样额外的事情。首先,你可以传入要发给服务器的数据。其次,你可以传入额外的关于数据或关于该请求本身的信息(“元数据”)给服务器端——这些信息会作为Http的“headers”传输。接下来让我们依次来了解他们。

Data

有时你会想要向一个URL传输数据(通常这里的URL指的是一个CGI(Common Gateway Interface公共网关接口)脚本或是其他的网络应用)。在Http里,这常常是通过POST请求所完成的。这也是当你填好一个页面中的HTML表单并提交时,你的浏览器所做之事。但并不是所有的POST请求都是来自表单:你可以在你自己的网络应用里用POST请求去传送任意数据。通常在HTML表单中,数据需要以标准方式编码然后通过data参数传给Request对象。一般会使用 urllib.parse 库来进行编码。

image.png


注意,有时候我们也会需要到其他类型的编码(比如,通过HTML表单上传文件 —— 点击 HTML规范, 表单的提交 了解更多细节).

如果你不给data参数传值,urllib将使用GET请求。GET请求和POST请求之间的一个不同点在于,POST请求通常有“副作用”:它们在某种意义上改变了系统的状态(例如给网站下一个订单,要求送100斤的猪肉罐头到你家门口)。虽然Http标准声称POST请求很有可能造成副作用,同时GET请求从不造成副作用,但是GET请求仍可能产生副作用,POST请求也不一定就会造成副作用。在Http GET请求里,数据也可以被编码进URL。

实现方法:

image.png


注意:完整的URL是在原URL后面加上 ?以及编码的结果而生成的。

Headers

我们下面将会讨论一个具体的Http header, 向大家展示怎么向你的Http请求添加header。

一些网站 [1] 不喜欢被程序访问,也不喜欢匹配多种浏览器 [2]。默认情况下,urllib将自己设定为Python-urllib/x.y (这里 x 和 y 分别是Python的主要和次要版本号, 如Python-urllib/2.5), 这会把网站搞糊涂,或者干脆就不能正常运行。 浏览器通过 User-Agent header [3]来定位自己。创建一个Request 对象时你可以传入一个header的dictionary。 下面的例子创建的请求跟之前的一样,唯一不同的地方是该请求将自己标为IE浏览器的某个版本 [4]。

image.png

响应也有两个有用的方法。在我们待会了解出现了问题时的情形后,可以看这一节info and geturl 去学习这两个方法。

处理异常

urlopen 会在它无法处理一个响应时抛出 URLError (Python的API也常常这样抛出内建的异常,如 ValueErrorTypeError等等)。 HttpError 是URLError的子类,在Http URL的一些情况中会被抛出。 这些异常类来自urllib.error 模块。

e.g. 通常URL错误的产生原因是没有网络连接(即没有到达指定服务器的路由),或是指定的服务器不存在。这时,被抛出的异常将会有“reason”属性。该属性是一个包含错误码及错误文本的元组(tuple)。如:

image.png

Http错误

每个来自服务器的Http响应都有一个数字的“状态码”。状态码有时会表示服务器无法实现请求。默认的handler将会帮你处理这样的一些响应(例如,如果响应是一个要求客户端从另外的URL获取文档,即“重定向(redirection)”,urllib会帮你处理它)。而无法被处理的响应,HttpError将会被urlopen抛出。常见的错误包括“404”(page not found无法找到页面), “403”(request forbidden请求被禁止), 和“401” (authentication required需要验证)。

欲了解Http错误码,请阅读RFC2616的第十节。

被抛出的HttpError实例会有一个整数的“code”属性,对应服务器发送的错误。

Error Codes

由于默认的handler会处理重定向(300范围内的代码),并且100-299范围的代码表示成功,所以你一般只会看到400-599范围内的错误码。 http.server.BaseHttpRequestHandler.responses是一个很有用的响应代码字典,它包含了RFC2616里所用到的全部响应码。下面是该字典的重现:

image.png

image.png

image.png

当一个错误被服务器响应抛出时,返回一个Http 错误码一个错误页面。你可以使用HttpError实例作为一个返回页面中的响应。这意味着同code属性,它还有read, geturl, 和info方法,如urllib.response模块返回的一样:

image.png


更多套餐


2018软考网络工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-1.html

2018软考网络规划设计师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-11.html

2018软考信息安全工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-41.html

2018软考系统集成项目管理工程师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-76.html

2018软考信息安全工程师学习套餐(最新、最全)

http://www.kokojia.com/package-40.html

2018软考软件设计师顺利通关套餐(最新、最全)

http://www.kokojia.com/package-91.html



2017年Python从入门到企业实战

http://www.kokojia.com/package-59.html

java软件工程师(零基础自学全套课程)主讲人:任亮

http://www.kokojia.com/package-39.html

Linux运维全套视频火爆来袭

http://www.kokojia.com/package-27.html

Oracle数据库内功修炼实战视频教程

http://www.kokojia.com/package-47.html

Oracle OCP认证课程全套视频

http://www.kokojia.com/package-33.html

大数据从入门到精通(徐培成亲授)视频教程,赠Python课程套餐

http://www.kokojia.com/package-64.html

Python数据分析与机器学习实战系列课程

http://www.kokojia.com/package-66.html


收藏(0)0
查看评分情况

全部评分

此主贴暂时没有点赞评分

总计:0

回复分享
希尔瓦娜斯  于   2018-02-26 09:21 重新编辑过

版主推荐

    共有1条评论

    • IT宅男
    • mr jack
    • Mr ken
    • Mright
    • cappuccino
    • YUI
    • 课课家运营团队
    • 课课家技术团队1
    • 酸酸~甜甜
    • 选择版块:

    • 标题:

    • 内容

    • 验证码:

    • 标题:

    • 内容

    • 选择版块:

    移动帖子x

    移动到: