【爬虫】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.textresponse.content 就是从这个响应中获取数据的常见的两种不同方式。

requests.text

它是从响应中提取的数据经过解码后的结果,是一个字符串(Unicode 字符串)。这个解码过程通常是根据服务器在 Content-Type 头部信息中提供的字符编码进行的,如果服务器没有明确给出字符编码,requests 库会尝试使用 chardet 库来猜测编码方式,然后将响应数据从字节(bytes)解码为字符串。例如,如果服务器返回的是一个 HTML 页面,你可以直接使用 requests.text 来获取这个页面的文本内容,以便后续使用 BeautifulSoup 或其他文本处理工具进行解析。

response.content

它是服务器返回的原始字节数据,也就是最原始的响应数据,没有经过任何解码处理。这对于处理二进制数据非常有用,例如当你从服务器下载一个文件(如图像文件、音频文件、视频文件、压缩文件等)时,你需要使用 response.content 来获取这些文件的原始字节,以便将其保存到本地或进行其他二进制处理操作。

requests.text和response.content的区别

对比维度requests.textresponse.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 requests

response = 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 requests

response = 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-8
  • response.content.decode("GBK")
  • 常见的编码字符集
    • UTF-8
    • gbk
    • gb2312
    • ascii
    • iso-8859-1

三、自动猜测编码并解码(使用 chardet)

如果不确定服务器的编码方式,可以使用 chardet 库来猜测编码。chardet 可以分析字节数据并尝试确定最可能的编码。以下是一个使用 chardet 的示例:

import requests
import chardet

response = 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)

在这个例子中:

  1. 首先,使用 chardet.detect(response.content)response.content 进行编码检测。
  2. chardet.detect(response.content)['encoding'] 会返回检测到的编码。
  3. 最后,将检测到的编码作为参数传递给 decode 方法对字节数据进行解码。

【完整代码示例】

import requests
import chardet

def 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携带参数字典

  1. 构建请求参数字典
  2. 向接口发送请求的时候带上参数字典,参数字典设置给params

【代码示例】

import requests

url = '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)

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

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

相关文章

蓝桥杯备考:贪心算法之矩阵消除游戏

这道题是牛客上的一道题&#xff0c;它呢和我们之前的排座位游戏非常之相似&#xff0c;但是&#xff0c;排座位问题选择行和列是不会改变元素的值的&#xff0c;这道题呢每每选一行都会把这行或者这列清零&#xff0c;所以我们的策略就是先用二进制把选择所有行的情况全部枚举…

Java网络编程封装

系列文章目录 Java知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、封装的目标&#x1f449;二、套接字层封装&#x1f449;壁纸分享&#x1f449;总结 &#x1f449;前言 Java 网络编程封装原理主要围绕着将底层的网络通信细节隐藏起来&#xff0c;提供简洁…

百度首页上线 DeepSeek 入口,免费使用

大家好&#xff0c;我是小悟。 百度首页正式上线了 DeepSeek 入口&#xff0c;这一重磅消息瞬间在技术圈掀起了惊涛骇浪&#xff0c;各大平台都被刷爆了屏。 百度这次可太给力了&#xff0c;PC 端开放仅 1 小时&#xff0c;就有超千万人涌入体验。这速度&#xff0c;简直比火…

边缘安全加速(Edge Security Acceleration)

边缘安全加速&#xff08;Edge Security Acceleration&#xff0c;简称ESA&#xff09;是一种通过将安全功能与网络边缘紧密结合来提升安全性和加速网络流量的技术。ESA的目标是将安全措施部署到接近用户或设备的地方&#xff0c;通常是在网络的边缘&#xff0c;而不是将所有流…

SpringBoot+Mybatis-Plus实现动态数据源

目录 一、前言二、代码实现1&#xff09;工程结构2&#xff09;相关依赖3&#xff09;数据源拦截切面4&#xff09;动态数据源切换5&#xff09;核心配置类6&#xff09;使用 三、原理分析1&#xff09;mapper接口注入流程2&#xff09;动态数据源切换执行流程 四、声明式事务导…

进程概念、PCB及进程查看

文章目录 一.进程的概念进程控制块&#xff08;PCB&#xff09; 二.进程查看通过指令查看进程通过proc目录查看进程的cwd和exe获取进程pid和ppid通过fork()创建子进程 一.进程的概念 进程是一个运行起来的程序&#xff0c;而程序是存放在磁盘的&#xff0c;cpu要想执行程序的指…

字节火山引擎 DeepSeek 接入本地使用

文章目录 1. 火山引擎 DeepSeek 初体验2. 本地接入 火山引擎 DeepSeek API3. 新建 API KEY4. 直接使用 1. 火山引擎 DeepSeek 初体验 火山引擎官网 : https://www.volcengine.com/product/ark 火山云默认给每个模型赠送 50 万 tokens 推理免费额度 进来就会看到模型广场&#…

基于javaweb的SpringBoot个人博客系统设计和实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

《操作系统 - 清华大学》8 -4:进程管理:进程控制结构

