python的网络请求库urllib、urllib2、urllib3、request的联系

news2025/8/12 5:50:40

文章目录

      • 1. 简介
      • 2. urllib
      • 3. urllib2
      • 4. urllib3
      • 5. requests
      • 6. 相关文章

1. 简介

urllib、urllib2、urllib3、request均能通过网络访问互联网上的资源文件,它们通过使用统一资源定位符(URL)并结合re模块完成很多意想不到的操作。

  • urllib:Python2和Python3内置的网络请求库,Python3的urllib实际是Python2版本中urllib和urllib2的合并
  • urllib2:它只存在于Python2版本的内置库中,功能与urllib基本类似,主要是urllib的增强。urllib、urllib2都是python的内置标准库;
  • urllib3:Python2和Python3均可以使用,但这不是标准库,需要使用pip安装使用,urllib3提供了线程安全池和文件post等,该模块是服务于升级的http 1.1标准,且拥有高效http连接池管理及http代理服务的功能库,但其并非python内
  • requests:requests是基于urllib3封装的,继承了urllib2的所有特性,遵循Apache2 Licensed开源协议的HTTP库,支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。如他的口号HTTP for Humans所说,这才是给人用的HTTP库,实际使用过程中更方便,能够大大的提高使用效率,缩短写代码的时间。

注意: 在Python2中urllib和urllib2一般搭配使用的(不然Python2整两个内置库干嘛),urllib具有urllib2没有的功能,而urllib2具有urllib没有的功能。如urllib2可以接受请求对象来设置URL请求的头,urllib只接受URL;urllib提供用于生成GET查询字符串的urlencode方法,urllib2没有这样的函数。这就是为什么urllib经常与urllib2一起使用的原因之一。

2. urllib

urllib这个Python标准库基本上包含了基础的网络请求功能,以下urllib的演示均为Python3中的用法,Python2中单独用urllib会比较难受,上面也提到了它最好配合urllib2一起使用。

  • urllib发起GET请求

urlopen()方法发起请求,read()方法获取网页数据

from urllib import request

res = request.urlopen("http://httpbin.org/get")
print(res.read().decode())  # red()方法读取的数据是bytes的二进制格式,需要解码
  • urllib发起POST请求

urlopen()默认是GET方式请求,当传入data参数时会发起POST请求,此时传递的参数必须时bytes格式

from urllib import request

res = request.urlopen("http://httpbin.org/post", data=b'hello=world')
print(res.read().decode())
  • urllib为请求添加Headers

通过urllib发起的请求默认的头信息是"User-Agent": “Python-urllib/3.6”,一般网站会验证请求头的合法性,如果需要修改可以通过urllib.request中的Request对象

from urllib import request

url = "http://httpbin.org/get"
headers = {'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36'}

req = request.Request(url=url, headers=headers) # 传递的Request对象
res = request.urlopen(req)
print(res.read().decode())

此时httpbin网站返回的内容如下:

{
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"
  },
  "origin": "210.33.11.241, 210.33.11.241",
  "url": "https://httpbin.org/get"
}
  • urllib制定proxy代理

在使用爬虫时经常会配置代理隐藏我们的IP地址

from urllib import request

url = 'http://httpbin.org/ip'
proxy = {'http': '117.95.200.71:9999', 'https': '183.154.54.188:9999'} # 可以使用西刺代理配置

# 创建代理处理器
proxies = request.ProxyHandler(proxy)
# 创建opener对象
opener = request.build_opener(proxies)

resp = opener.open(url)
print(resp.read().decode())
  • urllib下载数据至本地
from urllib import request

url = 'http://httpbin.org/image/jpeg'
request.urlretrieve(url, '1.jpg')

3. urllib2

urllib2的用法其实基本和urllib相似,且它只存在于Python2版本,它的使用时需要配合urllib一起使用,要说它和urllib的区别还要看下面这个表,下表主要说明了在Python2中的urllib、urllib2中的方法整合到Python3后方法名的区别。
urllib

  • urllib2发起GET请求

这里展示了一个官方使用urllib2的GET请求

import urllib2

res = urllib2.urlopen("http://httpbin.org/get")
print res.read().decode()

4. urllib3

urllib3说一个HTTP客户端Python库,Python2和Python3在未安装的情况下均可以使用pip install urllib3即可安装,它提供了很多urllib库中没有的重要特性: 线程安全 连接池 客户端SSL/TLS验证 文件分部编码上传 协助处理重复请求和HTTP重定位 支持gzip和deflate压缩编码 支持HTTP和SOCKS代理 100%测试覆盖率

  • urllib3发起GET请求

urllib3主要的特点就是在请求之前需要创建一个连接池对象

import urllib3

http = urllib3.PoolManager()  # 线程池生成请求
res = http.request('GET', 'http://httpbin.org/get')
print(res.data.decode())
  • urllib3发起POST请求

post请求只需要将request()方法的第一个参数改为POST,并设置fields参数即可

