python爬虫 - 初识requests模块

  🌈个人主页:https://blog.csdn.net/2401_86688088?type=blog
🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html

前言

requests 是一个用于发送 HTTP 请求的 Python 库,设计简单且功能强大,能够轻松实现与 Web 服务器的交互。相比于 Python 内置的 urllib 模块,requests 更加简洁且易于使用,允许开发者快速构建 HTTP 请求,处理响应数据,并支持复杂的功能,如会话处理、文件上传、参数传递等。


一、主要功能和特点

requests 库的主要特点包括:

  1. 易于使用:通过简单的 API 来实现常见的 HTTP 操作,如 GETPOSTPUTDELETE 等。

  2. 自动处理编码和解码:自动检测和解码响应的字符编码。

  3. 支持会话:可以在多次请求中保持会话状态,如处理 cookies。

  4. 简单的 JSON 处理:轻松解析和生成 JSON 数据。

  5. 文件上传与下载:支持文件流的上传与下载操作。

  6. 支持 SSL、代理和超时:方便配置 SSL 证书、代理服务器,以及设置请求的超时时间。

二、安装requests库

安装 requests 库非常简单,可以通过 pip 来安装。

(一)使用 pip 安装

打开命令行或终端,输入以下命令即可安装 requests

pip install requests

(二)检查安装是否成功

安装完成后,可以在 Python 环境中导入 requests 模块,检查是否成功安装:

import requests

print(requests.__version__)  # 输出 requests 的版本号

如果没有报错且成功输出版本号,说明 requests 库已成功安装并可以使用。

(三)版本管理

在安装时,如果想指定安装某个版本,可以通过以下命令:

pip install requests==2.25.1  # 安装特定版本

如果想更新到最新版本,可以使用以下命令:

pip install --upgrade requests

三、发起网络请求

在 Python 中使用 requests 模块可以轻松发送网络请求,并通过丰富的属性来处理请求和响应。

(一)发送 GET 请求

GET 请求用于从服务器获取数据,是最常见的 HTTP 请求方法。使用 requests.get() 发送请求非常简单:

import requests

response = requests.get('https://jsonplaceholder.typicode.com/posts/1')
print(response.text)  # 输出响应内容

(二)发送 POST 请求

POST 请求用于向服务器提交数据,如表单或 JSON 数据。你可以通过 requests.post() 发送 POST 请求:

import requests

url = 'https://jsonplaceholder.typicode.com/posts'
data = {'title': 'foo', 'body': 'bar', 'userId': 1}

response = requests.post(url, json=data)
print(response.json())  # 输出 JSON 格式的响应内容

(三)发送带参数的 GET 请求

在 URL 中添加查询参数时,可以通过 params 参数传递:

params = {'userId': 1}
response = requests.get('https://jsonplaceholder.typicode.com/posts', params=params)
print(response.url)  # 输出构造好的请求URL

(四)发送带请求头的请求

如果需要定制请求头(如模拟浏览器请求),可以通过 headers 参数来设置:

headers = {'User-Agent': 'Mozilla/5.0'}
response = requests.get('https://jsonplaceholder.typicode.com/posts/1', headers=headers)
print(response.text)

四、requests库常用属性

requests 的响应对象包含了许多有用的属性,帮助开发者处理和分析 HTTP 响应。

(一)response.status_code

该属性返回 HTTP 状态码,表示请求的结果。例如,200 表示请求成功,404 表示页面未找到。

print(response.status_code)  # 输出状态码,如200

(二)response.text

返回服务器响应的文本内容。通常用于处理 HTML、纯文本格式的响应。

print(response.text)  # 输出响应的文本内容

(三)response.json()

如果服务器响应的数据是 JSON 格式,response.json() 可以将其解析为 Python 字典或列表。

print(response.json())  # 解析并输出 JSON 数据

(四)response.content

返回响应的二进制数据。适合用于下载图片、视频等非文本数据。

response = requests.get('https://example.com/image.png')
with open('image.png', 'wb') as f:
    f.write(response.content)  # 下载并保存图片

(五)response.headers

返回响应的头部信息,类型为字典,可以用来获取服务器返回的元数据。

print(response.headers)  # 输出响应头

(六)response.url

返回发送请求时的完整 URL,适合用于调试请求路径是否正确。