深度剖析进程控制块&#xff1a;操作系统进程管理的核心关键 在操作系统的复杂体系中&#xff0c;进程控制块&#xff08;PCB&#xff09;是实现高效进程管理的关键所在。接下来&#xff0c;将从多个维度深入剖析进程控制块&#xff0c;帮助更好地理解其在操作系统中的重要作用…

Jupyter里面的manim编程学习

1.Jupyterlab的使用 因为我之前一直都是使用的vscode进行manim编程的&#xff0c;但是今天看的这个教程使用的是Jupyter&#xff0c;我也很是好奇这个manim在Jupyter这样的交互式下面会生成怎么样的效果&#xff0c;所以今天尝试了jupyter&#xff0c;并且对于两个进行比较和说…

孜然单授权系统V2.0PHP授权系统

孜然单授权V1.0系统&#xff0c;延续了2022年开发的孜然多应用授权系统V2.0 变更&#xff1a;多应用变单系统&#xff0c;去除没用的垃圾代码&#xff0c;从0开发&#xff0c;去除了一些没用的功能 完善了开发文档&#xff0c;之前那套是我写着玩的屎山代码&#xff0c;V1.0将展…

输入菜单关键字,遍历匹配到 menuIds,展开 匹配节点 的所有父节点以及 匹配节点 本身,高亮 匹配节点

菜单检索&#xff0c;名称、地址、权限标志 等 关键字匹配、展开、高亮(全程借助 DeepSeek ) 便捷简洁的企业官网 的后台菜单管理&#xff0c;图示&#xff1a; 改造点&#xff1a; &#xff08;1&#xff09;修改 bootstrapTreeTable 的节点class命名方式为&#xff1a;treeg…

【落羽的落羽 数据结构篇】顺序结构的二叉树——堆

文章目录 一、堆1. 概念与分类2. 结构与性质3. 入堆4. 出堆 二、堆排序三、堆排序的应用——TOP-K问题 一、堆 1. 概念与分类 上一期我们提到&#xff0c;二叉树的实现既可以用顺序结构&#xff0c;也可以用链式结构。本篇我们来学习顺序结构的二叉树&#xff0c;起个新名字—…

数据结构系列一:初识集合框架+复杂度

前言 数据结构——是相互之间存在一种或多种特定关系的数据元素的集合。数据结构是计算机专业的基础课程&#xff0c;但也是一门不太容易学好的课&#xff0c;它当中有很多费脑子的东西&#xff0c;之后在学习时&#xff0c;你若碰到了困惑或不解的地方 都是很正常的反应&…

Python 入门教程(2)搭建环境 | 2.3、VSCode配置Python开发环境

文章目录 一、VSCode配置Python开发环境1、软件安装2、安装Python插件3、配置Python环境4、包管理5、调试程序 前言 Visual Studio Code&#xff08;简称VSCode&#xff09;以其强大的功能和灵活的扩展性&#xff0c;成为了许多开发者的首选。本文将详细介绍如何在VSCode中配置…

VSCode自定义快捷键和添加自定义快捷键按键到状态栏

VSCode自定义快捷键和添加自定义快捷键按键到状态栏 &#x1f4c4;在VSCode中想实现快捷键方式执行与某些指令操作进行绑定&#xff0c;可以通过配置组合式的键盘按键映射来实现&#xff0c;另外一种方式就是将执行某些特定的指令嵌入在面板菜单上&#xff0c;在想要执行的时候…

Linux系统安装MySQL5.7(其他版本类似)避坑指南

1.远程连接 在Linux系统安装好MySQL5.7数据库&#xff0c;不要以为就大功告成了后面还有大坑等着你踩了。宏哥这里介绍一下远程连接遇到的坑以及如何处理。由于征文要求安装环境教学除外宏哥这里就不介绍在Linux系统安装mysql数据库&#xff0c;有需要的可以自己百度一下。但是…

HybridCLR+Adressable+Springboot热更

本文章会手把手教大家如何搭建HybridCLRAdressableSpringboot热更。 创作不易&#xff0c;动动发财的小手点个赞。 安装华佗 首先我们按照官网的快速上手指南搭建一个简易的项目&#xff1a; 快速上手 | HybridCLR 注意在热更的代码里添加程序集。把用到的工具放到程序集里…

C语言(12)--------->for循环

在C语言中&#xff0c;有三大结构&#xff1a;顺序、选择、循环。这些结构可以用于处理生活中各种各样的复杂问题。选择结构通常是用if语句或者switch语句实现&#xff0c;可参考前面的博客&#xff1a; C语言&#xff08;7&#xff09;------------&#xff1e;if语句CSDN C…

react路由总结

目录 一、脚手架基础语法(16~17) 1.1、hello react 1.2、组件样式隔离(样式模块化) 1.3、react插件 二、React Router v5 2.1、react-router-dom相关API 2.1.1、内置组件 2.1.1.1、BrowserRouter 2.1.1.2、HashRouter 2.1.1.3、Route 2.1.1.4、Redirect 2.1.1.5、L…