Python3爬虫学习——requests库笔记

Python3爬虫学习——requests库笔记

前言

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

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

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

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

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

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

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

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


文章目录

  • Python3爬虫学习——requests库笔记
    • 前言
    • requests安装
    • requests对象
      • 补充说明
        • 字节类型(byte类型)
        • 文件上传
        • cookies设置
        • 超时设置
        • SSL证书验证
        • Session对象
      • Response对象属性
        • 响应状态码
        • 状态码查询对象
    • PreparedRequest对象
    • 小结

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属性的比较判断是否

你可能感兴趣的:(Python学习笔记,Python3爬虫笔记,爬虫,学习,python)