Javatpoint标志
Javatpoint标志

Python的urllib库| Python的urllib。HTTP请求的请求

在本教程中,我们将学习Pythonurllib.request并对示例URL发出GET请求。我们还将为一些JSON数据向样例REST API发出GET请求。我们还将学习使用urllib的POST请求。请求图书馆。在使用Python代码打开URL时,urllib库起着至关重要的作用。除了打开url之外,这个库还有许多特性。稍后我们将探讨它的重要特性。让我们简要介绍一下urllib库。

Python urllib模块

Python urllib模块允许我们通过Python代码访问网站。urllib的这种功能提供了运行GET、POST和PUT方法以及在Python代码中模拟JSON数据的灵活性。我们可以下载数据,访问网站,解析数据,并使用urllib库修改头文件。urllib有两个版本——urllib2和urllib3。在Python 2中使用urllib2,在Python 3中使用urllib 3。urllib3具有一些高级特性。

很少有网站不允许程序入侵他们的网站数据,并把负载放在他们的服务器上。当他们发现这样的程序时,他们有时可能会选择阻止该程序或提供普通用户可能使用的不同数据。但是,我们可以用简单的代码克服这种情况。我们只需要修改用户代理,它包含在我们发送的请求头中。

对于那些不知道的人,报头是与服务器共享的数据位,以便服务器可以了解我们。这是Python版本通知网站我们正在尝试使用urllib和Python版本访问网站的地方。

urllib模块由几个处理url的模块组成。它们如下所示

  • 的urllib.requestfor opening and reading.
  • 的urllib.parsefor parsing URLs
  • urllib。异常引发的错误
  • urllib。用于解析robot.txt文件的Robotparser

大多数情况下,如果urllib包不在您的环境中,则会随Python安装一起提供。我们可以使用下面的命令下载它。

它将在您的环境中安装urllib。

HTTP消息基础

来理解url。请求in a better way, we need to know about the HTTP message. An HTTP message can be known as text, transmitted as a stream of bytes that follow the guideline specified by RFC 7230. A decoded HTTP message can be simple as below.

GET请求使用HTTP/1.1协议在根目录(/)指定。HTTP方法有两个主要部分——元数据和主体。上面的消息有所有的元数据,但没有。响应也包括两部分-

正如我们所看到的,响应以状态码200 OK开始。它是响应的元数据。我们已经展示了标准的HTTP消息,但是有些消息可能会违反这些规则或遵循旧的规范。我们可能会得到许多键值对数据,例如表示所有响应头。

的urllib.request

让我们来理解下面的urllib.request.OpenURL()方法示例。我们需要导入urllib3模块,并将URL的开头赋值给一个变量,在这个变量中,我们可以使用read ()命令读取数据。

当我们使用urllib.request.urlopen()请求时,它返回HTTPResponse对象。我们可以使用dir()函数打印HTTPResponse对象,以查看不同的方法和属性。

的例子,

输出:

(‘__abstractmethods__’,‘__class__进行’,‘__del__’,‘__delattr__’,‘__dict__’,‘__dir__’,‘__doc__’,‘__enter__’,‘__eq__’,‘__exit__’,‘__format__’,‘__ge__’,‘__getattribute__’,‘__gt__’,‘__hash__’,‘__init__’,‘__init_subclass__’,‘__iter__’,‘__le__’,‘__lt__’,‘__module__’,‘__ne__’,‘__new__’,‘__next__’,‘__reduce__’,‘__reduce_ex__’,‘__repr__’,‘__setattr__’,‘__sizeof__’,‘__str__’,‘__subclasshook__’,‘_abc_impl’,‘_checkClosed’,‘_checkReadable’,‘_checkSeekable’,‘_checkWritable’,'_check_close', '_close_conn', '_get_chunk_left', '_method', '_peek_chunked', '_read_and_discard_trailer', '_read_next_chunk_size', '_read_status', '_readall_chunked', '_readinto ', '_safe_read', '_safe_readinto', 'begin', 'chunk_left', 'chunked', 'close', 'closed', 'code', 'debuglevel', 'detach', 'fileno', 'flush', 'fp', 'getcode', ' getheheader ', 'isatty', 'isclosed', 'length', 'msg', 'peek', 'read', 'read1', 'readable','readinto', 'readinto1', 'readline', 'readlines', 'reason', 'seek', 'seekable', 'status', 'tell', 'truncate', 'url', 'version', 'will_close', 'writable', 'write', 'writelines']

