1. requests 中的请求方法

HTTP 请求方法:
requests.get(url, params=None, **kwargs) # GET 请求
requests.post(url, data=None, json=None, **kwargs) # POST 请求
requests.put(url, data=None, **kwargs) # PUT 请求
requests.patch(url, data=None, **kwargs) # PATCH 请求
requests.head(url, **kwargs) # HEAD 请求
requests.options(url, **kwargs) # OPTIONS 请求
requests.delete(url, **kwargs) # DELETE 请求 # 以上所有请求均返回一个 requests.Response 对象 requests.request(method, url, **kwargs)
参数说明: method:
请求方法: "GET", "POST", "PUT", "PATCH", "HEAD", "OPTIONS", or "DELETE" url:
请求链接 params:
URL查询参数, 拼接到 URL Query String 中, 一般用于 GET 请求,
类型: 字典{name1:value1, ...}、
元祖列表[(name1, value1), ...]、
bytes/str([b]"name1=value1&name2=value2")。
拼接后结果如: http://httpbin.org/get?name1=value1&name2=value2 data:
发送到请求 Body 中的数据, 一般用于 POST/PUT 请求,
类型: 字典{name1:value1, ...}, 元祖列表[(name1, value1), ...], bytes/str 或 文件流对象。 如果是 字典/元祖列表, 则按照 form 表单格式拼接后发送到请求 Body 中,
如: "name1=value1&name2=value2", 并且自动添加请求头:
"Content-Type": "application/x-www-form-urlencoded" 如果是 bytes/str, 则直接将内容发送到请求 Body 中, 并且不添加 Content-Type 请求头。 如果是 文件流对象, 则把文件内容当做 bytes 直接发送到请求 Body 中, 发送完后需手动关闭文件流。 json:
一个可被序列化为 JSON 字符串的 Python 对象(如 字典), 一般用于 POST 请求,
序列化后的 JSON 字符串发送到请求 Body 中, 并自动添加请求头:
"Content-Type": "application/json" headers:
HTTP 请求头, 字典类型, 如: {"Header1": "Value1", "Header2": "Value2"}, 会覆盖现有的请求头。 cookies:
添加到请求头中的 Cookies, 类型: 字典{name1:value1, ...} 或 CookieJar对象。
如果传递的是 CookieJar 对象, 则从中提取适合该 URL 请求的 Cookie 添加到请求头中。
添加的 Cookie 请求头示例:
"Cookie": "name1=value1; name2=value2"
响应中返回的 CookieJar 对象为 requests.cookies.RequestsCookieJar,
继承自 requests.cookies.cookielib.CookieJar == http.cookiejar.CookieJar。 files:
上传文件, 字典类型。
一般作为 POST 提交 "multipart/form-data; boundary=xxx" 多部分编码 form 表单中的文件字段,
可结合 data 参数同时上传 form 表单的 普通字段 和 文件字段。 使用了该参数, 自动添加请求头:
"Content-Type": "multipart/form-data; boundary=xxx" 参数传值格式:
{"field_name": file-like-objects}
{"field_name": ("filename", fileobj)}
{"field_name": ("filename", fileobj, "content_type")}
{"field_name": ("filename", fileobj, "content_type", custom_headers)}
说明:
其中 fileobj 可以用 str/bytes 来代替要上传的文件内容;
"filename" 表示显式地设置 该文件字段的 文件名;
"content_type" 表示显式地设置 该文件字段的 文件类型;
custom_headers 表示显式地设置 该文件字段的 请求头, 值为字典类型;
可同时上传多个文件;
打开的文件流需要手动关闭。 参数传值示例:
{"f1": open("aa.jpg", "rb")} 提交后表单字段值为: name=f1, filename=aa.jpg
{"f1": open("aa.jpg", "rb"), "f2": open("bb.png", "rb")} 同时上传多个文件
{"f1": ("bb.jpg", open("aa.jpg", "rb"))} 提交后表单字段值为: name=f1, filename=bb.jpg auth:
身份认证, 传递一个认证对象或元祖, 支持 Basic/Digest/Custom HTTP Auth。
参数值传递格式:
Basic Auth: auth=requests.auth.HTTPBasicAuth("user", "pass")

