Python3爬虫学习——requests库笔记

2023-11-17

Python3爬虫学习——requests库笔记

前言

本笔记用于记录整理requests库的一些基本知识,内容会根据博主自己的认知作增添或压缩。

其实自己看了下之前写的urllib库笔记,觉得那么写万字长文并不妥当,没有起到快速查阅的笔记作用,所以这次做了点改变。

另外就是requests库的官方文档的中文味儿太冲了,比如

Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。

警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。

看吧,这就是 Requests 的威力:…………

Requests 允许你发送纯天然,植物饲养的 HTTP/1.1 请求,无需手工劳动。你不需要手动为 URL 添加查询字串,也不需要对 POST 数据进行表单编码。Keep-alive 和 HTTP 连接池的功能是 100% 自动化的,一切动力都来自于根植在 Requests 内部的 urllib。

所以我参考的是英文版,如有不妥请不吝赐教。


requests安装

requests不是python内置库,安装指令:pip3 install requests

requests对象

需要在python调用requests库内容,首先需要导入:import requests

requests可以非常方便地用一些请求方式:

r = requests.head(url, **kwargs)
r = requests.get(url, params=None, **kwargs)
r = requests.post(url, data=None, json=None, **kwargs)
r = requests.put(url, data=None, **kwargs)
r = requests.patch(url, data=None, **kwargs)
r = requests.delete(url, **kwargs)

创建的对象rrequests.models.Response对象,即Response(响应)对象。

url参数是需要请求的连接。

*args参数是一些附加的参数,不是必须的参数。下面是一些常见的参数的简介:

**kwargs 作用及传入方法 可以接受的传入
params 常用于GET请求中URL附带的[?query]参数 字典或字节
headers 用于添加请求头的参数 字典
data 常用于POST请求中需要上传的表单数据 字典或元组列表、字节以及文件
json 上传json格式的数据 字典
files 用于上传文件的POST请求 字典
cookies 用于上传Cookie CookieJar对象
timeout 超时设置 单个数字(浮点)或两个值的元组
auth 用于身份认证登录 两个字符串构成元组
verify 控制是否启用SSL证书验证 布尔值,默认为True,即允许
proxies 用于设定代理 字典,键为协议,值为地址
allow_redirects 是否允许重定向 布尔值,默认为True,即允许
cert 指定本地证书用作客户端证书 字符串元组(‘.crt’,‘.key’)

补充说明

字节类型(byte类型)

字节类型数据要用bytes()方法将字符串转化为字节。语法如下:

class bytes([source[, encoding[, errors]]])

  • 如果 source 为整数,则返回一个长度为 source 的初始化数组;
  • 如果 source 为字符串,则按照指定的 encoding 将字符串转换为字节序列;
  • 如果 source 为可迭代类型,则元素必须为[0 ,255] 中的整数;
  • 如果 source 为与 buffer 接口一致的对象,则此对象也可以被用于初始化 bytearray。
  • 如果没有输入任何参数,默认就是初始化数组为0个元素。

打印的时候遇见b''的内容,即字符串前面有一个b标记,意思是这是个字节类型对象。

文件上传

files参数是一个字典,其中键是名称,值是一个文件对象,也可以是一个2元组、3元组或4元组。
字典表示的方法:

.'name': file-like-objects  #('名称','文件对象')
{'name': file-tuple}        #('名称','元组')

file-tuple(元组)的内容:

('filename', fileobj)
('filename', fileobj, 'content_type')
('filename', fileobj, 'content_type', custom_headers)

'filename'是文件名,fileobj是文件类型,'content-type定义文件类型,是字符串,custom_headers是要为文件添加的其他标头的类似字典的对象。

一般直接用一个{'name',fileobject}来打开文件并上传。

cookies设置

Cookie设置除了可以给cookies参数,也可以直接写入headers的字典内。如果直接写入headers,直接从浏览器把对应的内容复制过来即可;但是如果给cookies参数,则需要额外处理成CookieJar对象。

参考方法:使用字符串方法split()对cookie字符串处理

超时设置

timeout参数如果传入一个浮点数,则代表的是发出请求到服务器返回响应的时间,单位为s(秒)对象。
如果传入一个2元组,则将timeout分为两个阶段:connect(链接)和read(读取),这样可以分别设定链接和读取的超时时间。
上面传入一个浮点数,timeout计算的就是这两个阶段的时间总和。

SSL证书验证

如果目标URL的SSL证书是无效的(如SSL证书设置错误或没有CA机构认证),则直接用requests库请求会发生SSLError错误。

