urllib是Python3内置的HTTP请求库,不需要单独安装。官方文档链接如下:https://docs.python.org/3/library/urllib.html从官方文档可以看出urllib包含4个模块,如图1所示。图1urllib官方文档directory这四个模块的功能描述如下:request:最基本的HTTP请求模块,可以用来发送HTTP请求和接收服务器的响应数据。这个过程就像是在浏览器地址栏输入网址,然后按下回车键。error:异常处理模块,如果有请求错误,我们可以捕获这些异常,然后根据实际情况,要么重试,要么直接忽略,要么进行其他操作。parse:工具模块,提供了很多处理url的api,如拆分、解析、合并等无法抓取网站。本文主要介绍如何通过urllib发送HTTPGET请求和HTTPPOST请求,并获取相应的数据。1、使用urlopen函数发送HTTPGET请求urllib最基本的功能之一就是向服务器发送HTTP请求,然后接收服务器返回的响应数据。此功能只能通过urlopen函数来完成。例如下面的代码向百度发送一个HTTPGET请求,然后输出服务器的响应结果。importurllib.requestresponse=urllib.request.urlopen('https://baidu.com')#将服务器的响应数据解码为utf-8print(response.read().decode('utf-8'))run结果如图2所示。图2百度首页HTML代码我们可以看到使用urllib与服务器交互是非常容易的。除了import语句,只有2行业务相关的代码,就完成了与服务端交互的整个过程。其实这个过程已经完成了爬虫的第一步,就是从服务器获取HTML代码,然后利用各种分析库对HTML代码进行分析,提取出我们感兴趣的URL、文本、图片等在。其实urlopen函数返回的是一个对象,read就是这个对象的一个??方法。我们可以使用type方法来输出这个对象的类型。当我们知道了对象的类型,我们就可以很容易的知道这个对象中有哪些API,然后去调用它们。importurllib.requestresponse=urllib.request.urlopen('https://baidu.com')print(type(response))这段代码会输出如下结果:现在我们明白了,urlopen函数返回一个HTTPResponse类型的对象,主要包括read、getheader、getheaders等方法,以及msg、version、status、debuglevel、closed等属性。下面以一个实际案例来演示HTTPResponse对象中主要方法和属性的使用。importurllib.request#向京东商城发送HTTPGET请求,urlopen函数可以使用http或者httpsresponse=urllib.request.urlopen('https://www.jd.com')#输出返回值的数据类型urlopenfunctionprint('responsetype:',type(response))#输出响应状态码、响应消息和HTTP版本print('status:',response.status,'msg:',response.msg,'version:',response.version)#输出所有响应头信息print('headers:',response.getheaders())#输出名为Content-Type的响应头信息print('headers.Content-Type',response.getheader('Content-Type'))#输出京东商城首页的所有HTML代码(utf-8解码后)print(response.read().decode('utf-8'))运行结果如图3.图3HTTPResponse对象的API演示2.使用urlopen函数发送HTTPPOST请求。默认情况下,urlopen函数发送HTTPGET请求。如果要发送HTTPPOST请求,则需要使用data命名参数。该参数为bytes类型,需要使用bytes类将字符串形式的数据转换为bytes类型。以下示例向http://httpbin.org/post发送HTTPPOST请求并输出返回结果。importurllib.request#将表单数据转换为bytes类型,编码为u??tf-8data=bytes(urllib.parse.urlencode({'name':'Bill','age':30}),encoding='utf-8')#提交HTTPPOST请求response=urllib.request.urlopen('http://httpbin.org/post',data=data)#输出响应数据print(response.read().decode('utf-8'))这段代码一开始提供了一个字典形式的表单数据,然后使用urlencode方法将字典类型的形式转换成字符串形式的形式,再将字符串形式的形式按照utf-8编码转换成bytes类型,这就是要传递给urlopen函数的数据命名参数的值。需要注意的是,一旦指定了data命名参数,urlopen函数就会向服务器提交一个HTTPPOST请求。无需明确指定要提交POST请求。.本例将HTTPPOST请求提交到http://httpbin.org/post,这是一个用于测试HTTPPOST请求的URL。如果请求成功,服务器会将HTTPPOST请求信息原封不动地返回给客户端。运行结果如图4所示。图4HTTPPOST请求信息本文转载自微信公众号“极客本源”,可通过以下二维码关注。转载本文请联系极客本源公众号。