Python之Request库踩坑之路

Python之Request库踩坑之路

此文作者是刚入手Python,用来平时研究自动化测试,所以对Request理解有限,如有疑问可以联系讨论。

背景

Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

安装

利用pip安装:
$ pip install requests

使用

GET请求

1.基本的GET的请求

response = requests.get("http://www.baidu.com/")
#也可以这样写
response = requests.request("get","http://www.baidu.com/")

2.添加headers 和 params

如果想添加 headers,可以传入headers参数来增加请求头中的headers信息。如果要将参数放在url中传递,可以利用 params 参数。

key = {'key': 'CC'}
headers = {
    "User-Agent": "Mozilla/5.0"}
response = requests.get("http://www.baidu.com/s?", params=key, headers=headers)
print(response.text)# 查看响应内容,response.text 返回的是Unicode格式的数据
print(response.content)# 查看响应内容,response.content返回的字节流数据
print(response.status_code)# 查看响应码

如果你想取文本,可以通过response.text;如果想取图片/文件,则可以使用response.content。

POST方法

1.基本的POST的请求

response = requests.post("http://www.baidu.com/",data = data)

2.body带参数

formdata = {
    "type": "AUTO",
    "doctype": "json",
    "key": "www",
    "ue": "UTF-8",
}
url = "http://auto-installment/v1/loan-credit-check"
response = requests.post(url,data = data,headers=headers)

print(response.text)#显示返回结果
print(response.json())# 如果是json文件可以直接显示

注意:
打印的结果出现中文乱码,使用json.dupms(response, ensure_ascii=False))解决

Session

一般利用Session在跨请求的时候保持某些参数,比如实现登录后才能访问其他页面

# 1. 创建session对象,可以保存Cookie值
session = requests.session()

# 2. 需要登录的用户名和密码
data = {"username": "mxxxx", "password": "1233444"}

# 3. 发送附带用户名和密码的请求,并获取登录后的Cookie值,保存在ssion里
session.post("https://www.jianshu.com/sign_in", data=data)

# 4. ssion包含用户登录后的Cookie值,可以直接访问那些登录后才可以访问的页面
response = session.get("https://www.jianshu.com/writer#/")

踩坑记要

1.在使用requests去请求一个接口时,出现报错的情况,但是这个接口本身却没有问题。这是因为接口的请求参数有两种情况:简单类型(一般少于3个)和复杂对象类型。
解决方法:在headers中定义一下这两种参数的类型
简单类型:headers={"Content-Type": "application/x-www-form-urlencoded"}
复杂对象类型:headers={"Content-Type":application/json}
2.某些HTTPS请求存在 SSL证书验证
解决方法:response = requests.get("https://www.baidu.com/", verify=False)

如果大家对于学习Python有任何问题,学习方法,学习路线,如何学习有效率的问题,可以随时来咨询我,或者缺少系统学习资料的,我做这行年头比较久,自认为还是比较有经验的,可以帮助大家提出建设性建议,这是我的Python交流qun:785128166,有任何问题可以随时来咨询我。
 

扩展

1.requests请求失败后,增加重试机制(若失败,将会重试3次)

request_retry = requests.adapatrs.HTTPAdapaters(max_retries=3)
session.mount('https://',request_retry)  

2.使用grequests实现异步请求

urls = [
    'http://www.url1.com',
    'http://www.url2.com',
    'http://www.url3.com',
    'http://www.url4.com',
    'http://www.url5.com',
]
resp = (grequests.get(u) for u in urls)
grequests.map(resp)

3.自定义cookies

我们使用Session实例来保持请求之间的cookies,但是有些特殊情况,需要使用自定义的cookies

我们使用Session实例来保持请求之间的cookies,但是有些特殊情况,需要使用自定义的cookies
# 自定义cookies
cookie = {'guid':'5BF0FAB4-A7CF-463E-8C17-C1576fc7a9a8','uuid':'3ff5f4091f35a467'}

session.post('http://', cookies=cookie)

4.统计一个API请求花费的时间

session.get(url).elapsed.total_seconds() 

5.设置请求超时

session.get(url, timeout=15)

6.文件上传

Requests利用files作为参数模拟提交文件数据

file = {'file':open('test.bmp','rb')}   #rb表示用二进制格式打开指定目录下的文件,且用于只读
r =requests.post('http://',files=file)
print(r.text)
### Flask与Kafka集成常见问题及解决方案 #### 1. Kafka依赖安装失败 当尝试在Flask应用中引入`kafka-python`或其他Kafka客户端时,可能会遇到包安装失败的情况。这通常是因为环境配置不当或缺少必要的编译工具。 解决方法是在虚拟环境中执行安装命令,并确保操作系统已安装Python开发文件以及构建必需的软件包[^1]: ```bash pip install kafka-python ``` 如果仍然无法成功安装,则考虑升级Pip版本或将特定版本号固定下来再试一次。 #### 2. 连接超时错误 创建生产者或消费者实例时发生连接超时异常,表明应用程序未能及时建立到Kafka集群的有效链接。可能的原因有网络延迟过高、目标服务器地址不正确或是防火墙阻止了通信端口。 建议先验证Broker列表中的主机名和端口号设置无误;接着确认本地机器能够正常访问远程服务;最后调整socket_timeout_ms参数值来增加等待时间窗口: ```python from kafka import KafkaProducer producer = KafkaProducer( bootstrap_servers=['localhost:9092'], socket_timeout_ms=30*1000 # 设置为30秒 ) ``` #### 3. 数据序列化/反序列化格式不符 向主题发送消息前需指定合适的键值编码方式,默认情况下采用字符串形式表示。然而实际场景下经常需要用到JSON对象或者其他自定义结构体作为负载内容,在这种情形下就需要额外处理数据转换逻辑。 可以利用json.dumps()函数将字典转成合法的JSON串并附带相应的内容类型头信息传递给send()接口调用: ```python import json message_value = {"key": "value"} future_record_metadata = producer.send('my-topic', value=json.dumps(message_value).encode()) ``` 对于消费端而言则相反,接收后应立即解码恢复原始形态以便后续业务流程继续运作下去: ```python for message in consumer: decoded_message = json.loads(message.value.decode()) print(decoded_message["key"]) ``` #### 4. 并发性能瓶颈 随着并发请求量增大,单线程模式下的I/O密集型操作容易成为整个系统的效率短板所在。此时可借助多进程或多线程技术实现异步非阻塞式的批量提交机制从而提高吞吐率表现。 通过继承ThreadingMixIn类来自定义HTTPServer类即可轻松达成目的: ```python from http.server import HTTPServer, BaseHTTPRequestHandler from threading import Thread from concurrent.futures.thread import ThreadPoolExecutor class SimpleHttpServer(HTTPServer): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.executor = ThreadPoolExecutor(max_workers=8) if __name__ == '__main__': server_address = ('', 8000) handler_class = MyRequestHandler with SimpleHttpServer(server_address, handler_class) as httpd: threads = [] while True: request, client_address = httpd.get_request() thread = Thread(target=httpd.process_request_thread, args=(request, client_address)) thread.start() threads.append(thread) if len(threads) >= 8: for t in threads[:]: t.join(timeout=0.1) if not t.is_alive(): threads.remove(t) ``` 当然也可以直接选用gevent等第三方协程框架进一步简化代码复杂度的同时获得更好的资源利用率效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值