import urllib3

http = urllib3.PoolManager()  # 线程池生成请求
res = http.request('POST', 'http://httpbin.org/post', fields={'hello': 'world'})
print(res.data.decode())
  • urllib3设置headers

设置headers的方法和设置参数一样方便,只需要加入headers参数即可

headers = {'X-Something': 'value'}
res = http.request('POST', 'http://httpbin.org/post', headers=headers, fields={'hello': 'world'})

5. requests

最后介绍一个杀手级神器——requests,你会发现它一样也很好用,requests使用了urllib3的库,并且继承了所有urllib2的特性,最关键的是它不需要urllib3一样在编码时收到开启线程池,简单粗暴,不过它同样也要使用pip install requests安装。另外,requests会自动实现持久连接keep-alive

格外简单的演示:

import requests

res = requests.get('http://httpbin.org/get')
print(res.text)

在实际使用中推荐使用后两种,因为毕竟方便,而若时没有安装这些库的情况下,Python3的urllib也是一个不错的选择。

和urllib比较示例:

###urllib

from  urllib import request,parse
import json
if __name__ == '__main__':
    while True:
        baseurl = 'http://fanyi.baidu.com/sug'
        keyword = input('请输入你要查询的单词:')
        data = {
            'kw': keyword
        }
        data = parse.urlencode(data).encode()  # 需要给数据编码,现在data是bytes格式,
        #调试用的的话可以输入以下代码(已注释)
        #data = parse.urlencode(data)
        #print(data)

        rsp = request.urlopen(baseurl, data=data)
        json_data = rsp.read().decode()#解码后的数据是json格式,所以要import json
        #print(json_data)
        json_data = json.loads(json_data)
        for i in json_data['data']:
            print(i['k'], '---->', i['v'])

---------------------------------------------------------------------------------------

#####requests

import requests
if __name__ == '__main__':
    while True:
        baseurl = 'http://fanyi.baidu.com/sug'
        keyword = input('请输入你要查询的单词:')
        data = {
            'kw': keyword
        }
        #这里不用给data进行编码
        #但是下面要指明post方法
        #rsp=requests.request('post',url=baseurl,data=data)
        #上下两代码等价
        rsp = requests.post(url=baseurl, data=data)
        #而这里也不用导入 json模块,直接使用对象的json()方法即可
        json_data = rsp.json()
        for i in json_data['data']:
            print(i['k'], '---->', i['v'])
总的来说,requests将urlib进行了更高级的封装,不用人为的编码解码,将其自动化,

6. 相关文章

  • requests.session()的用法

  • Requsets库的基本使用

  • requests.get()和requests.session.get()的区别与联系

  • python requests timeout详解

  • Python中requests模块源码分析:requests是如何调用urllib3的

  • Python3中进行HTTP请求的4种方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/15200.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库与缓存的一致性

数据库与缓存的一致性 一致性就是数据保持一致,在分布式系统中,可以理解为多个节点中数据的值是一致的。 强一致性:这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好…

Windows系统怎么加密文件夹?

Windows系统是目前使用人数最多的电脑系统,那么你知道在Windows系统上怎么加密文件夹吗?下面这篇文章,将向大家介绍两种Windows系统文件夹加密的方法,希望对你有所帮助。 方法一:使用超级加密3000进行加密 1、打开超级…

C和C++导出DLL后在Csharp中调用函数名的差异

参考链接:cc​​​​​​​在Unity中调用C代码:出现EntryPointNotFoundException的解决办法: - 知乎 (zhihu.com) __declspec(dllexport)的位置问题 - 岚之山 - 博客园 (cnblogs.com) 如果是报如下异常 System.EntryPointNotFoundExceptio…

【GlobalMapper精品教程】017:KML generator快速将坐标转为KML文件

本文介绍KML generator软件,并快速将坐标转为KML文件的使用方法,并用globalmapper中打开kml文件加以验证。本专栏配套完整的案例数据包,请打开data017.rar获取软件及数据。 文章目录 1. KML文件介绍2. kml generator软件介绍2.1 单点KML制作2.2 Excel数据KML制作2.3 文本文件…

【模电实验】【超值1 + 1】【验证性实验——分立元件“OTL“功率放大器实验】【验证性实验——分立元件稳压电源实验】

实验9-1 验证性实验——分立元件"OTL"功率放大器实验 Multisim仿真 编辑分立元件OTL功率放大器的仿真电路如下: 静态工作点的调试与仿真如下: 发射极基极集电极T1277mV998mV5.66VT26.38V6.93V12VT36.20V5.66V0V 交越失真分析如下&#xff1a…

【Linux】OS和进程概念

文章目录1.冯诺依曼体系结构2. 操作系统(Operator System )概念总结3. 进程描述进程-PCBtask_struct-PCB的一种task_ struct内容分类见见进程1.冯诺依曼体系结构 冯诺依曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起…

微机原理实验:字符转换为ASCII码

