【Python从入门到进阶】22、urllib库基本使用

news2024/9/22 21:26:41

接上篇《21、爬虫相关概念介绍》
上一篇我们介绍了爬虫的相关概念,本篇我们来介绍一下用Python实现爬虫的必备基础,urllib库的学习。

一、Python库的概念

我们今后的学习可能需要用到很多python库(library),及引用其他已经编写好的程序代码模块,来提高我们的开发效率。
python库(library)是指一组相关的模块和函数,用于提供特定领域或功能的支持。Python标准库和第三方库都属于Python库。

Python库通常是经过开发人员编写和测试的可重用代码集合。这些库提供了各种常用的函数、类、工具和算法,能够快速解决实际问题和加速开发过程。Python库主要有以下几类:

●标准库:Python官方提供的库,已经包含在Python解释器中,无需安装。Python标准库是指Python官方提供的、包含在Python解释器里的多个模块和包。这些模块和包提供了许多常用的功能,例如文件操作、网络通信、GUI开发、数据处理等等,可以直接在代码中使用。
Python标准库中的模块和函数都经过严格测试和验证,确保其稳定性和可靠性。因此,在实际开发中,我们通常会优先使用Python标准库提供的功能,而不是自己编写代码实现同样的功能。这不仅可以节省时间和精力,还可以提高代码的可维护性和可重用性。


●第三方库:由其他开发者提供的库,需要通过pip等包管理工具单独安装。


●框架:封装了一系列库和工具,提供了更高层次的抽象和专业化的功能,例如Django、Flask、Pygame等。

使用Python库可以大大提升开发效率,减少重复工作和错误率。如果某个功能没有现成的库,我们也可以自行编写并发布自己的库,方便其它人复用。

二、urllib简介

urllib是Python标准库中的一个模块,它包含了很多用于处理URL的功能。常见的用法包括发送HTTP请求、读取和解析网页内容等。具体来说,urllib模块中包含以下子模块:

●urllib.request: 用于发送HTTP请求和获取响应,支持HTTP、HTTPS和FTP协议。
●urllib.error: 包含与HTTP错误相关的异常类。
●urllib.parse: 用于解析和操作URL,例如解析URL参数。
●urllib.robotparser: 用于解析robots.txt文件,该文件告诉网络爬虫哪些页面可以访问。

三、发送HTTP请求

urllib.request模块提供了以下函数用于发送HTTP请求:
1、urllib.request.urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None): 打开一个URL并返回响应对象。可选参数包括POST数据、超时时间、证书文件等。
参数解释:

●url:必需,表示请求的URL地址,可以是一个字符串类型或者一个请求对象。
●data:可选,表示要发送的POST数据,需要以字节流(bytes)形式传递。如果不指定该参数,则默认为GET请求。
●timeout:可选,表示请求超时时间,单位为秒,默认值为None,即永远等待服务器响应。
●cafile:可选,表示SSL证书认证文件路径,通常为.pem文件,用于验证HTTPS请求的合法性。如果不指定该参数,则使用系统默认设置。
●capath:可选,表示SSL证书认证文件夹路径,通常为.pem文件夹,用于验证HTTPS请求的合法性。如果不指定该参数,则使用系统默认设置。
●cadefault:可选,如果设置为True,则使用系统默认的证书位置进行认证,否则需要指定cafile或capath参数。
●context:可选,表示SSL上下文,在处理HTTPS请求时需要使用,用于指定证书和协议等信息。

除了以上参数之外,urllib.request.urlopen()函数还支持一些其他的关键字参数,例如method、headers、origin_req_host、unverifiable等。这些参数可以用于自定义HTTP请求头、指定原始请求主机名、禁用危险的重定向等功能。
2、urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None): 构造一个HTTP请求对象。可选参数包括POST数据、请求头信息等。
参数解释:

●url:必需,表示请求的URL地址,可以是一个字符串类型或者一个请求对象。
●data:可选,表示要发送的POST数据,需要以字节流(bytes)形式传递。如果不指定该参数,则默认为GET请求。
●headers:可选,表示请求头信息,需要以字典类型传递。如果不指定该参数,则使用默认的请求头。
●origin_req_host:可选,表示原始请求主机名,通常用于跨站点请求时设置。如果不指定该参数,则使用目标URL的主机名。
●unverifiable:可选,如果设置为True,则表示请求是否被视为不可验证的。这个参数通常由支持协议处理器设置。
●method:可选,表示HTTP请求方法,可以是GET、POST、PUT、DELETE等。如果不指定该参数,则默认为GET请求。