print(response.url)  # 输出请求的 URL

(七)response.cookies

返回服务器在响应中设置的 cookies。通常用于会话管理或模拟浏览器行为。

print(response.cookies)  # 输出响应中的 cookies

(八)response.history

如果请求被重定向(如 301、302),response.history 会保存重定向前的响应信息,类型为列表。

print(response.history)  # 如果有重定向,会输出重定向的历史

(九)response.encoding

用于获取或设置响应的编码方式。如果响应的文本编码不正确,可以手动设置:

response.encoding = 'utf-8'
print(response.text)

五、text与content方法的区别

requests 库中的 textcontent 方法都是用于获取 HTTP 响应内容的属性,但它们之间存在一些关键区别。了解这些差异可以帮助你根据不同的需求选择合适的方式来处理响应内容。

(一)response.text

  • 返回值text 属性返回的是一个 字符串(str) 类型,它会根据响应内容的编码自动解码为文本。

  • 编码处理requests 库会根据 Content-Type 头中的字符集(如 utf-8ISO-8859-1 等)自动进行编码解析。如果服务器未明确指定编码,requests 会尝试根据响应内容进行推断,但这可能不总是准确。

  • 适用场景text 属性适用于处理已经是文本数据的内容,例如 HTML、JSON、XML 或纯文本。

示例:

import requests

response = requests.get('https://example.com')
print(response.text)  # 返回的内容是经过解码的字符串

如果编码推断不正确,你可以手动设置编码:

response.encoding = 'utf-8'
print(response.text)

(二)response.content

  • 返回值content 属性返回的是 原始的二进制数据(bytes),它不会对数据进行解码。无论响应的编码是什么,content 都会以字节流的方式原样返回。

  • 适用场景content 适合用于处理 非文本数据,如图片、视频、音频、PDF 文件等,或需要以二进制方式处理的内容。它确保你能获取到响应的原始数据而不被编码影响。

示例:

import requests

response = requests.get('https://example.com/image.jpg')
with open('image.jpg', 'wb') as f:
    f.write(response.content)  # 将二进制数据写入文件

(三)区别总结

  • text 返回的是经过解码的字符串,它依赖于响应的编码,因此适用于需要处理文本内容的场景(如 HTML、JSON、XML)。

  • content 返回的是原始的二进制数据,不会自动进行编码转换,适合处理二进制文件或需要保存原始响应内容的场景。

举例:

假设我们有一个请求,它返回的是一个带有 utf-8 编码的 HTML 页面:

import requests

response = requests.get('https://example.com')

# 通过 .text 获取解码后的文本
print(response.text)  # 这是一个已解码的字符串

# 通过 .content 获取原始的字节数据
print(response.content)  # 这是一个字节流

使用 text 时,返回的内容是解码后的文本字符串,而 content 返回的则是页面的原始字节数据。如果你打算处理图像、音频或其他二进制数据,应使用 content;而如果你处理的是网页文本或 JSON 数据,应使用 text

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887838.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何创建虚拟环境并实现目标检测及验证能否GPU加速

创建虚拟环境: 先创建一个虚拟python环境,敲如下代码 然后再到该虚拟环境里面安装自己想要的包 激活虚拟环境 然后再聚类训练这些 验证GPU加速 阿里源 pip install torch torchvision -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mir…

B树系列解析

我最近开了几个专栏,诚信互三! > |||《算法专栏》::刷题教程来自网站《代码随想录》。||| > |||《C专栏》::记录我学习C的经历,看完你一定会有收获。||| > |||《Linux专栏》&#xff1…

YOLO11改进|卷积篇|引入线性可变形卷积LDConv

目录 一、【LDConv】卷积1.1【LDConv】卷积介绍1.2【LDConv】核心代码 二、添加【LDConv】卷积2.1STEP12.2STEP22.3STEP32.4STEP4 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【LDConv】卷积 1.1【LDConv】卷积介绍 下图是【LDCNV】的结构图,让我们简单分析…

鸿蒙HarmonyOS开发生态

1、官网 华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态 2、开发工具IDE下载及使用 https://developer.huawei.com/consumer/cn/ 3、使用帮助文档 4、发布到华为应用商店 文档中心

多模态大语言模型(MLLM)-Blip2深度解读

