首页技术文章正文

requests库与urllib库相比有什么优势?

更新时间:2021-06-23 来源:黑马程序员 浏览量:

IT培训班

requests是基于Python开发的HTTP库,与urllib标准库相比,它不仅使用方便,而且能节约大量的工作。实际上,requests是在urllib的基础上进行了高度的封装,它不仅继承了urllib的所有特性,而且还支持一些其他的特性,例如,使用Cookie保持会话、自动确定响应内容的编码等,可以轻而易举地完成浏览器的任何操作。

requests库中提供了如下常用的类:

(1) requests.Request:表示请求对象,用于将一个请求 发送到服务器。

(2) requests.Response:表示响应对象,其中包含服务器对HTTP请求的响应。

(3) requests.Session:表示请求会话,提供Cookie持久性、连接池和配置。

其中,Request 类的对象表示一个请求, 它的生命周期针对一个客户端请求,一旦请求发送完毕,该请求包含的内容就会被释放掉。而Session类的对象可以跨越多个页面,它的生命周期同样针对的是一个客户端。 当关闭这个客户端的浏览器时,只要是在预先设置的会话周期内(一般是20~30 min),这个会话包含的内容会一直存在,不会被马上释放掉。例如,用户登永某个网站时,可以在多个IE窗口发出多个请求。


requests库与urllib库代码对比

与urllib库相比,requests库更加深得人心,它不仅能够重复地读取返回的数据,而且过能自动确定响应内容的编码。为了能让大家直观地看到这些变化,下面分别使用urllib库和requests库爬取百度网站中“传智教育”关键字的搜索结果网页。

(1)使用urllib库以GET请求的方式爬取网页。具体代码如下:

# 导入请求和解析模块
import urllib.request
import urllib.parse

# 请求的URL路径和查询参数
url = "http://www.baidu.com/s"
word = {"wd": "传智教育"}
# 转换成url编码格式(字符串)
word = urllib.parse.urlencode(word)
# 拼接完整的URL路径
new_url = url + "?" + word
print(new_url)

# 请求报头
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
# 根据URL和headers构建请求
request = urllib.request.Request(new_url, headers=headers)
# 发送请求,并接收服务器返回的文件对象
response = urllib.request.urlopen(request)
# 使用read()方法读取获取到的网页内容,使用UTF-8格式进行解码
html = response.read().decode("UTF-8")
print(html)


(2)使用requests库以GET请求的方式爬取网页。具体代码如下:

# 导入requests库
import requests
# 请求的URL路径和查询参数
url = "http://www.baidu.com/s"
param = {"wd": "传智教育"}

# 请求报头
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.1 Safari/605.1.15"}
# 发送GET请求,返回一个响应对象
response = requests.get(url, params=param, headers=headers)
# 查看响应的内容
print(response.text)


比较上述两段代码不难发现,使用requests库减少了发送请求的代码量。下面再从细节上体会一下库的便捷之处,具体如下:

(1)无须再转换为URL路径编码格式拼接完整的URL路径。

(2)无须再频繁地为中文转换编码格式。

(3)从发送请求的函数名称,可以很直观地判断发送到服务器的方式。

(4)urlopen()方法返回的是一个文件对象, 需要调用read()方法次性读取;而get()函数返回的是一个响应对象,可以访问该对象的text属性查看响应的内容。

这里虽然只初步介绍了requests库的用法,但是也可以从中看出,整个程序的逻辑非常易于理解,更符合面向对象开发的思想,并且减少了代码量,提高了开发效率,给开发人员带来了便利。


猜你喜欢:

三种分布式爬虫策略的优缺点

HTTP请求格式:请求行、请求头详细介绍

什么是网络爬虫?网络爬虫有什么用途?

多线程爬虫是什么?多线程爬虫流程分析

黑马程序员python+大数据培训课程

分享到:
在线咨询 我要报名
和我们在线交谈!