在爬虫开发中,HTTP请求是与服务器进行交互的关键操作。通过发送HTTP请求,爬虫可以获取目标网页或接口的数据,而有效地处理请求和响应是爬虫能够高效且稳定运行的基础。Requests
库作为Python中最常用的HTTP请求库,因其简洁、易用和强大的功能,广泛应用于爬虫开发中。本章将详细介绍如何使用Requests
库进行HTTP请求的处理,以及如何应对各种实际问题,如设置请求头、处理Cookies、设置超时和重试机制等。
第一节:Requests库的使用
1.1 发送GET和POST请求
Requests
库支持多种HTTP请求方式,其中最常用的是GET请求和POST请求。GET请求通常用于获取网页或接口数据,而POST请求则用于向服务器发送数据。掌握这两种请求的使用方式是进行网页抓取的基础。
1.1.1 发送GET请求
GET请求是HTTP协议中最常见的请求方式,用于请求指定的资源或数据。使用Requests
发送GET请求非常简单,只需要调用requests.get()
方法,并传入目标URL。
python">import requests
# 发送GET请求
response = requests.get('https://www.example.com')
# 获取响应内容
print(response.status_code) # 状态码
print(response.text) # 网页内容
注意:
response.status_code
返回HTTP响应的状态码,200
表示请求成功。response.text
返回的是响应的内容,即网页的HTML源代码。
1.1.2 发送POST请求
POST请求用于向服务器提交数据,通常用于表单提交或API数据创建。使用requests.post()
方法可以发送POST请求,常见的请求体格式有JSON、form-data等。
python">import requests
# 准备要发送的数据
data = {
'username': 'myuser',
'password': 'mypassword'
}
# 发送POST请求
response = requests.post('https://www.example.com/login', data=data)
# 获取响应内容
print(response.status_code)
print(response.text)
对于JSON格式的POST请求,可以设置请求头为application/json
,并将数据以JSON格式发送:
python">import requests
import json
# 准备要发送的JSON数据
data = {
'username': 'myuser',
'password': 'mypassword'
}
# 发送POST请求
response = requests.post('https://www.example.com/login', json=data)
print(response.status_code)
print(response.json()) # 返回JSON格式的响应
关键点:
- 使用
data=
发送表单数据(application/x-www-form-urlencoded
)。 - 使用
json=
发送JSON数据(application/json
)。 response.json()
用于解析返回的JSON格式响应,返回Python字典。
1.2 处理Cookies和Headers
在爬虫中,常常需要模拟浏览器行为,这时处理Cookies和Headers是非常重要的。通过设置请求头(Headers)和Cookies,爬虫能够模仿真实用户访问网站的行为,避免被反爬虫机制阻止。
1.2.1 设置请求头(Headers)
请求头是HTTP请求中的一部分,包含了请求的元信息,如User-Agent
、Content-Type
、Authorization
等。正确地设置请求头能够帮助爬虫绕过一些简单的反爬虫措施。
python">import requests
# 设置自定义请求头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
}
# 发送GET请求,带上请求头
response = requests.get('https://www.example.com', headers=headers)
print(response.status_code)
print(response.text)
常见的请求头:
User-Agent
: 用于标识客户端浏览器类型。Accept
: 告诉服务器客户端能接受哪些格式的数据(如application/json
、text/html
等)。Authorization
: 用于认证,通常携带API的访问Token。Referer
: 表示当前请求的来源页面。
1.2.2 处理Cookies
Cookies是服务器在浏览器端存储的小块数据,用于保持会话状态。通过Requests
发送请求时,可以手动传递Cookies,或者在会话中自动管理Cookies。
传递Cookies:
python">import requests
# 设置Cookies
cookies = {
'sessionid': '1234567890abcdef'
}
# 发送GET请求,带上Cookies
response = requests.get('https://www.example.com', cookies=cookies)
print(response.status_code)
print(response.text)
自动处理Cookies: 通过requests.Session()
,Requests
库会自动管理Cookies,包括存储和传递Cookies。
python">import requests
# 创建会话对象
session = requests.Session()
# 发送请求时,自动保存并传递Cookies
response = session.get('https://www.example.com')
print(response.status_code)
print(response.text)
# 关闭会话
session.close()
会话(Session):
- 会话对象
requests.Session()
用于在多个请求之间保持某些参数(如Cookies、Headers)的一致性。 - 可以在同一个会话中发送多个请求,
requests.Session()
会自动管理Cookies,模拟持续的用户会话。
1.3 设置超时和重试机制
在爬虫中,网络请求的超时和重试机制是非常重要的,它能帮助我们确保爬虫在遇到网络波动时不会一直等待,或者避免频繁请求失败导致程序崩溃。
1.3.1 设置请求超时
设置超时可以防止爬虫因为请求阻塞过长时间而无法继续执行。当网络连接过慢或者目标网站响应时间过长时,设置超时是十分必要的。
python">import requests
# 设置超时为5秒
response = requests.get('https://www.example.com', timeout=5)
print(response.status_code)
print(response.text)
超时参数:
timeout
参数接受一个整数或元组(连接时间,响应时间)。例如,timeout=(3, 5)
表示连接超时为3秒,响应超时为5秒。
1.3.2 设置重试机制
爬虫请求有时会因为临时的网络问题或服务器响应过慢而失败。为此,我们可以实现自动重试机制,在请求失败时自动重试。
可以使用requests.adapters.HTTPAdapter
和urllib3
的重试功能来实现重试机制。
python">import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
# 创建一个Session对象
session = requests.Session()
# 配置重试策略
retry = Retry(
total=3, # 最大重试次数
backoff_factor=1, # 重试的延迟时间间隔(每次重试等待时间为backoff_factor * (2 ^ (重试次数 - 1)))
status_forcelist=[500, 502, 503, 504] # 对哪些HTTP状态码进行重试
)
# 配置重试策略到Session
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
# 发送请求
response = session.get('https://www.example.com')
print(response.status_code)
print(response.text)
# 关闭会话
session.close()
重试策略参数:
total
:最大重试次数。backoff_factor
:控制重试间隔时间的因子。status_forcelist
:指定哪些HTTP状态码触发重试,通常500、502、503、504等服务器错误码会触发重试。
1.4 错误处理与异常捕获
在实际开发中,我们还需要处理各种请求可能遇到的异常情况。Requests
库提供了丰富的错误处理机制,可以捕获网络异常、超时异常等。
python">import requests
from requests.exceptions import RequestException, Timeout
try:
response = requests.get('https://www.example.com', timeout=5)
response.raise_for_status() # 如果返回状态码不是200,抛出异常
except Timeout:
print("请求超时")
except RequestException as e:
print(f"请求错误:{e}")
else:
print("请求成功")
print(response.text)
常见异常:
requests.exceptions.Timeout
:请求超时。requests.exceptions.RequestException
:所有Request异常的基类。
小结
通过Requests
库的使用,我们可以轻松地发送GET和POST请求,模拟浏览器请求,管理Cookies和Headers,并处理请求的超时和重试机制。掌握这些技能,可以帮助爬虫开发者更好地与目标网站进行交互,处理复杂的请求和响应,从而提高爬虫的效率和稳定性。在后续章节中,我们将继续深入讨论如何解析和提取网页中的数据,进一步提升爬虫的功能和性能。