除了以上参数之外,urllib.request.Request()函数还支持其他的关键字参数,例如version、host、urlencoded等。这些参数可以用于自定义HTTP请求方法、指定请求主机名、编码URL参数等功能。在实际使用中,我们可以根据具体需求选择合适的参数来构造HTTP请求对象。
3、urllib.request.build_opener(*handlers): 创建一个自定义的URL打开器对象,可以通过添加处理器(handler)实现定制化的HTTP请求处理流程。
4、urllib.request.install_opener(opener): 安装一个自定义的URL打开器对象,使其成为默认打开URL的方法。

四、解析HTTP响应

urllib.request.urlopen()函数返回的响应对象包含了以下方法和属性:

●response.read([size]): 读取响应内容,可选参数指定最多读取的字节数。
●response.readline(): 读取一行响应内容。
●response.readlines([sizehint]): 读取所有响应内容并以列表形式返回,每个元素是一行响应内容。
●response.getcode(): 获取HTTP状态码。

HTTP响应状态码指示与HTTP请求相关的返回结果,通常由三位数字组成。其中,第一位数字表示响应类型,后面两位数字表示具体的响应含义。
以下是一些常见的HTTP响应状态码及其含义:

200 OK:请求成功
201 Created:成功创建新资源
204 No Content:请求已成功处理,但没有内容返回
301 Moved Permanently:请求的URL已移动到新地址
302 Found:请求的URL临时转移到其他地址
304 Not Modified:请求的资源未被修改,可以直接使用缓存数据
400 Bad Request:请求参数有误,服务器无法解析请求
401 Unauthorized:请求需要用户认证或者认证失败
403 Forbidden:请求被拒绝访问,通常是因为权限不足
404 Not Found:请求的资源不存在
500 Internal Server Error:服务器出现内部错误

除了以上状态码之外,HTTP协议还定义了很多其他的状态码,例如502 Bad Gateway、503 Service Unavailable等等。在处理HTTP请求和响应时,我们需要通过判断响应状态码来确定HTTP请求是否成功,并根据响应状态码进行下一步操作。

●response.headers: 响应头信息,是一个类字典对象,提供了各种方法来访问头信息。
●response.info(): 获取响应头信息,等价于response.headers。
●response.geturl(): 获取实际请求的URL,可能与原始请求的URL不同。

五、下载文本、图片和视频等文件

urllib.request.retrieve()是Python标准库中的一个函数,用于下载文件并保存到本地。该函数有两个参数:

●url:必需,表示要下载的文件的URL地址。
●filename:可选,表示文件保存路径和名称。如果不指定该参数,则使用默认的文件名。
除了以上参数之外,urllib.request.retrieve()函数还支持以下两个参数:
●reporthook: 可选,回调函数,每次读取块时都会调用此函数。该函数通常用于显示下载进度等信息。
●data:可选,POST数据,需要以字节流(bytes)形式传递。

使用urllib.request.retrieve()函数可以方便地下载文件并保存到本地,例如:

import urllib.request

url = 'https://www.baidu.com/img/PCfb_5bf082d29588c07f842ccde3f97243ea.png'
filename = 'baidu_logo.png'
urllib.request.urlretrieve(url, filename)

这段代码将下载位于url变量中的文件,并保存在名为filename的文件中。如此便实现了文件下载功能。
效果:

六、urllib其他常用函数

下面主要介绍一下urllib.parse模块的函数。
urllib.parse是Python标准库中的一个模块,用于URL解析、编码和构造相关的操作。该模块包含了各种与URL相关的函数和类,可以方便地进行URL参数解析、拼接、编码和反编码等操作。

1、quote函数

urllib.parse.quote()是Python标准库中的一个函数,用于将字符串编码为URL安全的格式。在HTTP请求和URL参数传递过程中,某些字符可能会被解释为特殊含义或不安全字符,此时需要使用quote()函数进行编码,以避免这些字符对数据产生影响。

该函数有一个必需参数string,表示要编码的字符串。除此之外,还有两个可选参数:

●safe:表示不需要编码的字符,可以是字符串类型或者字节流(bytes)类型。默认值为/,表示/字符不需要编码。
●encoding:表示原始字符串的编码方式,默认值为utf-8。

