爬虫——Requests库的使用

news/2024/11/17 0:00:24 标签: 爬虫, python

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

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

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


http://www.niftyadmin.cn/n/5754741.html

相关文章

【TryHackMe】 Backtrack靶机

now look this!还没更新完,有空就会更新! 目录 端口目录扫描 CVE-2023-39141 我们用openvpn链接,然后进行练习。 端口目录扫描 先扫描一下主机端口,这是我们进攻的入口。 ┌──(root㉿kali)-[~] └─# nmap 10.1…

Web性能优化:从基础到高级

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Web性能优化:从基础到高级 Web性能优化:从基础到高级 Web性能优化:从基础到高级 引言 基础优…

【星海随笔】ZooKeeper-Mesos

开源的由 Twitter 与 伯克利分校的 Mesos 项目组共同研发设计。 两极调度架构 支持高可用集群,通过ZooKeeper进行选举。 Mesos master 管理着所有的 Mesos slave 守护进程 每个slave运行具体的任务或者服务。 Franework 包括的调度器和执行机两部分 执行器运行在Me…

集群搭建高可用

contos7.9 部署3节点 hadoop3.4 高可用集群 contos7.9 部署3节点 hadoop3.4 高可用集群环境信息Hadoop与Zookeeper的版本对应关系服务器角色分配使用端口服务器配置配置免密登录服务器配置初始化 init_server.sh配置主机名映射所有节点配置 hosts文件 hadoop 安装环境配置下载安…

redis7.x源码分析:(2) adlist双向链表

链表是一种常用的数据结构(如果不了解,请先学习数据结构),由于c语言本身没有实现标准的链表库,所以redis自己实现了一个双向链表。 双向链表在redis内部的使用非常的多,几乎所有模块中都有用到。 下面看下它…

Win10下使用Anaconda安装GPU版本PyTorch

PyTorch是一个开源机器学习框架,最初来自Meta Ai。如果你想研究人工智能或从事人工智能项目方面的工作,那么在本地机器上使用PyTorch设置开发环境对于许多项目来说都是必不可少的。GPU(图形处理单元)是一种专用处理器,…

关于adb shell登录开发板后terminal显示不完整

现象 今天有个同事跟我说,adb shell 登录开发板后,终端显示不完整,超出边界后就会出现奇怪的问题,比如字符覆盖显示等。如下图所示。 正常情况下应该如下图所示: 很明显,第一张图的显示区域只有完整区域…

前端知识点---构造函数(javascript)

文章目录 前端知识点---构造函数(Javascript)1. 定义构造函数2. 使用构造函数创建对象3. 工作原理4. 构造函数与原型5. 类的语法糖6. 注意事项 前端知识点—构造函数(Javascript) 在我的文章 “对象” 里我提到了构造函数 , 前端知识点—Javascript的对象(Javascript) 因为day…