auth=("user", "pass")
Digest Auth: auth=requests.auth.HTTPDigestAuth("user", "pass") 使用示例:
resp = requests.get("https://httpbin.org/basic-auth/user/pass", auth=("user", "pass")) timeout:
超时时间, 单位为秒。类型为 float 或 元祖。
如果传递一个 float 参数, 则表示服务器在 timeout 秒内没有应答, 则抛出超时异常。
也可以传递一个包含 连接超时 和 读取超时 的元祖: (connect timeout, read timeout) allow_redirects:
是否允许重定向。类型为 bool 类型, 默认为 True。 proxies:
URL 代理。类型为字典。使用示例:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080"
}
requests.get("http://example.org", proxies=proxies) verify:
是否验证证书。类型为 bool 或 str, 默认为 True。
bool类型: 表示是否验证服务端的 TLS 证书。
str 类型: CA_BUNDLE 文件的路径, 或者包含可信任 CA 证书文件的文件夹路径。 目前各大网站基本有自己的ca证书,但是不排除有的网站为了节约网站建设开销并没有购买ca证书。
又因为requests模块在发送网络请求的时候,默认会验证ca证书。如果当前网站没有ca证书,那么就会报错:requests.exceptions.SSLError
如果出现上述错误,那么我们可以用verify关键字参数,在请求的时候不验证网站的ca证书
response = requests.get( "url",verify=False)
如果加了verify=False这个关键字参数,使用requests模块发送请求的时候会给你弹出一个警告,警告你当前的请求可能不安全:InsecureRequestWarning
这个警告对于后面的代码逻辑没有影响,有强迫症的可以考虑加入以下代码忽略警告:
import urllib3
urllib3.disable_warnings() stream:
响应内容是否是流数据, 类型为 bool。如果是 False, 响应内容将被立即下载。 cert:
客户端证书。类型为 str 或 tuple。
str 类型: 指定一个本地证书文件(包含密钥和证书)用作客户端证书, 如 cert="client.pem"
tuple类型: 一个包含两个文件路径的元组, 如 cert=("client.cert", "client.key")

实例:

import requests

if __name__ == '__main__':
# UA伪装
headers = {
'User-Agent': '网页f12里找User-Agent这个字段复制过来'
}
url = 'https://www.bing.com/search?'
# 处理url携带的参数:封装到字典中
kw = input('enter a word:')
param = {
'q': kw
}
# 对指定的url发起的请求对应url是携带参数的,而且q请求过程中处理了参数
resp = requests.get(url=url, params=param, headers=headers)
print(resp.status_code) # 响应头
print(resp.headers) # 响应头
print(resp.cookies) # 响应的 cookies
print(resp.content.decode("utf-8")) # 响应内容
# print(resp.reason) # HTTP 响应状态吗对应的名称 # fileName = kw + '.html'
# with open(fileName, 'w', encoding='UTF-8') as fp:
# fp.write(page_text)
# print(fileName, '保存成功!!!')

2. 响应对象: requests.Response

发出请求后,将返回一个 requests.Response 对象,包含了服务端对 HTTP 请求的响应。



Response 类的常用方法和字段:

