返回介绍

2.2 爬虫基础 - Requests 库入门

发布于 2025-04-21 19:15:25 字数 5115 浏览 0 评论 0 收藏

爬虫基础-Requests 用法详解

2.2.1 Requests 库的安装

这一节讲解 Python 中实现 HTTP 请求非常受欢迎、非常简洁的一种方法 - 使用 Requests 库。Requests 库是一个优雅而简单的 HTTP 库,是本书推荐读者使用的手写爬虫常用库。它不是 Python 标准库,需要安装,可以在命令行中使用 pip 安装。

>pip install requests

在 Linux 系统下,需要输入如下命令进行安装。

>sudo pip install requests 

执行上述命令即可安装 Requests 库。安装完成后,需要在 Python 的 shell 或者 Ipython shell 中导入 Requests 库。

>>>import requests

如图 2-5 所示,如果没有报错,说明安装成功。

图 2-5 导入 Requests 库

2.2.2 Requests 库的请求方法

使用 Requests 发送网络请求非常简单。首先要导入 Requests 库。

>>>import requests 

假如现在要获取豆瓣首页,可以使用以下命令。

>>>response = requests.get('https://www.douban.com/') 

这样就使用 Requests 的 GET 方法获取到了豆瓣网站的首页,并把获取到的响应对象赋值给了 response。人们通过 Requests 的方法名称,很容易判断出它所使用的 HTTP 请求方法是 GET 方法。当然,也可以使用 Requests 的 POST 方法。

>>>requests.post('https://www.douban.com/') 

后面的章节将介绍使用 POST 方法登录豆瓣网站。

Requests 实现 HTTP 其他的基本请求方式,也非常简洁、明了,示例如下。

>>>requests.put('https://www.douban.com/')
>>>requests.delete('https://www.douban.com/')  
>>>requests.head('https://www.douban.com/')  
>>>requests.options('https://www.douban.com/')

2.2.3 Requests 库的响应对象

使用 Requests 请求方法后,系统会返回一个响应(response)对象,其存储了服务器响应的内容。现在回到最开始使用 GET 方法获取到的响应 response,可以使用 response.text 获取文本方式的响应体内容,Requests 会自动解码来自服务器的内容,大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码做出有根据的推测。当访问 response.text 时,Requests 会使用其推测的文本编码。可以使用如下命令找出 Requests 使用了什么编码。

>>>response.encoding
'utf-8' 

显然,Reqeusts 使用 utf-8 解码了来自豆瓣服务器的内容。也可以修改 response.encoding 属性来让 response.text 使用其他编码进行解码,示例如下。

>>>response.encoding = 'ISO-8859-1' 

如果改变了编码,每次访问 response.text,Requests 都将会使用 response.encoding 的新值。大多数情况下,Requests 会自动解码来自服务器的内容,所以并不需要改变 response.encoding,只有在使用特殊逻辑计算出文本编码的情况下,才需要修改编码。例如 HTTP 和 XML 自身可以指定编码,这样的话,可以使用 response.content 查看网页源码来找到其编码方式,然后设置 response.encoding 为相应的编码。这样就能使用正确的编码解析 response.text 了。

刚才提到了 response.content,response.content 以字节的方式访问请求响应体,假如获取的是一张图片,可以直接保存请求返回的 response.content 二进制数据。

>>>with open('tupian.jpg', 'wb') as tp:
tp.write(response.content) 

2.2.4 响应状态码

响应状态码(HTTP Status Code)是用以表示网页服务器 HTTP 响应状态的 3 位数字代码。可以使用 response.status_code 查看响应状态码,示例如下。

>>>response = requests.get('https://www.douban.com/')
>>>response.status_code 
200 

下面是常见的 HTTP 状态码及其含义:200 - 请求成功;301 - 资源(网页等)被永久转移到其他 URL;404 - 请求的资源(网页等)不存在;500 - 内部服务器错误。

为方便引用,Requests 还附带了一个内置的状态码查询对象。

>>>response.status_code == requests.codes.ok
True 

通过判断响应状态码是否与 requests.codes.ok 相等,可以帮助人们在编写爬虫时判断是否正确地获取到了资源。

2.2.5 定制请求头部

上一节讲过,服务器通过读取请求头部的用户代理(User Agent)信息,来判断这个请求是正常的浏览器还是爬虫。因此,可以为请求添加 HTTP 头部来伪装成正常的浏览器。只要简单地传递一个用户代理的 dict 给 headers 参数就可以了,示例如下。

>>>headers = {'User-Agent': 'Mozilla/5.0 (Windows
NT 10.0;WOW64) AppleWebKit/537.36 (KHTML, like  
Gecko) Chrome/46.0.2490.80 Safari/537.36'}  
>>>url = 'https://www.douban.com/'  
>>>r = requests.get(url, headers=headers) 

可以通过 r.request.headers 查看设置的请求头部,示例如下。

>>>r.request.headers
{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64)  
AppleWebKit/537.36 (KHTML, like Gecko)  
Chrome/46.0.2490.80 Safari/537.36',  
'Accept-Encoding': 'gzip, deflate', 'Accept':  
'*/*', 'Connection': 'keep-alive'} 

可以看到里面 User-Agent 这一项的值正是所设置的用户代理。也可以使用以下代码查看以一个 Python 字典形式展示的服务响应头。

>>>r.headers

2.2.6 重定向与超时

默认情况下,除了 HEAD 请求方法,Requests 会自动处理所有重定向。可以使用响应对象的 History 方法来追踪重定向。例如访问 http://www.douban.com/,会被重定向到 https://www.douban.com/。

>>>r = requests.get('http://www.douban.com/')
>>>r.history 
[<Response [301]>] 

注意 r.history 返回的是一个 list,它是一个 response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最旧到最新的请求进行排序。可以使用 r.url 查看实际请求的 URL。

>>>r.url
'https://www.douban.com/' 

有时在爬取网页的过程中,服务器没有响应,为了应对这种情况,可以告诉 Requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,程序可能会一直等待响应。

下面这条代码的意思是如果在 3 秒内收不到豆瓣服务器的响应,就会抛出一个 timeout 异常。

>>>requests.get('https://www.douban.com/', timeout=3) 

2.2.7 传递 URL 参数

很多时候,网站会通过 URL 的查询字符串(query string)传递某种数据。例如,在豆瓣的搜索框中搜索关键字 python,会发现跳转的 URL 变为如下形式。

https://www.douban.com/search?q=python 

这就是一个通过 URL 传递查询参数的例子,查询的数据会以键/值对的形式置于 URL 中,跟在一个问号的后面。Requests 允许使用 params 关键字参数,以一个字符串字典来提供这些参数。举例来说,如果想在豆瓣的书籍栏目中查询与 python 相关的内容,可以传递 q=python 和 cat=1001 到 https://www.douban.com/search,使用如下代码。

>>>payload = {'q': 'python', 'cat':'1001'}
>>>r = requests.get('https://www.douban.com/search', params=payload) 

通过打印输出该请求 URL,能看到 URL 已被正确编码。

>>>print(r.url)
https://www.douban.com/search?q=python&cat=1001 

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。