python requests模块upgrade_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)

默认情况下, verify 是设置为 True 的,如果SSL认证失败,可以尝试将verify验证关闭,verify=False

更多高级使用,请查看 http://docs.python-requests.org/zh_CN/latest/user/advanced.html

1 #!/usr/bin/env python

2 #-*- coding: utf-8 -*-

3

4 """

5 微信端抽奖活动6 多线程抽奖,测试前提:去掉一个用户只能参与一次的限制7 """

8 importrequests9 from time importctime10 importthreading11

12

13 defdraw_lottery():14 lottery_url = "http://10.1.102.75:8000/activity/gsdzzlottery/lottery"

15 headers ={16 #微信UA

17 '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',18 #用户cookie

19 'cookie': 'gr_user_id=2e25dc22-6d3a-4190-86ce-2f0a04f357f5; Hm_lvt_0d8e9cf3502496036a00d10b24863c6d=1478072857,1480158524; PHPSESSID=786dcb5b1233dadc80817ea0e58a5de0'

20 }21 try:22 conn = requests.get(lottery_url, headers=headers, verify=False)23 printconn.text24 exceptException, e:25 printe26

27

28 if __name__ == '__main__':29 print 'start:', ctime()30 for j in range(2):31 threads = 300

32 threads_list =[]33 for i inrange(threads):34 t = threading.Thread(target=draw_lottery, args=())35 threads_list.append(t)36 for i inrange(threads):37 threads_list[i].start()38 #keep thread

39 for i inrange(threads):40 threads_list[i].join()41

42 print 'end:', ctime()

结合threading,测试微信页面并发抽奖小demo

#!/usr/bin/env python#-*- coding: utf-8 -*-

"""使用装饰器,并发请求"""

importrequestsfrom time importctimeimportthreadingdefthread_request(count, loop):"""并发请求装饰器,count: 线程数 ; loop: 循环次数"""

defouter(main_func):definner():#print "before %s" % main_func

for j inrange(loop):

threads_list=[]for i inrange(count):

t= threading.Thread(target=main_func, args=())

threads_list.append(t)for th inthreads_list:

th.start()#keep thread

for th inthreads_list:

th.join()#print "after %s" % main_func

returninnerreturnouter

@thread_request(count=2, loop=2)defget_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)printconn.textexceptException, e:printe

@thread_request(count=2, loop=1)deflogin():print "do login"

if __name__ == '__main__':print 'start:', ctime()

get_result()print 'end:', ctime()

使用装饰器,并发请求

***微信扫一扫,关注“python测试开发圈”,了解更多测试教程!***

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值