我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Python中urllib3与urllib的区别是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Python中urllib3与urllib的区别是什么

这期内容当中小编将会给大家带来有关Python中urllib3与urllib的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

urllib库

urllib 是一个用来处理网络请求的python标准库,它包含4个模块。

  • urllib.request---请求模块,用于发起网络请求

  • urllib.parse---解析模块,用于解析URL

  • urllib.error---异常处理模块,用于处理request引起的异常

  • urllib.robotparser robots.tx---用于解析robots.txt文件

urllib.request模块

request模块主要负责构造和发起网络请求,并在其中添加Headers,Proxy等。 利用它可以模拟浏览器的请求发起过程。

  • 发起网络请求

  • 操作cookie

  • 添加Headers

  • 使用代理

关于urllib.request.urlopen参数的介绍

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

urlopen是一个简单发送网络请求的方法。它接收一个字符串格式的url,它会向传入的url发送网络请求,然后返回结果。

先写一个简单的例子:

from urllib import requestresponse = request.urlopen(url='http://www.httpbin.org/get')print(response.read().decode())

urlopen默认会发送get请求,当传入data参数时,则会发起POST请求。data参数是字节类型、者类文件对象或可迭代对象。

from urllib import requestresponse = request.urlopen(url='http://www.httpbin.org/post',                           data=b'username=q123&password=123')print(response.read().decode())

还才可以设置超时,如果请求超过设置时间,则抛出异常。timeout没有指定则用系统默认设置,timeout只对,http,https以及ftp连接起作用。它以秒为单位,比如可以设置timeout=0.1 超时时间为0.1秒。

from urllib import requestresponse = request.urlopen(url='https://www.baidu.com/',timeout=0.1)

Request对象

利用openurl可以发起最基本的请求,但这几个简单的参数不足以构建一个完整的请求,可以利用更强大的Request对象来构建更加完整的请求。

1 . 请求头添加

通过urllib发送的请求会有一个默认的Headers: “User-Agent”:“Python-urllib/3.6”,指明请求是由urllib发送的。所以遇到一些验证User-Agent的网站时,需要我们自定义Headers把自己伪装起来。

from urllib import requestheaders ={    'Referer': 'https://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu&wd=python%20urllib%E5%BA%93&oq=python%2520urllib%25E5%25BA%2593&rsv_pq=947af0af001c94d0&rsv_t=66135egC273yN5Uj589q%2FvA844PvH9087sbPe9ZJsjA8JA10Z2b3%2BtWMpwo&rqlang=cn&rsv_enter=0&prefixsug=python%2520urllib%25E5%25BA%2593&rsp=0',     'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'}response = request.Request(url='https://www.baidu.com/',headers=headers)response = request.urlopen(response)print(response.read().decode())
2. 操作cookie

在开发爬虫过程中,对cookie的处理非常重要,urllib的cookie的处理如下案例

from urllib import requestfrom http import cookiejar# 创建一个cookie对象cookie = cookiejar.CookieJar()# 创一个cookie处理器cookies = request.HTTPCookieProcessor(cookie)# 以它为参数,创建opener对象opener = request.build_opener(cookies)# 使用这个opener 来发请求res =opener.open('https://www.baidu.com/')print(cookies.cookiejar)
3. 设置代理

运行爬虫的时候,经常会出现被封IP的情况,这时我们就需要使用ip代理来处理,urllib的IP代理的设置如下:

from urllib import requesturl ='http://httpbin.org/ip'#代理地址proxy ={'http':'172.0.0.1:3128'}# 代理处理器proxies =request.ProxyBasicAuthHandler(proxy)# 创建opener对象opener = request.build_opener(proxies)res =opener.open(url)print(res.read().decode())

urlib库中的类或或者方法,在发送网络请求后,都会返回一个urllib.response的对象。它包含了请求回来的数据结果。它包含了一些属性和方法,供我们处理返回的结果

  • read() 获取响应返回的数据,只能用一次

  • readline() 读取一行

  • info() 获取响应头信息

  • geturl() 获取访问的url

  • getcode() 返回状态码

urllib.parse模块

parse.urlencode() 在发送请求的时候,往往会需要传递很多的参数,如果用字符串方法去拼接会比较麻烦,parse.urlencode()方法就是用来拼接url参数的。

from urllib import parseparams = {'wd':'测试', 'code':1, 'height':188}res = parse.urlencode(params)print(res)

打印结果为wd=%E6%B5%8B%E8%AF%95&code=1&height=188