close()
# 释放链接, 放回连接池。调用该方法后, raw 对象将不能访问。
# Note: 通常不需要显式地调用该方法。 status_code = None
# HTTP 响应状态码, 如: 200, 302, 404, 500
# 可以使用内置的状态码常量, 如: requests.codes.OK, requests.codes.NOT_FOUND reason = None
# HTTP 响应状态吗对应的名称, 如: "OK", "Not Found" ok
# 如果 status_code 小于 400, 则返回 True raise_for_status()
# 抛出的 HTTPError, 如果发生 HTTPError, 将被存储。 url = None
# 响应的最终 URL 位置 headers = None
# 不区分大小写的响应头的字典。获取指定响应头的值: headers["header_name"]
# 例如 headers["content-encoding"] 和 headers["Content-Encoding"],
# 均返回 Content-Encoding 响应头对应的值 cookies = None
# 服务端响应中返回的 CookieJar 对象, 类型为 requests.cookies.RequestsCookieJar,
# 继承自 requests.cookies.cookielib.CookieJar == http.cookiejar.CookieJar
# 获取指定 cookie 的值: cookies.get("name") 或 cookies["name"]
# 获取所有 cookie 的值: cookies.items(), 返回 [(name, value), ...] apparent_encoding
# 响应内容的表观编码, 由 chardet 库提供 content
# 字节类型的响应内容 text
# Unicode 表示的响应内容。
# 如果 Response.encoding 为 None, 将使用猜到的 chardet 解码。 json(**kwargs)
# 返回响应的 JSON 编码内容(如果有) raw = None
# 响应的文件流对象(用于高级用法), 使用该字段需要在请求时传递参数: stream=True iter_content(chunk_size=1, decode_unicode=False)
# 遍历响应数据。需要在请求时添加参数 stream=True, 该方法可避免将较大的响应立即读取到内存中。
# chunk_size 为本次应该读取的最大字节数, 最后一次可能达不到该数量。
#
# chunk_size 必须为 int 或 None 类型。
#
# chunk_size 为 None 时。如果 stream=True, 将以达到接收到的块的大小读取数据。
# 如果 stream=False, 则将数据作为单个块返回。
#
# 如果 decode_unicode=True, 则将基于响应使用最佳的可以用编码对内容进行解码。 iter_lines(chunk_size=512, decode_unicode=None, delimiter=None)
# 遍历响应数据, 一次读取一行。需要在请求时添加参数 stream=True,
# 该方法可避免将较大的响应立即读取到内存中。
# Note: 此方法不是可重入的安全方法。 is_redirect
# 此响应是一个格式正确的 HTTP 重定向, 并且可能已经被自动处理, 则为 True is_permanent_redirect
# 如果此响应是重定向的永久版本之一, 则为 True history = None
# 请求的历史响应对象列表。任何重定向都将在此处结束。该列表从最早的请求到最新的请求进行排序。 next
# 如果有重定向请求, 则 next 为下一个请求返回的 PreparedRequest 对象 request = None
# 作为响应的 PreparedRequest 对象 links
# 返回响应的已解析头链接(如果有) elapsed = None
# 从发送请求到响应到达之间经过的时间(以时间增量为单位, 如 0:00:00.306239)
# 类型为 <class 'datetime.timedelta'>
# 此属性专门用于测试发送请求到第一个字节与头解析之间所需要的时间。
# 此属性不会因为使用响应内容或 stream 参数值而受影响。 encoding = None
# 当访问 r.txt 时用于解码的编码格式

实例:

import requests

resp = requests.get("http://httpbin.org/get")

# 响应内容编码
print(resp.apparent_encoding) # 返回一个 ascii (编码) # 解码字节类型的响应内容
# resp的content(响应内容)按照(resp.apparent_encoding)的编码进行decode(解码)
print(resp.content.decode(resp.apparent_encoding)) # 直接使用已解码的响应内容
print(resp.text)

#请求中添加 Cookie

#请求中添加 Cookie
import requests cookies = {"key1": "value1", "key2": "value2"}
resp = requests.get("http://httpbin.org/cookies", cookies=cookies)
print(resp.text)
'{"cookies": {"key1": "value1", "key2": "value2"}}'

自动保持会话: requests.Session
Session 对象能够跨请求保持某些参数(例如: 请求头)。它也会再同一个 Session 实例发出的所有请求之间保持 Cookies(自动保存/添加 Cookies)。
Session 请求期间使用 urllib3 的连接池功能,所以向同一个主机发送多个请求,底层的 TCP 链接将被重用,从而达到性能提升的效果。

清晰一点的回答:
使用 requests 模块的时候,是直接 requests.get() 或者 requests.post() 发送GET请求或POST请求;

当然也是可以带上 cookies 和 headers 的,但这都是一次性请求,你这次带着cookies信息,后面的请求还得带。

这时候 requests.session() 就派上用场了,它可以自动处理cookies,做状态保持。

Session 拥有的请求方法与 requests 相同,如: session.get()、session.post()、session.request() 等,其传入的参数格式也相同。

请求添加固定请求头 和 Cookies 保持:

import requests

# 创建会话对象
session = requests.Session() # session 对象创建后, session.headers 和 session.cookies 均已有值, 直接添加数据即可。
# session.headers 类型为 requests.structures.CaseInsensitiveDict
# session.cookies 类型为 requests.cookies.RequestsCookieJar # 添加固定请求头
session.headers.update({"User-Agent": "hello/world", "X-Test": "Test-Value"})
# 输出请求头
print(session.headers) # 手动设置 Cookie 到 session 中
session.cookies.set("key1", "value1", domain="httpbin.org", path="/") # 发送请求(响应中将会设置一个cookie: hello=world)
resp = session.get("http://httpbin.org/cookies/set/hello/world")
print(resp.text) # 发出请求(将自动携带 固定请求头 和 Cookies)
resp = session.get("http://httpbin.org/cookies")
print(resp.text) # 发出请求(将自动携带固定请求头和Cookies)
resp = session.get("http://httpbin.org/get")
print(resp.text) # 关闭会话
session.close()
 

