最易上手的爬虫请求库:Requests核心功能速览(下)

本文详细介绍了Python的Requests库在爬虫中的高级用法,包括定制请求头、POST请求带参数、多部分编码文件上传、Cookie使用以及响应状态码、响应头等基础功能。通过这些知识,可以更灵活地处理网络请求和应对各种复杂的爬虫场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一个章节我们讲了如何快速使用Requests发送网络请求、处理URL参数和提取响应内容,这些是最基本的操作。

然而还有很多场景下,我们的网络请求更加复杂。比如我们必须要定制请求头来假装成浏览器,不然可能会被网站识别为机器并且被屏蔽;又比如我们需要在发送请求时以表单形式携带部分参数,以获得定制化的响应结果;甚至我们还要在请求时上传一个文件……

今天我们就来看一下如何在Requests中优雅地实现这些功能。

一、定制请求头

这里的用法和urllib.request.Request类里的请求头定制方法相似,都是将请求头的信息以字典的形式传给headers参数,比如:

import requests

headers = {
    'User-Agent': ('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                   '(KHTML, like Gecko) Chrome/109.0.0.0 Safari/537.36 Edg/109.0.1518.61')
}
r = requests.get('https://www.baidu.com', headers=headers)

过于简单以至于没什么好说的。

二、在POST请求中携带参数

上一节课我们演示了在GET请求中如何直接传递URL参数。在POST请求中一样简单,参数既能以字典形式传入,也能以元组形式传入。

import json

params1 = {
    'name': '老Q在折腾',
    'platform': ['公众号', '头条号', '知乎']
}

params2 = (('name', '老Q在折腾'), ('platform', '公众号'), 
          ('platform', '头条号'), ('platform', '知乎'))


r1 = requests.post("http://httpbin.org/post", data=params1)
print(json.loads(r1.text))


r2 = requests.post("http://httpbin.org/post", data=params2)
print(json.loads(r2.text))

可以看到,不管是以字典形式还是以元组形式,两者在form部分输出的结果是一样的,这意味着两种传参形式是等价的。

有些时候,我们可能传递的是一组字符串而非一个字典,那么我们就需要对数据进行编码。或者将字典数据传递给json参数,如:

import json

url = 'https://api.github.com/some/endpoint'
params = {
    'name': '老Q在折腾',
    'platform': ['公众号', '头条号', '知乎']
}

r1 = requests.post(url, data=json.dumps(params))
r2 = requests.post(url, json=params)

三、POST上传多部分编码文件

多部分编码,顾名思义,是指一个消息头包含多个消息体的编码方式。这类编码主要用于发送非文本的各类媒体数据。

Requests中,传输一个多部分编码文件依然优雅。

url = 'http://httpbin.org/post'
files = {'file': open('text.xlsx', 'rb')}
r = requests.post(url, files=files)

我们还可以显示地声明文件名、文件类型和请求头,并且将字符串以文件形式传入。

url = 'http://httpbin.org/post'
files = {
    'file': (
        'test.csv',
        'abasdf,asdfa,你好,测试,asdf',
        'application/vnd.ms-excel',
        {'Expires': '0'}
)}
r = requests.post(url, files=files)
json.loads(r.text)

我们将字符串'abasdf,asdfa,你好,测试,asdf'以文件方式传递。在响应体中,可以看到它被识别到了files参数中。

{'args': {},
 'data': '',
 'files': {'file': 'abasdf,asdfa,你好,测试,asdf'},
 'form': {},
 'headers': {'Accept': '*/*',
  'Accept-Encoding': 'gzip, deflate, br',
  'Content-Length': '227',
  'Content-Type': 'multipart/form-data; boundary=ee2379952200a33908d46cc0fc0d04ba',
  'Host': 'httpbin.org',
  'User-Agent': 'python-requests/2.28.2',
  'X-Amzn-Trace-Id': 'Root=1-63e3a983-45f9921b6d14fa3368711d0c'},
 'json': None,
 'origin': 'xxx.xxx.xxx.xx',
 'url': 'http://httpbin.org/post'}

四、使用Cookie

我们可以直接用字典对象来传递Cookie,也可以使用requests.cookies.RequestsCookieJar对象来实现,后者的接口更完整,适合跨域名和跨路径使用。

url = 'http://httpbin.org/cookies'
cookies = {
    'KEY1': 'VALUE1'
}

# 以字典形式传入
r1 = requests.get(url, cookies=cookies)
print(r1.text)

# 以`RequestsCookieJar`传入
jar = requests.cookies.RequestsCookieJar()
jar.set('KEY2', 'VALUE2', domain='httpbin.org', path='/cookies')
r2 = requests.get(url, cookies=jar)
print(r2.text)

输出为:

{
  "cookies": {
    "KEY1": "VALUE1"
  }
}

{
  "cookies": {
    "KEY2": "VALUE2"
  }
}

可以看到,两者实现的效果是一样的。

五、其他基础功能

1. 响应状态码

我们可以用status_code属性来查看响应状态码。

r = requests.get('https://www.baidu.com')
print(r.status_code)

2. 响应头

我们可以用headers属性来查看响应头。

r = requests.get('https://www.baidu.com')
print(r.headers)

3. 重定向与请求历史

默认情况下,除了HEAD类请求,Requests会自动处理所有重定向。但是如果我们想要看到每次重定向的历史,我们可以在history属性中查看。其中,所有重定向的请求会按照从最老到最新来排序。

r = requests.get('http://github.com')
print(r.url)
print(r.status_code)
print(r.history)

我们可以使用allow_redirects参数来选择禁用重定向:

r = requests.get('http://github.com', allow_redirects=False)
print(r.url)
print(r.status_code)
print(r.history)

4. 超时

我们可以使用timeout参数来控制超时时长。

r = requests.get('https://www.baidu.com', timeout=0.0000001)

5. 错误与异常

Requests库中的异常处理能力比urllib有所加强,下面是官方列出来的常见的异常。

  • 遇到网络问题,如DNS查询失败、拒绝连接等,Requests会抛出ConnectionError异常。
  • 如果HTTP请求返回了不成功的状态码,Response.raise_for_status()会抛出一个HTTPError异常,当我们不调用此方法时,默认不会抛出异常。
  • 若请求超时,Requests会抛出Timeout异常。
  • 若请求超过了设定的最大重定向次数,Requests会抛出TooManyRedirects异常。
  • 所有Requests显式抛出的异常都继承自requests.exceptions.RequestException

这两节的内容包含了Requests中最常用的一些功能。再结合前边我们讲过的urllib库,我们现在应该可以处理大部分普通网站的请求了。后边我会再花一些章节在实战中告诉大家应该如何灵活应用这些方法。

Requests中的高级功能,我们在更往后的一些章节里慢慢讲。下面几章我会告诉大家如何解析网页内容,这样配合我们前边学过的内容,我们就可以完整地实现抓取网页的全流程了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量化祛魅官 老Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值