urllib.parse.quote()函数将原始字符串中所有非ASCII字符、保留字符(如:、/、?等)和不安全字符(如空格、换行符等)都转换为%后跟两位十六进制数的形式,表示其在URL中的编码格式。例如:

import urllib.parse

url = 'https://example.com/search?q='
query = 'python 编程'
encoded_query = urllib.parse.quote(query)
full_url = url + encoded_query
print(full_url)

结果:

https://example.com/search?q=python%20%E7%BC%96%E7%A8%8B

以上代码将字符串query中的空格编码成%20,汉字也被编码成%十六进制数的形式,生成了一个URL地址,其中搜索关键词已经被正确编码。在构造URL时,我们通常需要使用urllib.parse.quote()函数将URL参数进行编码,以确保URL的正确性和安全性。

2、urlencode函数

urllib.parse.urlencode()是Python标准库中的一个函数,用于将字典类型或包含键值对元组的可迭代对象编码为URL参数。在HTTP请求和URL参数传递过程中,我们需要将数据转换为URL安全格式,并拼接到URL地址后面进行传递,此时就可以使用urlencode()函数进行编码。

该函数有一个必需参数params,表示要编码的字典类型或可迭代对象(如列表、元组等)。除此之外,还有三个可选参数:

●doseq:表示是否需要将相同参数名的多个值都编码并拼接到URL参数中,默认值为False。
●safe:表示不需要编码的字符,可以是字符串类型或者字节流(bytes)类型。默认值为/,表示/字符不需要编码。
●encoding:表示原始字符串的编码方式,默认值为utf-8。

urllib.parse.urlencode()函数将字典类型或可迭代对象中所有的键值对按照key=value的格式进行拼接,并将其编码为URL安全格式。例如:

import urllib.parse

params = {'name': 'Alice', 'age': 20}
encoded_params = urllib.parse.urlencode(params)
url = 'https://example.com/search?' + encoded_params
print(url)

结果:

https://example.com/search?name=Alice&age=20

以上代码将params字典类型的数据编码为URL参数,并拼接到URL地址后面,生成了一个完整的URL地址。在构造URL时,我们通常需要使用urllib.parse.urlencode()函数将URL参数进行编码,以确保URL的正确性和安全性。

3、urlencode.encode函数

urllib.parse.urlencode(params).encode()方法将字符串类型的数据编码为bytes类型,例如:

data = 'name=Alice&age=20'
encoded_data = data.encode()
print(encoded_data)    

结果:

b'name=Alice&age=20'

当我们需要使用POST方法向服务器传递数据时,通常需要将数据编码为bytes类型。因此,可以将urlencode()函数和encode()方法结合使用,将字典类型的数据编码为bytes类型的数据,例如:

import urllib.parse
params = {'name': 'Alice', 'age': 20}
encoded_params = urllib.parse.urlencode(params).encode()

以上代码将字典类型的params数据编码为URL参数形式的字符串,并将其转换为bytes类型的数据encoded_params。在实际开发中,我们可以根据具体需求选择合适的参数和方式,完成HTTP请求和URL参数的编码和解码工作。

七、示例代码

下面是一个简单的使用urllib.request模块发送HTTP请求并获取响应的示例代码:

import urllib.request

# 下面模拟浏览器向服务器发送请求
# 发送HTTP GET请求
response = urllib.request.urlopen('http://www.baidu.com/')
print(response.getcode())

# 发送HTTP POST请求
# city 是搜索城市名,date是要查询的天气日期
data = {'city': '郑州', 'date': '2023-05-31'}
# urlencode 将字典类型的数据data转换为URL参数形式的字符串(city=郑州&date=2023-05-31)
# .encode():将字符串类型的URL参数编码为bytes类型。由于HTTP请求中需要传递bytes类型的数据,因此需要使用该方法进行编码。
data = urllib.parse.urlencode(data).encode()
req = urllib.request.Request(url='https://api.asilu.com/weather/', data=data)

# 添加自定义请求头
req.add_header('User-Agent', 'Mozilla/5.0')
response = urllib.request.urlopen(req)
print(response.read().decode())

这个示例代码首先使用urllib.request.urlopen()函数发送HTTP GET请求,并打印响应状态码。接着,它构造了一个HTTP POST请求,并添加了自定义的User-Agent请求头,最后发送请求并打印响应内容。
结果:

200
{
    "city": "郑州",
    "update_time": "11:30",
    "date": "5月31日",
    "weather": [{
        "date": "31日(今天)",
        "weather": "阴转多云",
        "icon1": "02",
        "icon2": "01",
        "temp": "28/19℃",
        "w": "",
        "wind": "东风转西风",
        "icond": "104",
        "iconn": "151"
    }, {
        "date": "1日(明天)",
        "weather": "晴转多云",
        "icon1": "00",
        "icon2": "01",
        "temp": "31/20℃",
        "w": "3-4级",
        "wind": "西北风转西南风",
        "icond": "100",
        "iconn": "151"
    }, {
        "date": "2日(后天)",
        "weather": "阴",
        "icon1": "02",
        "icon2": "02",
        "temp": "27/19℃",
        "w": "3-4级转",
        "wind": "北风转西北风",
        "icond": "104",
        "iconn": "104"
    }, {
        "date": "3日(周六)",
        "weather": "小雨",
        "icon1": "07",
        "icon2": "07",
        "temp": "25/19℃",
        "w": "",
        "wind": "西南风",
        "icond": "305",
        "iconn": "305"
    }, {
        "date": "4日(周日)",
        "weather": "小雨转多云",
        "icon1": "07",
        "icon2": "01",
        "temp": "23/18℃",
        "w": "",
        "wind": "西南风转西风",
        "iconn": "151",
        "icond": "305"
    }, {
        "date": "5日(周一)",
        "weather": "多云转晴",
        "icon1": "01",
        "icon2": "00",
        "temp": "30/20℃",
        "w": "",
        "wind": "南风转西南风",
        "icond": "101",
        "iconn": "150"
    }, {
        "date": "6日(周二)",
        "weather": "阴",
        "icon1": "02",
        "icon2": "02",
        "temp": "30/21℃",
        "w": "3-4级",
        "wind": "南风",
        "icond": "104",
        "iconn": "104"
    }]
}

以上就是关于urllib库的基本使用,下一篇我们来学习通过urllib的post请求实现百度翻译的效果。

参考:尚硅谷Python爬虫教程小白零基础速通教学视频

转载请注明出处:https://blog.csdn.net/acmman/article/details/130975114

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

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

相关文章

在阿里外包干了3个月,我果断跑路了

有一种打工人的羡慕,叫做“大厂”。 真是年少不知大厂香,错把青春插稻秧。 但是,在深圳有一群比大厂员工更庞大的群体,他们顶着大厂的“名”,做着大厂的工作,还可以享受大厂的伙食,却没有大厂…

Python接口自动化脚本持续集成过程

之前都是开发人员提交代码到git,触发jenkins拉取git上面的代码并进行编译部署,部署成功后测试人员就可以在浏览器端开始测试了。 作为测试人员,也有跟git和jenkins打交道的时候。 项目实践: python接口自动化脚本编写成功后&am…

图解LeetCode——102. 二叉树的层序遍历

一、题目 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 二、示例 2.1> 示例 1: 【输入】root [3,9,20,null,null,15,7] 【输出】[[3],[9,20],[15,7]] 2.2> 示例…

Redis7实战加面试题-高阶篇(手写Redis分布式锁)

手写Redis分布式锁 面试题: 1.Redis除了拿来做缓存,你还见过基于Redis的什么用法? 数据共享,分布式session分布式锁 全局ID 计算器、点赞位统计 购物车 轻量级消息队列(list,stream) 抽奖 点赞、签到、打…

功率信号源驱动电路工作原理是什么

功率信号源驱动电路是一种能够将低功率、微弱的信号放大到足够高的功率水平的电路。在现代通信、医疗、工业等领域中,功率信号源驱动电路被广泛应用。下面,我们将对功率信号源驱动电路进行详细的介绍。 图:ATG-2000系列功率信号源 功率信号源…

【大数据学习篇12】 Spark项目实战-数据可视化

学习目标/Target 了解数据可视化系统架构 掌握Phoenix集成HBase 熟悉建立Phoenix与HBase表映射 了解Spring Boot项目的创建 掌握Java Web项目中实体类的创建 掌握Java Web项目中数据库访问接口的创建 掌握Java Web项目中控制器类的创建 熟悉Java Web项目中HTML页面的创建…