也可以通过parse.parse_qs()方法将它转回字典

print(parse.parse_qs('wd=%E6%B5%8B%E8%AF%95&code=1&height=188'))

urllib.error模块

error模块主要负责处理异常,如果请求出现错误,我们可以用error模块进行处理 主要包含URLError和HTTPError

URLError:是error异常模块的基类,由request模块产生的异常都可以用这个类来处理

HTTPError:是URLError的子类,主要包含三个属性

  • Code:请求的状态码

  • reason:错误的原因

  • headers:响应的报头

from urllib import request,errortry:    response = request.urlopen("http://pythonsite.com/1111.html")except error.HTTPError as e:    print(e.reason)    print(e.code)    print(e.headers)except error.URLError as e:    print(e.reason)else:    print("reqeust successfully")

urllib.robotparse模块 

robotparse模块主要负责处理爬虫协议文件,robots.txt.的解析。

Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取

网络库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 = 'http://www.baidu.com/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)

运行之后,效果如下:

Python中urllib3与urllib的区别是什么

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

POST请求

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

示例如下:

import urllib3http = urllib3.PoolManager()url = 'http://httpbin.org/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)

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

Python中urllib3与urllib的区别是什么

HTTP响应头

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

import urllib3http = urllib3.PoolManager()url = 'http://www.baidu.com/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])

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

Python中urllib3与urllib的区别是什么

上传文件

首先,我们需要简单的实现一个文件上传的服务器代码,这里我们使用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为准。

上述就是小编为大家分享的Python中urllib3与urllib的区别是什么了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Python中urllib3与urllib的区别是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Python中urllib3与urllib的区别是什么

这期内容当中小编将会给大家带来有关Python中urllib3与urllib的区别是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。urllib库urllib 是一个用来处理网络请求的python标准库
2023-06-20

Python爬虫中urllib3与urllib的区别是什么

目录urllib库urllib.request模块Request对象1 . 请求头添加2. 操作cookie3. 设置代理urllib.parse模块urllib.error模块urllib.robotparse模块 网络库urllib3网
2022-06-02

Python中==与is的区别是什么

这篇文章主要介绍“Python中==与is的区别是什么”,在日常操作中,相信很多人在Python中==与is的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python中==与is的区别是什么”的疑
2023-06-16

python中reversed与reverse的区别是什么

今天小编给大家分享一下python中reversed与reverse的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧
2023-07-05

Python中turtle.right与turtle.setheading的区别是什么

这篇文章将为大家详细讲解有关Python中turtle.right与turtle.setheading的区别是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、概念turtle.right与turtl
2023-06-29

python中sep与end的区别是什么

今天就跟大家聊聊有关python中sep与end的区别是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语
2023-06-14

python __init__与 __new__的区别是什么

这篇“python __init__与 __new__的区别是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python
2023-07-05

php中==与===的区别是什么

这篇文章主要讲解了“php中==与===的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php中==与===的区别是什么”吧!一、“==”操作符“==”操作符是PHP中的等于操作符
2023-07-05

Java语言中&&与& ||与|的区别是什么

1、运算符两边的变量为boolean变量时 先列出代码:public class Test { public static void main(String[] args) { boolean a = false;
2023-05-31

python元组与列表的区别是什么

Python中的元组(tuple)和列表(list)是两种不同的数据结构,它们之间的主要区别在于以下几点:不可变性:元组是不可变的数据结构,一旦创建后就不能被修改,而列表是可变的数据结构,可以随时修改其中的元素。语法表示:元组使用圆括号()
python元组与列表的区别是什么
2024-03-15

Vue中Ref与Reactive的区别是什么

今天小编给大家分享一下Vue中Ref与Reactive的区别是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。Ref与Re
2023-06-05

html中Div与table的区别是什么

这篇文章主要介绍“html中Div与table的区别是什么”,在日常操作中,相信很多人在html中Div与table的区别是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html中Div与table的区别
2023-06-08

Java中List与ArrayList的区别是什么

Java中List和ArrayList都是集合类的接口,但是它们之间存在一些区别。1. 继承关系:List是一个接口,而ArrayList是List的一个实现类。2. 数据结构:ArrayList是基于数组实现的,而List是一种有序的集合
2023-08-15

C++中const与constexpr的区别是什么

这篇文章主要讲解了“C++中const与constexpr的区别是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C++中const与constexpr的区别是什么”吧!一.const常量
2023-06-21

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录