自学内容网 自学内容网

爬虫——Requests库的使用

在爬虫开发中,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。

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等。

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格式发送:

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-AgentContent-TypeAuthorization等。正确地设置请求头能够帮助爬虫绕过一些简单的反爬虫措施。

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/jsontext/html等)。
  • Authorization: 用于认证,通常携带API的访问Token。
  • Referer: 表示当前请求的来源页面。
1.2.2 处理Cookies

Cookies是服务器在浏览器端存储的小块数据,用于保持会话状态。通过Requests发送请求时,可以手动传递Cookies,或者在会话中自动管理Cookies。

传递Cookies

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。

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 设置请求超时

设置超时可以防止爬虫因为请求阻塞过长时间而无法继续执行。当网络连接过慢或者目标网站响应时间过长时,设置超时是十分必要的。

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.HTTPAdapterurllib3的重试功能来实现重试机制。

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库提供了丰富的错误处理机制,可以捕获网络异常、超时异常等。

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,并处理请求的超时和重试机制。掌握这些技能,可以帮助爬虫开发者更好地与目标网站进行交互,处理复杂的请求和响应,从而提高爬虫的效率和稳定性。在后续章节中,我们将继续深入讨论如何解析和提取网页中的数据,进一步提升爬虫的功能和性能。


原文地址:https://blog.csdn.net/u012263104/article/details/143788464

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!