解决方法有多种:

  1. verify参数设置为False,虽然可以正常得到响应,但是这样仍然会出现警告。可以通过requests.packages.urllib3.disable_warnings()方法来设置忽略警告,也可以通过捕获日志来忽略警告:logging.captureWarnings(True)(需要提前import logging

  2. 利用cert参数将本地证书用作客户端证书。

Session对象

进行两次请求,但是保持同一个session会话,需要用上session对象。

创建session对象:sessionname = requests.session()

然后就可以对这个对象调用请求方法,即可在保持session的基础上进行多次请求。

如进行一次get请求:Responsename = sessionname.get(url, params ,**kwargs)

使用这个对象请求时,可以像浏览器打开新的选项卡一样保存登录信息,而不是每次请求都打开一个新浏览器。

Response对象属性

查看响应对象的属性,可以看到响应对象的内容和信息:

属性 说明 属性类型
status_code 响应状态码 int
headers 响应头 requests.structures.CaseInsensitiveDict
cookies Cookie requests.cookies.RequestsCookiejar
url URL地址 str
history 请求历史 list
content 响应内容 bytes
encoding 编码格式 str
text 响应内容 str
响应状态码

响应状态码指的是网站的响应状态,详细的状态码表不一一列举,仅列举博主认为比较重要的部分:HTTP 应答状态码

HTTP状态码 描述 查询条件(部分)
200 请求成功 'ok','okay',\\o/
301 永久重定向 'moved','\\o-'
403 拒绝请求 'forbidden'
404 请求资源不存在 'not_found',-o-
500 服务器错误 'server_error',/o\\
状态码查询对象

状态码查询对象:requests.codes

常见的状态码查询对象属性见上表的查询条件,使用方法:

用“正常”的状态码requests.codes.ok将得到200

需要更详细的使用方法,可以在IDLE内输入

rco = requests.codes,然后查看rco的内容即可。

PreparedRequest对象

requests通过构建PrepareRequest对象,再将其发送出去,从而实现请求。当然也可以直接构造PrepareRequest对象。

具体的实现方式如下:先构建一个Request实例,然后使用prepare方法转成PrepareRequest对象,然后创建一个session对象,调用其send方法实现发送请求。

>>> import requests
>>> req = requests.Request('GET', 'http://httpbin.org/get')
<Request [GET]>

>>> r = req.prepare()
<PreparedRequest [GET]>

>>> s = requests.Session()
>>> s.send(r)
<Response [200]>

使用这种方法可以灵活地实现各种请求的调度和各种操作。

小结

requests库用法比较简单,但是深究内部还有很多方法没有展示。需要注意的地方也没有urllib库那么多,以下简单罗列:

  • timeout参数包含两个部分,connect(链接)和read(读取)。

  • 想要维持session,需要先创建session对象再请求。

  • 可以直接利用属性status_code判断网站是否请求成功,也可以通过requests.codes对象的指定属性和status_code属性的比较判断是否

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python3爬虫学习——requests库笔记 的相关文章

随机推荐

  • firefox 阻止此页面创建其他对话框的解决方法

    用Firefox操作弹出界面时总是遇到 firefox 阻止此页面创建其他对话框 点击确定后 控制台就会报错误 解决方法 1 在firefox里输入about config 2 在列表框里右键 gt 新建 gt 整数 3 输入选项名dom
  • Redis底层数据结构

    Redis简单介绍一下 Redis是一个开源的 使用C语言编写的 支持网络交互的 可基于内存也可持久化的Key Value数据库 有哪些数据结构 说起Redis数据结构 肯定先想到Redis的5 种基本数据结构 String 字符串 Lis
  • 日期类之运算符重载

    date h pragma once include
  • linux tcpdump抓包命令详解,tcpdump(抓包分析命令详解)

    TCPDump可以完全拦截网络上传输的数据包以提供分析 它支持对网络层 协议 主机 网络或端口的过滤 并提供逻辑语句 例如和 或不帮助您删除无用的信息 tcpdump抓包分析命令详解 tcpdump是一个用于截取网络分组 并输出分组内容的东
  • 如何成为一个牛逼的脚本小子日记之0x001-JAVA 代码审计 Top half (2023829-...

    如何成为一个牛逼的脚本小子日记之 0x001 JAVA 代码审计 Top half 2023 8 29 2023 9 1 此记录是在拥有一定的java基础下进行的 java基础类 反射 继承 filter servlet calssLoad
  • Springboot实现热部署

    所谓的热部署 比如项目的热部署 就是在应用程序在不停止的情况下 实现新的部署 而Springboot在我们每次修改完代码之后 可能只是修改下打印的信息 就得重新启动App类 这样太浪费时间 有没有一种修改完代码让程序自动重启的方法呢 答案是
  • DirectShow中的工具GraphEdit使用小结

    一 安装完Windows SDK 7 0或7 1后 在C Program Files Microsoft SDKs Windows v7 0 Bin下有32位的graphedt exe 及x64目录下有64位版本的graphedt exe
  • Python—PEP8规范

    Python PEP8规范 介绍 代码布局 模块导入顺序 空格 注释 注释块 命名风格 应避免的名字 模块名 类名 异常名 全局变量名 函数名 方法名和实例变量名 设计建议 Python思维导图 app siweidaotu com R06
  • MySql如何获取表头字段?实用技巧

    show columns from 表名
  • Tomcat源码分析之getParameter(String)与getQueryString()

    本文有些地方的描述对某些人来说可能比较罗嗦 如果想直接进入正题 可阅读 源码分析 节 但本文是自己一步步分析解决问题思路的记录 虽然有些地方的思考还不是很深入 主要是由于时间不是很充裕 虽然花了三天时间 但感觉还是不够 我会在后续的博文中
  • OpenZeppelin集成Truffle编写健壮安全的合约

    原文 http truffleframework com tutorials robust smart contracts with openzeppelin 因为智能合约往往涉及金钱 保证Soldity代码没有错误 以及足够的安全是非常根
  • RTP/RTCP/RTSP负载H264的一些问题小结

    以下内容都是基于rfc3984 RTP负载H264时的参数配置 1 在TCP传输时 Transport头中的interleaved参数必须设置 比如0 1 或者2 3 海康的流中出现了4 但是没有配置 所以wireshark也无法解析cha
  • Maven实战(五)使用maven开发的项目,如何更方便地提取第三方包

    如果你的项目使用maven构建的话 当项目要上线 部署到服务器上去的时候或许会碰见这样的问题 问题就是 服务器上没有maven的环境 也就是说 项目所依赖到的那些仓库 repository 中的jar包你需要单独提取出来上传到服务器中去 解
  • 软件测试题答案

    搜索答案的一个方法 点Ctrl F 在页面上查找 输入题目上的部分字 软件测试题及答案 1 单选题 通常 是在编码阶段进行的测试 它是整个测试工作的基础 A 系统测试 B 确认测试 C 集成测试 D 单元测试 正确答案 D 2 单选题 如果
  • 华三ap设置无线服务器,H3C无线控制器V5版本配置AP上线的方法

    H3C无线控制器上没有开启自动上线 需要先手动在控制器上输入AP信息 然后新建vlan 新建vlan接口 新建wlan ess接口 新建无线服务 然后在AP上配置射频参数 交换机上需要开启DHCP 为手机终端分配IP地址 并且交换机上与AP
  • vscode相关问题处理

    1 跳转缓慢 跳转函数 一直转圈圈 比较慢 关闭vscode 删除索引文件 cd config Code User workspaceStorage rm rf 2 重新打开vscode即可 2 波浪线报错 在确认c cpp propert
  • RocketMQ-高级原理

    本节讲解下当MQ消息消费失败 或者发送不成功时如何处理消息 消息发送不成功一般存在于几种情况 网络原因 服务宕机 或者broker配置 消息发送失败 如果是由于broker配置原因 可以通过报错提示排查原因 无法查到路由信息 一般考虑到ro
  • MATLAB算法实战应用案例精讲-【时序模型】循环神经网络-GRU(附MATLAB和Python代码)

    目录 前言 几个高频面试题 1 GRU与LSTM的区别与联系 2 LSTM和RNN的区别 GRU的引入 算法原理
  • 浅析TVSPK稳压二极管,谁能更胜一筹?

    1 符号封装 稳压二极管和TVS管的电路符号和稳压二极管基本相同 封装也差不多 有时候在外观甚至很难分别出来到底哪个是哪个 2 电路接法 稳压二极管和TVS管在电路都是反向接入 也就是利用它的反向特性 利用PN结雪崩效应 在反向击穿前均有一
  • Python3爬虫学习——requests库笔记

    Python3爬虫学习 requests库笔记 前言 本笔记用于记录整理requests库的一些基本知识 内容会根据博主自己的认知作增添或压缩 其实自己看了下之前写的urllib库笔记 觉得那么写万字长文并不妥当 没有起到快速查阅的笔记作用