【爬虫】request库
文章目录
- 发送请求
- 响应对象
- 响应数据的方式
- 中文乱码问题
- 响应对象的其他属性或方法
- 发送带参数的请求
- headers和查询参数
Requests——发送http请求,获取响应数据
首先,请确保:
- 已安装 Requests
- Requests 是最新的
让我们从一些简单的示例开始。
发送请求
使用 Requests 发出请求非常简单。
需求:通过requests想百度首页发送请求,获取该页面的源码
运行下面的代码,观察打印出的结果
#首先导入Requests模块:
import requests
# 目标url
url = 'https://www.baidu.com'
# 向目标url发送get请求
response = requests.get(url)
# 打印响应内容
print(response.text)
其他HTTP类型呢:PUT,DELETE,HEAD?这些都是同样的:
response = requests.post(url,data = {'key' : 'value'})
response = requests.put(url,data = {'key' : 'value'})
response = requests.delete(url)
response = requests.head(url)
response = requests.options(url)
这一切都很好,但这也只是 Requests 可以做到的开始 !
响应对象
响应数据的方式
当你使用 requests 库发送一个请求(例如 requests.get() 或 requests.post() 等)时,服务器会返回一个响应。这个响应包含了很多信息,而 requests.text 和 response.content 就是从这个响应中获取数据的常见的两种不同方式。
requests.text:
它是从响应中提取的数据经过解码后的结果,是一个字符串(Unicode 字符串)。这个解码过程通常是根据服务器在 Content-Type 头部信息中提供的字符编码进行的,如果服务器没有明确给出字符编码,requests 库会尝试使用 chardet 库来猜测编码方式,然后将响应数据从字节(bytes)解码为字符串。例如,如果服务器返回的是一个 HTML 页面,你可以直接使用 requests.text 来获取这个页面的文本内容,以便后续使用 BeautifulSoup 或其他文本处理工具进行解析。
response.content:
它是服务器返回的原始字节数据,也就是最原始的响应数据,没有经过任何解码处理。这对于处理二进制数据非常有用,例如当你从服务器下载一个文件(如图像文件、音频文件、视频文件、压缩文件等)时,你需要使用 response.content 来获取这些文件的原始字节,以便将其保存到本地或进行其他二进制处理操作。
requests.text和response.content的区别
| 对比维度 | requests.text | response.content |
|---|---|---|
| 数据类型 | 解码后的 Unicode 字符串 | 原始字节数据(bytes 类型) |
| 编码处理 | 根据 HTTP 头部字符编码信息(或 chardet 模块猜测)自动解码 | 不进行编码解码,直接返回原始字节 |
| 适用场景 | 处理文本数据,如解析 HTML、JSON、XML 等 | 处理二进制数据,如图片、视频、音频、压缩文件等 |
| 获取方式 | 直接获取解码后的文本内容 | 获取原始字节内容,需手动解码(若为文本) |
| 应用示例 | 使用 BeautifulSoup 解析 HTML 网页:soup = BeautifulSoup(response.text, ‘html.parser’) | 保存图片到本地:with open(‘image.png’, ‘wb’) as f: f.write(response.content) |
【代码示例】
import requests# 发送请求
response = requests.get('https://example.com')# 使用 requests.text 获取解码后的文本数据
text_data = response.text
print("Text Data:", text_data[:100]) # 打印前 100 个字符的文本内容# 使用 response.content 获取原始字节数据
content_data = response.content
print("Content Data:", content_data[:100]) # 打印前 100 个字节的数据'''运行结果:
Text Data: <!doctype html>
<html>
<head><title>Example Domain</title><meta charset="utf-8" /><m
Content Data: b'<!doctype html>\n<html>\n<head>\n <title>Example Domain</title>\n\n <meta charset="utf-8" />\n <m'
'''
中文乱码问题
当你使用 requests 库发送请求并接收到服务器的响应时,response.content 是以字节(bytes)形式存储的数据。如果该数据包含中文字符,而你直接使用 response.content 查看或处理这些数据,可能会出现中文乱码的情况。这是因为你需要将字节数据按照正确的编码方式解码为字符串,这样才能正确显示中文。以下是解决中文乱码问题的具体步骤:
一、检查服务器响应的编码方式
首先,你可以查看服务器响应的 Content-Type 头部信息,其中可能包含了编码信息。你可以通过 response.encoding 或者 response.headers.get('Content-Type') 来获取这些信息。例如:
import requestsresponse = requests.get('https://example.com')
print("服务器响应的编码方式(通过 encoding 属性):", response.encoding)
print("服务器响应的编码方式(通过 headers):", response.headers.get('Content-Type'))'''运行结果:
服务器响应的编码方式(通过 encoding 属性): ISO-8859-1
服务器响应的编码方式(通过 headers): text/html
'''
通过上述代码,你可以获取服务器声明的编码方式。然而,有时候服务器可能没有正确声明编码,或者声明的编码与实际的编码不符,这时就需要手动指定编码进行解码。
二、使用 decode 方法进行解码
你可以使用 response.content.decode() 方法对字节数据进行解码。如果你知道服务器使用的正确编码方式,就可以直接将其作为参数传递给 decode 方法。例如,如果服务器使用的是 utf-8 编码:
import requestsresponse = requests.get('https://example.com')
decoded_content = response.content.decode('utf-8')
print(decoded_content)
在这个例子中,response.content.decode('utf-8') 会将字节数据按照 utf-8 编码方式解码为字符串,这样就能正确显示中文。
通过对response.content进行decode,来解决中文乱码
response.content.decode()默认UTF-8response.content.decode("GBK")- 常见的编码字符集
- UTF-8
- gbk
- gb2312
- ascii
- iso-8859-1
三、自动猜测编码并解码(使用 chardet)
如果不确定服务器的编码方式,可以使用 chardet 库来猜测编码。chardet 可以分析字节数据并尝试确定最可能的编码。以下是一个使用 chardet 的示例:
import requests
import chardetresponse = requests.get('https://example.com')
# 使用 chardet 检测编码
detected_encoding = chardet.detect(response.content)['encoding']
print("检测到的编码:", detected_encoding)
# 按照检测到的编码进行解码
decoded_content = response.content.decode(detected_encoding)
print(decoded_content)
在这个例子中:
- 首先,使用
chardet.detect(response.content)对response.content进行编码检测。 chardet.detect(response.content)['encoding']会返回检测到的编码。- 最后,将检测到的编码作为参数传递给
decode方法对字节数据进行解码。
【完整代码示例】
import requests
import chardetdef get_decoded_content(url):response = requests.get(url)try:# 尝试使用服务器声明的编码进行解码decoded_content = response.content.decode(response.encoding)except UnicodeDecodeError:# 若解码失败,使用 chardet 猜测编码detected_encoding = chardet.detect(response.content)['encoding']decoded_content = response.content.decode(detected_encoding)return decoded_content# 示例使用
url = 'https://example.com'
decoded_content = get_decoded_content(url)
print(decoded_content)
响应对象的其他属性或方法
除了text和status_code以外,response响应对象还有其他常用的属性或方法
| 属性或方法 | 说明 |
|---|---|
| response.url | 响应的url,有时候响应的url和请求的url并不一致 |
| response.status_code | 响应状态码 |
| response.request.headers | 响应对应的请求头 |
| response.headers | 响应头 |
| response.request._cookies | 响应对应请求的cookie,返回cookieJar类型 |
| response.cookies | 响应的cookie(经过了set-cookie动作,返回cookieJar类型) |
| response.json() | 自动将json字符串类型的响应内容转换为python对象(dict/list) |
【代码示例】
import requests
# response = requests.get('https://example.com')
# print(response.status_code)
# print(response.headers) # 可以查看响应的头部信息
# print(response.headers.get('Content-Type')) # 可以获取具体的 Content-Type 信息,对于后续处理不同类型的响应内容很有用
# print(response.encoding) # 提供编码信息,有时可能不准确
# print(response.cookies) # 可以查看服务器返回的 Cookie 信息response = requests.get('https://api.example.com/data')
data = response.json()
print(data) # 将响应内容解析为 JSON 格式
发送带参数的请求
我们在使用百度的时候经常发现url地址中会有一个
?,那么该问号后边的就是请求参数,又叫做查询字符串
headers和查询参数
如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。
(一)在url携带参数
直接对含有参数的url发起请求
url = 'http://www.baidu.com/s?wd=长城'
response = requests.get(url, headers = headers)
(二)通过params携带参数字典
- 构建请求参数字典
- 向接口发送请求的时候带上参数字典,参数字典设置给params
【代码示例】
import requestsurl = 'http://www.baidu.com/s?'
# 添加请求头,进一步伪装浏览器
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# 构建参数字典
kw = {'wd':'长城'
}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s?", params = kw, headers = headers)# 查看响应内容,response.text 返回的是Unicode格式的数据
print (response.text)# 查看响应内容,response.content返回的字节流数据
print (respones.content)# 查看完整url地址
print (response.url)# 查看响应头部字符编码
print (response.encoding)# 查看响应码
print (response.status_code)
相关文章:
【爬虫】request库
文章目录 发送请求响应对象响应数据的方式中文乱码问题响应对象的其他属性或方法 发送带参数的请求headers和查询参数 Requests——发送http请求,获取响应数据 首先,请确保: 已安装 RequestsRequests 是最新的 让我们从一些简单的示例开始…...
ES的简单讲解
功能 : 文档存储 与 文档搜索 特点:比如有一个文档名 “你好” 可以用‘你‘,好,你好都可以搜索到这个文档 ES核心概念 类似于数据库中表的概念,在表的概念下又对数据集合进行了细分 ES_Client查询接口 cpr::R…...
进程间通信(一)
1.进程间通信介绍 数组传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源 通知事件:一个进程需要向另一个或者一组进程发送信息,通知发送了某种事件(如进程终止时要通知父进程) 进程控制&…...
人工智能中的特征是什么?
什么是人工智能中的特征? 在人工智能中,特征(feature)是指从原始数据中提取出的、能够代表数据关键信息并用于模型训练的属性或变量。特征通常是对原始数据的抽象或转换,目的是捕捉数据中的模式、结构或相关性&#x…...
MongoDB私人学习笔记
俗话说“好记性不如烂笔头”,编程的海洋如此的浩大,养成做笔记的习惯是成功的一步! 此笔记主要是ZooKeeper3.4.9版本的笔记,并且笔记都是博主自己一字一字编写和记录,有错误的地方欢迎大家指正。 一、基础知识…...
大数据SQL调优专题——调优切入
引入 我们都知道大数据的SQL优化,并非一蹴而就的简单任务,而是一个涉及多个环节的复杂过程。从需求提出到最终交付,任何一个环节的微小偏差都可能影响最终成果。 虽然我们的专栏名字叫大数据SQL调优,但是实际调优并不是简单对SQ…...
Idea java项目结构介绍
一般来说,一个典型的 IntelliJ IDEA Java 项目具有特定的结构,以下是对其主要部分的介绍: 项目根目录 项目的最顶层目录,包含了整个项目的所有文件和文件夹,通常以项目名称命名。在这个目录下可以找到.idea文件夹、.g…...
adb的安装
1、概念 (1)adb(android debug bridge)安卓调试桥,用于完成电脑和手机之间的通信控制。 (2)xcode来完成对于ios设备的操控,前提是有个mac电脑。 2、adb的安装 (1&…...
React + TypeScript 数据模型驱动数据字典生成示例
React TypeScript 数据模型驱动数据字典生成示例 引言:数据字典的工程价值 在现代化全栈开发中,数据字典作为业务实体与数据存储的映射桥梁,直接影响系统可维护性与团队协作效率。传统手动维护字典的方式存在同步成本高和版本管理混乱两大痛…...
Nginx 平滑升级/回滚
平滑升级和回滚的前提条件是 nginx 已经安装好,源码安装 nginx 可参考上一篇文章。在上一篇文章的基础上,nginx 已安装好且已启动,目前是 1.24 版本。 一、平滑升级 Nginx 的平滑升级(热升级)是一种 不中断服务 即可更…...
强化学习演进:GRPO 从何而来
强化学习(Reinforcement Learning, RL)是机器学习的一个分支,其核心是让智能体(Agent)通过与环境(Environment)的交互,学习如何采取最优行动(Action)以最大化…...
Uniapp 小程序复制、粘贴功能实现
在开发 Uniapp 小程序的过程中,复制和粘贴功能是非常实用且常见的交互需求。今天,我就来和大家详细分享如何在 Uniapp 中实现这两个功能。 复制功能:uni.setClipboardData方法 goResult() {uni.setClipboardData({data: this.copyContent, /…...
AOP进阶-02.通知顺序
一.通知顺序 当有多个切面类中的切入点表达式一样时,这些切面类的执行顺序是怎样的呢?如图我们将定义两个切面类,一个MyAspect2,一个MyAspect3,一个MyAspect4。执行后我们发现, 对于目标方法前的通知方法&…...
Node.js 中 fs 模块的高级用法
目录 1. 流式文件处理 示例:大文件复制 2. 文件监控 示例:使用 fs.watch 监控文件变化 3. 异步递归操作 示例:异步递归遍历目录 4. 文件权限管理 示例:修改文件权限 5. 原子操作 示例:原子重命名文件 在 Nod…...
深入探讨K8s资源管理和性能优化
#作者:曹付江 文章目录 前言:1.监控 Kubernetes 集群的资源利用率1.1 Prometheus1.2 Kubernetes 度量服务器1.3 Grafana1.4 自定义指标 2. 识别资源瓶颈2.1. 监控工具2.2. 性能剖析2.3 Kubernetes 事件和日志2.4. 群集自动扩展2.5. 负载测试…...
Buildroot 添加自定义模块-内置文件到文件系统
目录 概述实现步骤1. 创建包目录和文件结构2. 配置 Config.in3. 定义 cp_bin_files.mk4. 添加源文件install.shmy.conf 5. 配置与编译 概述 Buildroot 是一个高度可定制和模块化的嵌入式 Linux 构建系统,适用于从简单到复杂的各种嵌入式项目. buildroot的源码中bui…...
对话式AI引擎:DeepSeek技术引领多模态交互新篇章
摘要 DeepSeek技术公司推出了一项创新服务——“对话式AI引擎”,仅需两行代码即可激活任意大型AI模型的语音对话功能。这项技术使得文本型AI模型迅速转变为具备实时语音对话能力的多模态交互模型,解决了大型AI模型在语音交互方面的不足,为AI行…...
形式化数学编程在AI医疗中的探索路径分析
一、引言 1.1 研究背景与意义 在数字化时代,形式化数学编程和 AI 形式化医疗作为前沿领域,正逐渐改变着我们的生活和医疗模式。形式化数学编程是一种运用数学逻辑和严格的形式化语言来描述和验证程序的技术,它通过数学的精确性和逻辑性,确保程序的正确性和可靠性。在软件…...
HTML——前端基础1
目录 前端概述 前端能做的事情编辑 两步完成一个网页程序 前端工具的选择与安装 HTML HTML5介绍 HTML5的DOCTYPE声明 HTML基本骨架 文字标签 标题之标签 标签之段落、换行、水平线 标签之图片 标签之超文本链接 标签之文本 列表标签之有序列表 列表标签之无序…...
Blueprint —— Events
目录 一,Event Level Reset 二,Event Actor Begin Overlap 三,Event Actor End Overlap 四,Event Hit 五,Event Any Damage 六,Event Point Damage 七,Event Radial Damage 八ÿ…...
Java一揽子集合整理
Java 集合框架 List ArrayList,底层Object数组,相关方法add,remove Vector,底层Object数组,线程安全,使用 synchronized 关键字进行同步处理 Stack,继承自Vector,是一个后进先出的…...
第二十四:5.2【搭建 pinia 环境】axios 异步调用数据
第一步安装:npm install pinia 第二步:操作src/main.ts 改变里面的值的信息: <div class"count"><h2>当前求和为:{{ sum }}</h2><select v-model.number"n"> // .number 这里是…...
dubbo转http方式调用
业务背景:在当前项目下,所有前端请求均通过外层网关转发到后端这边的dubbo服务,现计划去掉网关层,由前端直接http调用后端dubbo。 解决方案:在前端调用方式不变的前提下,后端服务新建controller层…...
HybridCLR+Adressable+Springboot热更
本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易,动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目: 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…...
金融行业专题|某基金公司基于超融合信创平台支持人大金仓数据库的性能评测
随着“自主可控”在 IT 基础设施领域不断深化,数据库的国产化替代也被很多金融机构提上日程。为了保证性能,大部分国产数据库都基于信创架构的裸金属服务器部署。在国产虚拟化/超融合平台上,国产数据库性能表现如何?尤其是搭配信创…...
父组件用的是原生监听,子组件用的是onClick,子组件添加了stopPropagation还是没有阻止传播
父组件用事件监听,子组件用onClick,即使子组件加了stopPropagation还是没有阻止冒泡。父组件可能使用原生的addEventListener来绑定事件,而子组件用的是React的onClick事件。这时候,虽然子组件调用了e.stopPropagation()ÿ…...
【问题解决方案】随笔 - vscode里面出现双环境解决方案
1.问题重述 (.venv) (base) 2.解决方案 看是conda还是venv环境,先给退出了 1.conda 比如Anaconda 的 (base) 环境,使用 conda deactivate2.venv deactivate然后重新激活环境即可 END...
什么是 Java 中的线程安全?
回答 Java 中的线程安全(Thread Safety)指的是在多线程环境下,当多个线程同时访问和操作共享资源(如对象、变量、数据结构等)时,能够保证程序的正确性,不会出现数据不一致、竞争条件࿰…...
【2025全网最新最全】前端Vue3框架的搭建及工程目录详解
文章目录 安装软件Node.js搭建Vue工程创建Vue工程精简Vue项目文件 Vue工程目录的解读网页标题的设置设置全局样式路由配置 安装软件Node.js 下载地址:https://nodejs.org/zh-cn/ 安装完成后,打开cmd,查看环境是否准备好 node -v npm -vnpm使用之前一定…...
大白话JavaScript闭包在实际项目中有哪些应用场景?
大白话JavaScript闭包在实际项目中有哪些应用场景? 闭包是指有权访问另一个函数作用域中的变量的函数。在实际项目中,闭包有很多应用场景,以下是一些常见的例子: 数据封装和隐私保护 场景:在开发中,有时…...