23种设计模式之模板方法模式(Template Method Pattern)

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章将23种设计模式中的模板方法模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。 如果文章有什么需要改进的地方还请大…

第十九章行为型模式—中介者模式

文章目录 中介者模式解决的问题结构实例存在的问题适用场景 中介者模式和代理模式的区别代理模式中介模式桥接模式总结 行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务,它涉及算法…

day0 -- Mysql专业名词认识部分

数据库(database)/资料库 常见的数据库/资料库且以物理形式存在的,比如图书馆,再比如书柜。 是一种有组织的存放资料/数据的容器。 数据库管理系统(DBMS) 创建数据库和管理数据库的系统,可以对数据库进行组织、管理、访问、修改等操作的一套…

真的被00后卷麻了,还好我很会划水~

前情提要 鉴于目前测试就业越来越严峻,内卷也成了测试领域的代名词了。我的一个HR朋友告诉我,现在测试岗的投递比已经将近1000,也就是一个岗位差不多有千份简历投进来,实在是恐怖! 前段时间我也去面试了一些公司&…

C4D 必备的 7 个素材网站!

C4D近几年来是一个非常热门的专业/职业,特别是在建模行业大多数时候都会选择使用C4D进行,相信也有很多粉丝朋友喜欢C4D这个类别。 但是我在一些网站上,经常会看到有人说想要一些C4D的素材,但是不知道去哪里找,也不知道…

redis 数据结构String之SDS

redis字符串(String)内存结构: 字符串对象底层数据结构实现为简单动态字符串(SDS)和直接存储,但其编码方式可以是int、raw或者embstr,区别在于内存结构的不同。 int编码 字符串保存的是整数值,并且这个正式…

iOS 16 UI 设计系统免费在线使用方法

1、iOS 16 UI 设计系统中有什么? iOS 16 UI 设计系统通常包含以下组件和元素: 1. 按钮:包括操作按钮、图标按钮、导航按钮、滚动按钮、切换按钮、单选按钮、复选框按钮、呼叫按钮等各种类型的按钮。 2. 窗口和 UI 控件:包括标签…

JAVA变量在不同情况下未赋值与默认初始值

目录 一、默认初始值 二、本地变量 代码 运行结果 二、实例变量 代码 运行结果 三、本地变量和实例变量的区别 1.作用域 2.生命周期 3.初始化 一、默认初始值 数据类型初始值数据类型初始值byte0long0Lchar‘u0000’float0.0fshort0double0.0int0booleanfalse引用nul…

人工智能-机器学习人工神经网络

机器学习 机器学习部分主要学习的内容是朴素贝叶斯算法和决策树算法。 决策树算法 决策树算法是机器学习中常用的一种分类算法,在决策树中,使用各个属性进行分类,选取每次分类的属性的方式有多种。最简单的是ID3算法,使用信息增…

【论文阅读】Robust Object-based SLAM for High-speed Autonomous Navigation

一、问题概述 这篇文章是在QuadricSLAM的基础上进行的改进,也就是说依然使用了椭球对物体进行描述,论文中提到使用椭球本身是因为椭球其参数化表示可以完全通过相机的检测框来进行约束,二次曲面与对偶二次曲面可以参考链接,文章使…

uniapp-前端 二维码、扫码、长按、识别等问题

一&#xff1a;识别&#xff1a;图片二维码url&#xff1a; 后端返回二维码的图片url&#xff0c;则直接展示&#xff0c;做长按手势识别&#xff0c;再调用方法即可。 <mage>标签长按识别实现&#xff08;微信版本>2.7.0&#xff09; <image show-menu-by-long…

JS数组题

从0到1&#xff1a;JavaScript快速上手第六章课后习题 一、单选题1&#xff0e;下面有一个数组&#xff0c;该数组中数值最小和数值最大的元素的下标分别是&#xff08; &#xff09;。 var arr[3,9,1,12,36,50,21] A&#xff0e;2, 5 B&#xff0e;3, 6 C&#xff0e;2, 6 D&…

【刷题】144. 二叉树的前序遍历

144. 二叉树的前序遍历 一、题目描述二、示例三、实现总结 144. 二叉树的前序遍历 一、题目描述 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历。 二、示例 示例1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[1,2,3] 示例 2&#…

第十五章行为性模式—命令模式

文章目录 命令模式解决的问题结构实例存在的问题适用场景 JDK 源码 - Runnable 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。行为型模式分为类…