的例子,

输出:

b < !doctype html>Google
(函数(){window.google ={祺:\“lj1QYuXdLNOU-AaAz5XIDg \”,kEXPI: \ ' 0, 1302536, 56873, 1710, 4348, 207, 4804, 2316, 383246,, 1354, 4013, 1238, 1122515, 1197791, 610, 380090, 16114, 19398, 9286, 17572, 4859, 1361, 9290, 3027, 17582, 4020, 978, 13228, 3847, 4192, 6430, 22112, 629, 5081, 1593, 1279, 2742, 149, 1103, 841, 6296, 3514, 606, 2023, 1777, 520, 14670, 3227, 2845, 7, 17450, 16320, 1851, 2614, 13142, 3346230, 1014, 5444, 149, 11325, 2650,, 1528, 2304, 6463, 576, 22023, 3050, 2658, 7357, 30岁,13628,13795,7428,5800,2557,4094, 4052, 3541, 16807, 22235, 2, 3110, 2, 14022, 1931, 784255, 4550, 743, 5853, 10463, 1160, 4192, 1487, 1020, 2381, 2718, 18233年,28岁的2,2,5,7754,4567,6259,3008,3712,2775,13920,830422,5835,11862,3105,1539,2794,8日,4669年,1413年,1394年,445年,2、2、1,6395,4561,10491,2378,701252,1407,10日,1,8591,113,5011,5,1453,637162,2460,2430586969593,5214,2215,2343,1866,1563,4987,791,6071,2,1,5829,227161983,3110,773,1217,2780,933504,1259,957749,6601,23日,31748100,1392,2738,92,2552,106197163,1315,1133,316364810,3333233,1586,229, 81967, 2440357298258, 1863, 400, 1698, 417, 4881219, 20396, 2397481, 75, 5444944, 1269, 5994875, 651, 2801216, 882444, 3, 1877, 1, 2562年,1748141795563年,1,1,1,2,4265年1331,4142年,2609年,155年,17日,13日,72139年,4,2,20日,2169年,13日,19日,46岁,5,39岁,96548年,29岁的2,2,1、2、1、2、2、7、4、1、2、2、2、2、2、1,2353513186年1158年,3、2、2、2、2、2、4、2、3,3269,1601,141,1002,98214133,10日,9日,9日,2,,3,1,11日,6239

的源代码www.google.com;我们可以使用正则表达式来清理结果。网页是使用HTML、CSS和JavaScript制作的,但我们的程序通常只提取文本。因此正则表达式变得有用;我们将在下一节中使用它。

数据传输有两种方法——GET和POST。GET方法用于获取数据,POST方法用于通过服务器发送数据,就像我们发布一些数据并基于该发布获得请求一样。我们还使用GET和POST从/到URL发出请求。

现在让我们看看urllib.parse的用法。

的urllib.parse

的urllib.parsehelps to define the function to manipulate URLs and their components parts to create or destroy them. There is a way to hard code the value and pass it to the URL, but we can use the urllib to do it. Let's understand the following example.

的例子,

在上面的代码中,我们定义了与POST方法一起使用的值,以便与URL一起发送。为此,首先我们需要对所有值进行编码。我们编码为utf-8字节。我们编码了字典请求。然后,我们使用带有请求的URL打开URL。最后,我们使用read()读取响应。

的例子,

输出:

urllib.error.HTTPError: HTTP错误405:方法不允许

当我们运行上面的代码时,Google将返回405,方法不允许。Google不允许使用Python脚本发送请求。我们可以使用另一个带有搜索栏的网站使用Python发送请求。

有时网站不喜欢被垃圾邮件发送者或机器人访问,或者他们可能会区别对待他们。过去,大多数网站都屏蔽了该程序。维基百科曾经直接屏蔽程序,但现在他们提供像谷歌一样的页面。

每次请求URL时,我们都会发送一个标题,这是关于我们的基本信息。头中有一个用户代理值,用于定义访问网站服务器的浏览器。这就是谷歌分析决定我们使用哪种浏览器的方法。

默认情况下,如果我们使用Python 3.4版本,则使用urllib 3.4的用户代理。要么是网站不知道;否则,他们将完全封锁它。

的例子,

我们已经修改了头文件并运行相同的东西。我们提出请求,我们的回应确实不同。

常见的urllib。请求Troubles

程序在运行urllib时可能抛出错误。请求程序。在本节中,我们将处理入门时最常见的几个错误。

在了解具体的错误之前,我们将学习如何实现错误处理。

实现错误处理

Web开发受到错误的困扰,并且需要花费大量时间来解决。我们将定义在使用urllib.request时如何处理HTTP、URL和超时错误。

HTTP状态码与状态行中的每个响应一起附加。如果我们可以在响应中读取状态码,则请求到达了它的目标。响应中使用了预定义的状态码。例如- 200和201表示成功的请求。如果请求代码是404和405,则表示有问题。

也可能是连接错误,或者提供的URL不正确。在本例中,是urllib。请求will raise an error.

最后,服务器需要花费大量时间来响应。可能是网络连接缓慢,服务器宕机,或者服务器被编程为忽略特定请求。方法传递一个timeout参数来克服这个问题urlopen ()函数来引发TimeoutError过了一段时间。我们需要首先使用try....捕获它们期望条款能解决这些问题。

的例子,

request_func ()函数接受一个字符串作为参数,它将尝试从URL中获取请求urllib.request.如果URL不正确,它将捕获URLError。它也捕捉到了HTTPError的抛出错误的对象。如果没有错误,它将打印状态并返回主体和响应。

如我们所见,我们称之为urlopen ()带有timeout参数的函数,它将导致aTimeoutError在指定的秒数之后触发。程序将等待10秒,这是等待响应的一个很好的时间。

处理403错误

403状态表示服务器理解请求,但不会执行请求。这是我们使用网页抓取时常见的错误。方法可以解决此错误用户代理头。两个主要相关的4xx代码有时会混淆。

  • 401年未经授权
  • 403年被禁止的

401错误-如果用户没有标识或未登录,并且必须执行某些操作才能获得访问权限,例如登录注册,则由服务器返回。

403错误-如果用户已被识别,但没有访问资源的权限,则由服务器返回。

幸运的是,我们可以通过修改web上的user - agent字符串(包括用户代理数据库)来处理这样的错误。

请求包生态系统

本节将阐明Python中围绕HTTP请求的包生态系统。有多个软件包没有明确的标准。我们必须熟悉满足我们需求的正确包装。

什么是urllib2和urllib3?

urllib库被分成几个部分。如果我们回顾一下Python 1.2的早期版本,当最初的urllib被引入时,大约在1.6版本,添加了一个改进的urllib2。但是当引入Python 3时,原始的urllib已被弃用,并且urllib2删除了2,采用了原始的urllib名称。

urllib3是在urllib2还存在时开发的第三方库。它是一个独立维护的图书馆。

什么时候应该使用请求而不是urllib.requests

知道何时使用request或urllib是很重要的。请求图书馆。的urllib.requestis meant to be a low-level library that reveals many details about the working of HTTP requests.

请求当用户与许多不同的REST api交互时,强烈建议使用该库。请求库的官方文档声称它是“为人类构建的”,并且已经成功地围绕HTTP创建了一个直观、安全和直接的API。请求库允许我们轻松地完成复杂的任务,特别是当涉及到字符编码时。使用urllib库时,我们必须注意编码,并采取措施确保无错误体验。

如果您更专注于学习更标准的Python以及如何处理HTTP请求,可以使用urllib。请求是最好的开始方式。您甚至可以更进一步,使用非常低级的http模块。

结论

我们已经详细讨论了urllib库,并学习了如何使用Python脚本发出请求。我们可以在项目中使用这个内置模块,使它们在更长时间内不依赖。本教程探讨了urllib库及其低层模块,如urllib。请求并解释了如何处理常见错误以及如何解决这些错误。


下一个话题 Python中的Fiona模块





Youtube 视频加入我们的Youtube频道:现在加入

反馈


帮助别人,请分享

脸谱网 推特 pinterest

学习最新教程


准备


热门的技术


b .技术/马华






Baidu
map