随记! 要求: 1. 将指定数据区的字符串数据以ASCII码形式显示在屏幕上,并通过DOS功能调用完成必要提示信息的显示。 2. 在屏幕上显示自己的学号姓名信息。 3. 循环从键盘读入字符并回显在屏幕上,然后显示出对应字符的AS…

JS高级(四):正则表达式、常见的特殊字符、案例、预定义类、正则替换

JavaScript高级(四)一、正则表达式1.它有什么作用?2.创建正则表达式(1)利用RegExp对象来创建(2)利用字面量创建3.测试正则表达式二、特殊字符1.^和$匹配开头和结尾2.[ ]字符类3.量词符三、用户名…

有线热电偶温度验证系统

在本文中,我们将介绍使用有线热电偶温度验证系统的一些优势,并将虹科Ellab的E-Val™ Pro与市场上可用的传统有线系统(验证仪)进行比较分析。 虹科E-Val Pro是一个高度直观的基于电缆的系统。设计用于各种应用,如冻干、…

数字化时代,企业为什么需要商业智能BI?

数字化时代的到来,数据资产已经成为第五大生产要素,数据是企业生产、经营和决策的重要因素。为提升企业经营状况的感知能力,数据分析应运而生,数据获取的及时性、准确性也需要更加系统些,此时,成熟的商业智…

EasyExcel代码层面设置写出的Excel样式、以及拦截器策略的使用、自动列宽设置、EasyExcel默认设置详解

一、概述 虽然EasyExcel已经提供了一系列注解方式去设置样式。 但是如果没有实体类,或者想要更精确的去设置导出文件的Excel样式的时候就需要在代码层面去控制样式了。 二、使用已有拦截器自定义样式 主要步骤: 创建Excel对应的实体对象创建一个sty…

注意 ! !|95% 的应用程序中发现错误配置和漏洞

业内权威机构 Synopsys 最近发布了一项研究报告,结果表明在进行4300次测试后,发现95%的应用程序中都至少都有一个影响安全的漏洞或配置错误,其中高危漏洞占20%,严重漏洞则占4.5%。在此次研究中,82% 的测试目标是 Web 应…

调用链路上千条,如何观测 Nacos 的运行状态

作者:涌月 背景 随着近年来微服务体系发展,微服务上下游链路的越来越复杂,在阿里云的线上实践场景中,我们发现使用微服务架构的公司的业务动辄会出现上千条调用链路,排查问题代价巨大。 在这种背景下,阿…

灰鸽子木马特征值免杀

文章目录木马特征值免杀一. 木马特征值免杀0x01. 灰鸽子配置生成木马0x02. 使用MyCCL复合特征码定位器反复缩小目标进行定位0x03. 直到定位到很小的区间0x04. 用工具将文件偏移地址0009B9C3转换成内存地址0049C5C30x05. 使用OD跳转特征值语句的执行顺序以实现免杀0x06. 将修改后…

【深入浅出Spring6】第五期——循环依赖和反射机制

一、Bean的循环依赖问题 什么是循环依赖? 类似于A依赖B,B又依赖A,这样就构成了依赖闭环 需求:我们创建两个类,彼此内置对方为私有属性,我们查看是否可以正常输出 $ singleton setter产生的循环依赖 编写我…

(八)Bean的生命周期

文章目录环境什么是Bean的生命周期为什么要知道Bean的生命周期Bean生命周期之5步Bean生命周期之7步Bean生命周期之10步三个点位详解:点位1点位2点位3演示程序Bean的作用域不同,管理方式不同自己new的对象如何让Spring管理上一篇:(…

UE4 回合游戏项目 20- 添加人物被攻击的动画

在上一节(UE4 回合游戏项目 19- 添加血量UI)基础上继续添加人物被攻击时播放被攻击动画的功能。 效果:(当玩家被攻击时,播放相应的受到伤害的动画) 步骤: 1.打开“1lantu”,在事件图…

艾美捷试剂级SM-102解决方案

LNP是一种多组分系统,通常由可电离脂质或阳离子类脂质化合物、辅助脂质、胆固醇、保护剂聚乙二醇-脂质共轭物组成。 脂质纳米颗粒(LNP)是mRNA药物常用的载体。目前,BioNTech/辉瑞和 Moderna的mRNA疫苗都采用LNP作为运输载体&#…

SpringMVC ---- RESTful

SpringMVC ---- RESTful1. RESTful简介a>资源b>资源c>资源2. RESTful的实现3. HiddenHttpMethodFilter1. RESTful简介 REST:Representational State Transfer,表示层资源状态转移。 a>资源 资源是一种看待服务器的方式,即&…

ECM:敏感文档控制的秘密武器

ECM:敏感文档控制的秘密武器 您的企业每天都会创建和处理数百个文档。这些文件详细说明了企业流程、产品规格,并为其他员工和客户提供指导。 每天都有大量文档流入和流出您的组织,有一件事始终保持不变:那就是组织内部和外部的…