前言 Blip2是一个多模态大语言模型,因其提出时间较早(2023年),且效果较好,很快成为一个标杆性工作。Blip2中提出的Q-former也成为衔接多模态和文本的重要桥梁。 Blip2发表时间是2023年,现在引用已经3288了…

事件抽取(Event Extraction, EE)

一、引言 事件抽取(Event Extraction, EE)是信息抽取领域中的一个重要任务,旨在从非结构化文本中识别和抽取事件相关的信息。事件抽取通常包括识别事件触发词、事件类型以及事件中的参与者、时间、地点等元素,最终将这些信息结构…

常见的基础系统

权限管理系统支付系统搜索系统报表系统API网关系统待定。。。 Java 优质开源系统设计项目 来源:Java 优质开源系统设计项目 | JavaGuide 备注:github和gitee上可以搜索到相关项目

【含文档】基于Springboot+Android的房屋租赁App(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

【JavaEE】【多线程】进程与线程的概念

目录 进程系统管理进程系统操作进程进程控制块PCB关键属性cpu对进程的操作进程调度 线程线程与进程线程资源分配线程调度 线程与进程区别线程简单操作代码创建线程查看线程 进程 进程是操作系统对一个正在运行的程序的一种抽象,可以把进程看做程序的一次运行过程&a…

IMS添加实体按键流程 - Android14

IMS添加实体按键流程 - Android14 1、实体按键信息(Mi 9 左侧实体按键)2、硬件添加2.1 内核添加设备节点2.2 Generic.kl映射文件2.3 映射文件文件加载loadKeyMapLocked2.4 addDeviceLocked 添加设备相关对象 3、keycode对应scankode4、KeyEvent.java 添加…

京东云主机怎么用?使用京东云服务器建网站(图文教程)

京东云主机怎么用?非常简单,本文京东云服务器网jdyfwq.com使用以使用京东云服务器搭建WordPress博客网站为例,来详细说下京东云主机的使用方法。使用京东云服务器快速搭建WordPress网站教程,3分钟基于应用镜像一键搞定&#xff0c…

python之详解字符串

由字符组成的序列,可以用单引号或双引号括起来。 1、通过下标获取字符串的字符 1.1、获取单个字符 若要获取字符串中某一个字符,可以通过 字符串名[index] 索引下标的方式获取。 索引的初始值为0,最大值为字符串长度-1。 切记&#xff0…

一、图解C#教程

一、堆和栈 程序运行时,数据存储在内存中。 使用堆和栈来存储数据 1、栈 栈是一个内存数组,先进后出原则。 可以存储:某些类型变量的值;程序当前执行环境;传递给方法的参数; 入栈:把数据放…

自动驾驶-问题笔记-待解决

参考线的平滑方法 参考线平滑算法主要有三种: 离散点平滑;螺旋曲线平滑;多项式平滑; 参考链接:参考线平滑 对于平滑方法,一直不太理解平滑、拟合以及滤波三者的作用与区别; 规划的起点&#x…

计算机网络——email

pop3拉出来 超出ASCII码范围就不让传了 这样就可以传更大的文件

Ubuntu 安装 Docker Compose

安装Docker Compose # 删除现有的 docker-compose(如果存在) sudo rm -f /usr/local/bin/docker-compose ​ # 下载最新的 docker-compose 二进制文件 sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-…

JavaScript for循环语句

for循环 循环语句用于重复执行某个操作,for语句就是循环命令,可以指定循环的起点、终点和终止条件。它的格式如下 for(初始化表达式;条件;迭代因子){语句} for语句后面的括号里面,有三个表达式 初始化表达式(initialize):确定循环变量的初始…

[C语言]指针和数组

目录 1.数组的地址 2.通过指针访问数组 3.数组和指针的不同点 4.指针数组 1.数组的地址 数组的地址是什么&#xff1f; 看下面一组代码 #include <stdio.h> int main() { int arr[5] {5,4,3,2,1}; printf("&arr[0] %p\n", &arr[0]); printf(&qu…

LeetCode讲解篇之139. 单词拆分

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 我们使用一个数组记录字符串s在[0, i)区间能否使用wordDict组成 我们使用左右指针遍历字符串s的子串&#xff0c;左指针 j 为子串的左端点下标&#xff0c;右指针 i 为右端点下标的下一个 遍历过程中如果字符串s…

自然语言处理问答系统

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…