python requests模块使用
python的网络编程能力十分强大,其中python中的requests库宣言:HTTP for Humans (给人用的 HTTP 库)
在网络编程中,最基本的任务包含:
- 发送请求
- 登录
- 获取数据
- 解析数据
- 反序列化打印内容
目录:
一、安装
pip install requests
二、基本用法
import requests
cs_url = 'http://httpbin.org'
r = requests.get("%s/%s" % (cs_url, 'get'))
r = requests.post("%s/%s" % (cs_url, 'post'))
r = requests.put("%s/%s" % (cs_url, 'put'))
r = requests.delete("%s/%s" % (cs_url, 'delete'))
r = requests.patch("%s/%s" % (cs_url, 'patch'))
r = requests.options("%s/%s" % (cs_url, 'get'))
三、URL传参/获取请求的URL/POST表单
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests payload = {'key1': 'value1', 'key2': 'value2'} # URL 传参
r = requests.get("http://httpbin.org/get", params=payload)
# 获取请求的 URL
print "GET URL:", r.url # POST 发送编码为表单形式的数据,requests 会自动将 Python 字典序列化为实际的表单内容
r = requests.post("http://httpbin.org/post", data=payload)
# 获取响应内容,string
print "POST Response:\n", r.content
if r.headers.get("content-type") == "application/json":
# 获取响应内容,dict类型
print "r.json:\n", r.json()
print "form:\n", r.json().get("form")
输出结果:
GET URL: http://httpbin.org/get?key2=value2&key1=value1
POST Response:
{
"args": {},
"data": "",
"files": {},
"form": {
"key1": "value1",
"key2": "value2"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Content-Length": "23",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.11.1"
},
"json": null,
"origin": "124.250.131.130",
"url": "http://httpbin.org/post"
} r.json:
{u'files': {}, u'origin': u'124.250.131.130', u'form': {u'key2': u'value2', u'key1': u'value1'}, u'url': u'http://httpbin.org/post', u'args': {}, u'headers': {u'Content-Length': u'23', u'Accept-Encoding': u'gzip, deflate', u'Accept': u'*/*', u'User-Agent': u'python-requests/2.11.1', u'Host': u'httpbin.org', u'Content-Type': u'application/x-www-form-urlencoded'}, u'json': None, u'data': u''}
form:
{u'key2': u'value2', u'key1': u'value1'}
四、HTTP状态码/重定向跳转/请求历史
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests url = "http://github.com"
# requests 默认自动地处理了 301/302 跳转。在经过跳转的请求中,返回的 URL 和状态码都是跳转之后的信息;唯独在 history 中,用 Python 列表记录了跳转情况
r = requests.get("http://github.com")
print "request URL:", url
print "*"*60
print "默认情况,response url:", r.url
print "默认情况,response status code:", r.status_code
print "默认情况,response history:", r.history
print "*"*60
# 有时候我们也想单步追踪页面跳转情况。此时,可以给请求加上 allow_redirects = False 参数。
r = requests.get("http://github.com", allow_redirects=False)
print "禁止自动跳转后,response Uurl:", r.url
print "禁止自动跳转后,response status code:", r.status_code
print "禁止自动跳转后,response history:", r.history
五、请求头
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests cs_url = 'http://httpbin.org/get'
r = requests.get(cs_url)
# 查看请求头
print "定制前:\n", r.request.headers
# 定制请求头,HTTP 头部是大小写不敏感的,如下,User-Agent或user-agent均可
header = {
# 微信UA
'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; MI 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036887 Safari/537.36 MicroMessenger/6.3.27.880 NetType/WIFI Language/zh_CN',
# 用户cookie
'Cookie': 'gr_user_id=2e25dc22-6d3a-4190-86ce-2f0a04f357f5;PHPSESSID=786dcb5b1233dadc80817ea0e58a5de0',
'Accept-Encoding': 'gzip',
}
r = requests.get(cs_url, headers=header)
# 查看请求头
print "定制后:\n", r.request.headers
输出结果:
定制前:
{'Connection': 'keep-alive', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'User-Agent': 'python-requests/2.11.1'}
定制后:
{'Connection': 'keep-alive', 'Cookie': 'gr_user_id=2e25dc22-6d3a-4190-86ce-2f0a04f357f5;PHPSESSID=786dcb5b1233dadc80817ea0e58a5de0', 'Accept-Encoding': 'gzip', 'Accept': '*/*', 'User-Agent': 'Mozilla/5.0 (Linux; Android 4.1.1; MI 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036887 Safari/537.36 MicroMessenger/6.3.27.880 NetType/WIFI Language/zh_CN'}
六、响应头
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests cs_url = 'http://httpbin.org/get'
r = requests.get(cs_url)
print r.headers
输出结果:
{'Content-Length': '240', 'Server': 'nginx', 'Connection': 'keep-alive', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Wed, 07 Dec 2016 06:22:51 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}
七、响应内容
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests cs_url = 'http://httpbin.org/get'
r = requests.get(cs_url)
if r.status_code == requests.codes.ok:
print "以字节形式返回:\n", r.content
print " Unicode编码的文本信息返回:\n", r.text
八、反序列JSON数据
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests r = requests.get("http://httpbin.org/get")
if r.headers.get("content-type") == "application/json":
# 获取响应内容,dict类型
print "r.json:\n", r.json()
print "origin:", r.json().get("origin")
else:
print r.content
九、Cookie
HTTP 协议是无状态的。因此,若不借助其他手段,远程的服务器就无法知道以前和客户端做了哪些通信.Cookie就是「其他手段」之一。
Cookie 一个典型的应用场景,就是用于记录用户在网站上的登录状态。
1.用户登录成功后,服务器下发一个(通常是加密了的)Cookie 文件。
2.客户端(通常是网页浏览器)将收到的 Cookie 文件保存起来。
3.下次客户端与服务器连接时,将 Cookie 文件发送给服务器,由服务器校验其含义,恢复登录状态(从而避免再次登录)
为了演示该实例,提供服务端简单接口实例代码如下:
# 使用cookie演示登录功能接口
def cookie(request):
username = request.GET.get("user")
password = request.GET.get("pwd")
cookie_content = request.COOKIES
login_flag = cookie_content.get("is_login")
if login_flag=="True" or (username == "qa" and password == "4399"):
msg = {
"msg": "login success! Welcome~~",
"recive_cookie": cookie_content
}
response = JsonResponse(msg)
response.set_cookie("is_login", True)
else:
msg = {
"msg": "username or password error,please try again!",
"recive_cookie": cookie_content
}
response = JsonResponse(msg)
response.set_cookie("is_login", False) return response
cookie示例代码如下,cookie既可通过requests的cookies参数传递,也可以在requests的headers参数传递。(同时存在headers和cookies参数时,headers中的cookie会覆盖cookies参数中的cookie)
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests url = "http://10.1.102.75:8000/cookie"
r = requests.get(url)
print "没有发送cookie时,服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100 cookies = {
"is_login": "True"
}
r = requests.get(url, cookies=cookies)
print "发送cookie时,服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100 headers = {
'cookie': 'send_headers=send cookie form client headers'
}
r = requests.get(url, headers=headers)
print "发送cookie时,服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100
输出结果如:

十、会话对象
会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持 cookie,所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而带来显著的性能提升。看本实例之前请先阅读cookie章节
#!/usr/bin/env python
# -*- coding: utf-8 -*- import requests login_url = "http://10.1.102.75:8000/cookie?user=qa&pwd=4399"
access_url = "http://10.1.102.75:8000/cookie"
s = requests.Session()
r = s.get(login_url)
print "传入正确账号与密码正确登录后,服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100 r = s.get(access_url)
print "已登录后,不发送已登录cookie时或登录账号,访问首页时,服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100 cookies = {
"other_cookie": "test send order cookie"
}
r = s.get(access_url, cookies=cookies)
print "已登录后,添加发送非登录cookie,访问首页时服务端返回内容为:", r.content
print "获取服务端设置的cookie,cookie为:", r.cookies
print "*" * 100
输出结果如下:

十一、超时设置
为防止服务器不能及时响应,大部分发至外部服务器的请求都应该带着 timeout 参数。如果没有 timeout,你的代码可能会挂起若干分钟甚至更长时间。
>>> r = requests.get('https://github.com', timeout=5)
>>> r = requests.get('https://github.com', timeout=None)
>>>
十二、SSL证书验证
Requests 可以为 HTTPS 请求验证 SSL 证书,就像 web 浏览器一样。要想检查某个主机的 SSL 证书,你可以使用 verify 参数:
>>> requests.get('https://github.com', verify=True)
<Response [200]>
默认情况下, verify 是设置为 True 的,如果SSL认证失败,可以尝试将verify验证关闭,verify=False
更多高级使用,请查看 http://docs.python-requests.org/zh_CN/latest/user/advanced.html
#!/usr/bin/env python
# -*- coding: utf-8 -*- """
微信端抽奖活动
多线程抽奖,测试前提:去掉一个用户只能参与一次的限制
"""
import requests
from time import ctime
import threading def draw_lottery():
lottery_url = "http://10.1.102.75:8000/activity/gsdzzlottery/lottery"
headers = {
# 微信UA
'user-agent': 'Mozilla/5.0 (Linux; Android 4.1.1; MI 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036887 Safari/537.36 MicroMessenger/6.3.27.880 NetType/WIFI Language/zh_CN',
# 用户cookie
'cookie': 'gr_user_id=2e25dc22-6d3a-4190-86ce-2f0a04f357f5; Hm_lvt_0d8e9cf3502496036a00d10b24863c6d=1478072857,1480158524; PHPSESSID=786dcb5b1233dadc80817ea0e58a5de0'
}
try:
conn = requests.get(lottery_url, headers=headers, verify=False)
print conn.text
except Exception, e:
print e if __name__ == '__main__':
print 'start:', ctime()
for j in range(2):
threads = 300
threads_list = []
for i in range(threads):
t = threading.Thread(target=draw_lottery, args=())
threads_list.append(t)
for i in range(threads):
threads_list[i].start()
# keep thread
for i in range(threads):
threads_list[i].join() print 'end:', ctime()
结合threading,测试微信页面并发抽奖小demo
#!/usr/bin/env python
# -*- coding: utf-8 -*- """
使用装饰器,并发请求
"""
import requests
from time import ctime
import threading def thread_request(count, loop):
"""并发请求装饰器,count: 线程数 ; loop: 循环次数 """ def outer(main_func):
def inner():
# print "before %s" % main_func
for j in range(loop):
threads_list = []
for i in range(count):
t = threading.Thread(target=main_func, args=())
threads_list.append(t)
for th in threads_list:
th.start()
# keep thread
for th in threads_list:
th.join()
# print "after %s" % main_func return inner return outer @thread_request(count=2, loop=2)
def get_result():
url = "http://a.demo.4399th.com/eventapi/base/get_result"
data = {"hd_id": 1}
headers = {
# 微信UA
# 'user-agent': 'Mozilla/5.0 (Linux; Android 4.1.1; MI 2 Build/JRO03L) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/37.0.0.0 Mobile MQQBrowser/6.8 TBS/036887 Safari/537.36 MicroMessenger/6.3.27.880 NetType/WIFI Language/zh_CN',
# 用户cookie
'cookie': 'a_demo_4399th_com=60a78048563a4b58e5d27d45390be36c' }
try:
conn = requests.post(url, data=data, headers=headers, verify=False)
print conn.text
except Exception, e:
print e @thread_request(count=2, loop=1)
def login():
print "do login" if __name__ == '__main__':
print 'start:', ctime()
get_result()
print 'end:', ctime()
使用装饰器,并发请求
***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***
python requests模块使用的更多相关文章
- 使用python requests模块搭建http load压测环境
网上开源的压力测试工具超级的多,但是总有一些功能不是很符合自己预期的,于是自己动手搭建了一个简单的http load的压测环境 1.首先从最简单的http环境着手,当你在浏览器上输入了http://w ...
- Python requests模块学习笔记
目录 Requests模块说明 Requests模块安装 Requests模块简单入门 Requests示例 参考文档 1.Requests模块说明 Requests 是使用 Apache2 Li ...
- Python—requests模块详解
1.模块说明 requests是使用Apache2 licensed 许可证的HTTP库. 用python编写. 比urllib2模块更简洁. Request支持HTTP连接保持和连接池,支持使用co ...
- Windows下安装Python requests模块
在使用自己写的或者别人的python小工具时可能会出现类似ImportError: No module named Requests的问题: D:\tool\python\fuzz>Fuzz.p ...
- 使用monkey技术修改python requests模块
例如请求前和请求后各来一条日志,这样就不需要在自己的每个代码都去加日志了. 其实也可以直接记录'urllib3.connectionpool' logger name的日志. 修改了requests ...
- Python requests模块params、data、json的区别
json和dict对比 json的key只能是字符串,python的dict可以是任何可hash对象(hashtable type): json的key可以是有序.重复的:dict的key不可以重复. ...
- Python requests模块
import requests 下面就可以使用神奇的requests模块了! 1.向网页发送数据 >>> payload = {'key1': 'value1', 'key2': [ ...
- python requests模块的两个方法content和text
requests模块下有两个获取内容的方法,很奇怪,都是获取请求后内容的方法,有什么区别呢?? 一.区别 content:返回bytes类型的数据也就是二进制数据 text:返回的就是纯文本(Unic ...
- python requests模块session的使用建议及整个会话中的所有cookie的方法
话不多说,直接上代码 测试代码 服务端 下面是用flask做的一个服务端,用来设置cookie以及打印请求时的请求头 # -*- coding: utf-8 -*- from flask import ...
- Python——requests模块
一.安装模块 pip install requests 二.引用 import requests 三.get方法 #GET访问页面 r = requests.get(url) print(r.text ...
随机推荐
- 学习大神笔记之“MyBatis学习总结(三)”
一.连接数据库的配置单独放在一个properties文件中 创建db.peoperties----保存数据库配置信息 driver=com.mysql.jdbc.Drive ...
- 最小生成树 kruskal算法 codevs 1638 修复公路
1638 修复公路 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description A地区在地震过后,连接所有村庄的公 ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
- IntelliJ IDEA设置JVM运行参数
2015十一月 28 原 IntelliJ IDEA设置JVM运行参数 分类:JavaSE (11566) (1) 打开 IDEA 安装目录,看到有一个 bin 目录,其中有两个 vmoptions ...
- php-简单对称加密算法和字符串与十六进制之间的互转函数
/** * 简单对称加密算法之加密 * @param String $string 需要加密的字串 * @param String $skey 加密EKY * @return String */fun ...
- codevs 1536 海战
时间限制: 1 s 空间限制: 256000 KB 题目等级 : 白银 Silver 题目描述 Description 在峰会期间,武装部队得处于高度戒备.警察将监视每一条大街,军队将保卫建筑物, ...
- 微信小程序之使用weui.wxss(八)
[未经作者本人同意,请勿以任何形式转载] 什么是WeUI? WeUI是在遵守微信视觉设计规范下,由官方设计团队为小程序量身定制的基础样式库. 这里把WeUI放到基础篇里,是因为WeUI是官方出品,并且 ...
- 使用MEF实现通用参数设置
通用后台管理系统必备功能模块包含日志管理,权限管理,数据字典,参数配置等功能.参数设置主要用于设置系统运行所需的一些基础性配置项,比如redis缓存,mq消息队列,系统版本等信息.好的参数设置需要达到 ...
- C++11笔记<一>
目录: 1.std::share_ptr智能指针: 2.std::tr1::function模板类: 3.stringstream: 4.set/vector/map: 5.static_cast&l ...
- centos6.4下安装php7+nginx+mariadb环境
一,安装php71,创建php用户和用户组,并在github下载php7源码#新建php用户和php组# groupadd -r php && useradd -r -g php -s ...