300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python爬虫:urllib3与urllib到底有何区别?内行人告诉你答案

Python爬虫:urllib3与urllib到底有何区别?内行人告诉你答案

时间:2020-07-28 17:29:44

相关推荐

Python爬虫:urllib3与urllib到底有何区别?内行人告诉你答案

目录

网络库urllib3网络请求GET请求POST请求HTTP响应头上传文件超时处理

网络库urllib3

urllib3是比urllib库更强大的存在,目前已经有许多的原生系统已经开始使用urllib3。

urllib3具有如下优点:

支持HTTP和SOCKS代理支持压缩编码100%测试覆盖率具有链接池线程安全客户端SLL/TLS验证协助处理重复请求和HTTP重定位使用multipart编码上传文件

因为urllib3并不是Python的标准库,所以我们使用之前,需要进行下载安装,具体命令如下所示:

pip install urllib3#或conda install urllib3

下面,我们来讲解urllib3库的使用方式。

网络请求

GET请求

首先,在我们使用urllib3库进行网络请求时,需创建PoolManager类的实例,该类用于管理线程池。

下面,我们来通过urllib访问百度,并返回查询的结果,示例如下:

import urllib3http = urllib3.PoolManager()url = '/s'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}response = http.request('GET', url, fields={'wd': '机器学习'}, headers=headers)result = response.data.decode('UTF-8')print(result)

运行之后,效果如下:

这里,我们通过fields参数指定GET的请求字段。不过,这里先一步讲解了请求头,其实是百度有安全机制,读者可以去掉headers参数试试。会返回百度的安全验证页面。

POST请求

如果需要向服务器提交表单或者比较复杂的数据,就需要使用到POST请求。POST请求比较简单,仅仅只是将请求的第一个参数改为“POST”即可。

示例如下:

import urllib3http = urllib3.PoolManager()url = '/post'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}response = http.request('POST', url, fields={'username': 'name', 'age': '123456'}, headers=headers)result = response.data.decode('UTF-8')print(result)

运行之后,返回如下数据:

HTTP响应头

使用urllib3库进行网络访问时,其返回的HTTPResponse。默认有一些携带的参数,其中就包括info方法。它能返回响应头数据,示例如下:

import urllib3http = urllib3.PoolManager()url = '/s'headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}response = http.request('POST', url, fields={'wd': '机器学习'}, headers=headers)for key in response.info().keys():print('key:',response.info()[key])

运行之后,返回的响应数据如下:

上传文件

首先,我们需要简单的实现一个文件上传的服务器代码,这里我们使用Flask搭建一个简单的服务器Python程序,代码如下:

import flaskimport osUPLOAD_FILE = 'uploads'app = flask.Flask(__name__)@app.route('/', methods=['POST'])def upload_file():file = flask.request.files['file']if file:file.save(os.path.join(UPLOAD_FILE, os.path.basename(file.filename)))return '文件上传成功'else:return '文件上传失败'if __name__ == '__main__':app.run()

运行之后,它会一直等待客户端上传文件。

这个时候,我们再来实现urllib3是如何上传文件的,示例如下:

import urllib3http = urllib3.PoolManager()with open('1.jpg', 'rb') as f:fileData = f.read()url = 'http://127.0.0.1:5000'response = http.request('POST', url, fields={'file': ('1.jpg', fileData, 'image/jpeg')})print(response.data.decode('UTF-8'))

默认flask搭建的服务器,其接口为5000,也就是通过127.0.0.1:5000进行访问。运行之后,就会在uploads文件夹下创建一个1.jpg的图片。

同时,控制台会输出文件上传成功,而服务器会返回状态码200。

这里,上传文件就1一个键值对,其中file代表服务器上传文件的字段。值的元组里,fileData为文件的二进制形式,'image/jpeg’代表上传文件的格式(可以省略)。

超时处理

urllib3库其HTTP的底层都是基于Socket实现的,而Socket超时又分为连接超时与读超时。

其中,连接超时表示在连接的过程中,由于服务器的问题或域名弄错了,而导致的无法连接的情况抛出的异常。

读超时表示从服务器读取数据时由于服务器的问题,导致长时间无法正常读取数据而导致的异常。

通常,我们超时的设置有2种,一种是通过http.request(timeout)进行设置,一种是通过PoolManager()连接池进行设置。示例如下:

from urllib3 import *http = PoolManager(timeout=Timeout(connect=2.0, read=2.0))with open('1.jpg', 'rb') as f:fileData = f.read()url = 'http://127.0.0.1:5000'try:response = http.request('POST', url, timeout=Timeout(connect=2.0, read=4.0))print(response.data.decode('UTF-8'))except Exception as e:print(e)

需要注意的是,通过连接池PoolManager进行设置的超时,是全局超时时间,哪怕你后边的请求不设置,也是默认使用的这个超时。如果同时设置了request的超时,那么以request为准。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。