python爬虫-request模块的更多相关文章

  1. Python爬虫——Request模块

    # 使用 Requests 发送网络请求# 1.导入 Requests 模块import requests# 2.尝试获取某个网页 # HTTP 请求类型r = requests.get('https ...

  2. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  3. python 爬虫 urllib模块 目录

    python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...

  4. Python爬虫urllib模块

    Python爬虫练习(urllib模块) 关注公众号"轻松学编程"了解更多. 1.获取百度首页数据 流程:a.设置请求地址 b.设置请求时间 c.获取响应(对响应进行解码) ''' ...

  5. Python之request模块-基础用法

    Request模块参考中文手册:https://requests.readthedocs.io/zh_CN/latest/ Request模块 1.查看pip已装包(模块)的安装信息(模块的路径.版本 ...

  6. python 爬虫 urllib模块 反爬虫机制UA

    方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...

  7. python 爬虫 urllib模块介绍

    一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...

  8. python爬虫-urllib模块

    urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...

  9. Python爬虫——selenium模块

    selenium模块介绍 selenium最初是一个测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题 selenium本质是通过驱动浏览器,完全模拟浏览 ...

  10. Python爬虫常用模块,BeautifulSoup笔记

    import urllib import urllib.request as request import re from bs4 import * #url = 'http://zh.house.q ...

随机推荐

  1. Oracle和达梦:根据外键名字查询表名

    根据外键名字查询表名 select * from user_cons_columns cl where cl.constraint_name = '外键名';

  2. 深入剖析:如何使用Pulsar和Arthas高效排查消息队列延迟问题

    背景 前两天收到业务反馈有一个 topic 的分区消息堆积了: 根据之前的经验来看,要么是业务消费逻辑出现问题导致消费过慢,当然也有小概率是消息队列的 Bug(我们使用的是 pulsar). 排查 通 ...

  3. PLC输出指令频率F计算

    本文章为学习记录,水平有限,望各路大佬们轻喷!!!    转载请注明出处!!!

  4. 网络性能监测与诊断的专家-AnaTraf

    网络性能问题是困扰许多企业和组织的常见问题.网络速度慢.延迟高.丢包率高.应用卡顿等问题都会严重影响用户体验和工作效率.为了解决这些问题,企业需要对网络流量进行分析和诊断,找出问题根源并采取措施进行优 ...

  5. IPv6 — 综合组网技术

    目录 文章目录 目录 前文列表 IPv4v6 综合组网技术(转换机制) 双栈策略 隧道策略 前文列表 <IPv6 - 网际协议第 6 版> <IPv6 - 地址格式与寻址模式> ...

  6. pageoffice在线编辑word文件并禁止选中

    一.整篇文档禁止选中 wordDoc.setDisableWindowSelection(true); //禁止word的选择文字功能 二.根据条件判断是否禁止选中 比如:选中内容超过一定字数,取消选 ...

  7. AIRIOT物联网低代码平台如何配置欧姆龙omron驱动?

    数据采集与控制是物联网的核心能力之一,AIRIOT物联网低代码平台提供了丰富的驱动,兼容了市面上95%以上的传感器.控制器及数据采集设备等,并且在持续增加中,能够快速.便捷地实现数据采集与控制功能. ...

  8. 重温 ShardingSphere 分布策略

    ShardingSphere--分片及策略:https://blog.csdn.net/weixin_38910645/article/details/107538848 Sharding-JDBC: ...

  9. golang sync.once done 热路径

    sync.once 为什么会将done放在结构体第一个字段,就能够提升性能了? 我们先来看看sync.once的结构体: // Once is an object that will perform ...

  10. C#.Net筑基-深入解密小数内部存储的秘密

    为什么0.1 + 0.2 不等于 0.3?为什么16777216f 等于 16777217f?为什么金钱计算都推荐用decimal?本文主要学习了解一下数字背后不为人知的存储秘密. 01.数值类型 C ...