requests 快速入门
Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。
import requests # 发送请求
r = requests.get('https://github.com/timeline.json')
r = requests.post("http://httpbin.org/post")
r = requests.put("http://httpbin.org/put")
r = requests.delete("http://httpbin.org/delete")
r = requests.head("http://httpbin.org/get")
r = requests.options("http://httpbin.org/get")
先来看看GET请求吧
GET请求分为无参请求和有参请求两种:
无参请求:get方法中只接收到了url
有参请求:参数为URL的查询字符串传递某种数据。当你手工构建URL时,数据会以键/值对的形式置于URL中,跟在一个问号的后面,
requests提供了params关键字来接收字典数据或字符串数据。
# 无参数请求
import requests
ret = requests.get('https://github.com/timeline.json')
print ret.url
print ret.text # 有参数请求
# 注意:字典值为None不会传入url中,字典值为列表值会分开传入URL中 payload={'user':'kong','pwd':None,'email':['1@qq.com','2@qq.com']}
r = requests.get('https://github.com/timeline.json',params=payload)
print r.url
print r.text
结果:
https://github.com/timeline.json?user=kong&email=1%40qq.com&email=2%40qq.com
响应内容
requests请求时,会解析http头部来推测文档对应的编码。当访问r.text时,会使用其来对文档内容进行解码,以字符形式返回数据,大多数 unicode 字符集都能被无缝地解码.
当然你也可以使用r.encoding来自定义编码.
import requests r = requests.get('https://github.com/timeline.json')
print r.encoding
r.encoding ='ISO-8859-1'
print r.text
二进制数据响应内容
我们可以通过r.content方式以字节的方式来获取响应体内容,request会自动为你解码gzip和deflate编码的响应数据。
from PIL import Image
from io import BytesIO
# 直接获取字节数据来生成图片
i = Image.open(BytesIO(r.content))
json数据响应内容
requests中内置了json解码器,可直接解析json数据,如果失败则抛出异常。
import requests r = requests.get('https://github.com/timeline.json')
print r.json()
结果:
{u'documentation_url': u'https://developer.github.com/v3/activity/events/#list-public-events', u'message': u'Hello there, wayfaring stranger. If you\u2019re reading this then you probably didn\u2019t see our blog post a couple of years back announcing that this API would go away: http://git.io/17AROg Fear not, you should be able to get what you need from the shiny new Events API instead.'}
原始数据响应内容
在罕见情况下,你可能想获取来自文档的原始套接字。r.raw可以满足你的需求,但在url请求时请加上stream=True参数。
import requests r = requests.get('https://github.com/timeline.json',stream=True)
print r.raw
print r.raw.read(10)
结果:
<requests.packages.urllib3.response.HTTPResponse object at 0x0000000002A51320>
{"message"
当想把文本流保存成文件时,我们会推荐使用r.iter_content方式来获取文本流数据。
import requests r = requests.get('https://github.com/timeline.json',stream=True)
with open('test.txt','wb') as f:
for i in r.iter_content(10):
f.write(i)
定制请求头
如果你想为请求的url改变HTTP头部,需要给headers参数传递一个自定义字典。虽然在最后的请求时,所有的headers信息都被传递了进去,但requests不会因自定义的headers信息而改变自己的行为。
import requests MyHead = {'user-agent': 'my-app/0.0.1'}
r = requests.get('https://api.github.com/some/endpoint',headers=MyHead)
print r.text
post请求
表单数据的发送
传递一个dic给data参数,在requests发出请求时,传递的字典数据会自动编码成html表单形式数据随之一起发送。
import requests
import json
payload={'user':'kong','pwd':None,'email':['1@qq.com','2@qq.com']}
r = requests.post("http://httpbin.org/post",data=payload)
print r.text
结果:
{
"args": {},
"data": "",
"files": {},
"form": {
"email": [
"1@qq.com",
"2@qq.com"
],
"user": "kong"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Cache-Control": "max-age=259200",
"Content-Length": "43",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.11.1",
"Via": "1.1 squid.david.dev:3128 (squid/2.6.STABLE21)"
},
"json": null,
"origin": "172.10.236.215, 106.37.197.164",
"url": "http://httpbin.org/post"
}
定制请求头
如果你想为请求的url改变HTTP头部,需要给headers参数传递一个自定义字典。虽然在最后的请求时,所有的headers信息都被传递了进去,但requests不会因自定义的headers信息而改变自己的行为。
import requests MyHead = {'user-agent': 'my-app/0.0.1'}
r = requests.post('https://api.github.com/some/endpoint',headers=MyHead)
print r.text
字符串的发送
传递一个dic给json参数,在requests发出请求时,dic会被自动编码成json格式,直接发布出去
import requests
import json payload={'user':'kong','pwd':None,'email':['1@qq.com','2@qq.com']}
r = requests.post("http://httpbin.org/post",json=payload)
print r.text
结果:
{
"args": {},
"data": "{\"pwd\": null, \"user\": \"kong\", \"email\": [\"1@qq.com\", \"2@qq.com\"]}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Cache-Control": "max-age=259200",
"Content-Length": "64",
"Content-Type": "application/json",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.11.1",
"Via": "1.1 squid.david.dev:3128 (squid/2.6.STABLE21)"
},
"json": {
"email": [
"1@qq.com",
"2@qq.com"
],
"pwd": null,
"user": "kong"
},
"origin": "172.10.236.215, 106.37.197.164",
"url": "http://httpbin.org/post"
}
传递一个string给data参数,在requests发出请求时,传递的字符串会被直接发布出去。
import requests
import json payload={'user':'kong','pwd':None,'email':['1@qq.com','2@qq.com']}
r = requests.post("http://httpbin.org/post",data=json.dumps(payload))
print r.text
结果:
{
"args": {},
"data": "{\"pwd\": null, \"user\": \"kong\", \"email\": [\"1@qq.com\", \"2@qq.com\"]}",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Cache-Control": "max-age=259200",
"Content-Length": "64",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.11.1",
"Via": "1.1 squid.david.dev:3128 (squid/2.6.STABLE21)"
},
"json": {
"email": [
"1@qq.com",
"2@qq.com"
],
"pwd": null,
"user": "kong"
},
"origin": "172.10.236.215, 106.37.197.164",
"url": "http://httpbin.org/post"
}
再来看看响应信息吧
响应状态码
我们可以通过r.status_code来获取url爬取状态,通过r.raise_for_status()来抛出异常
import requests r = requests.post("http://httpbin.org/post")
print r.status_code
print r.raise_for_status()
结果:
200
None
响应头
在response数据中,我们会得到一个专为http头部而生的python字典响应头,根据RFC2612,http头部大小写是不敏感的。
import requests r = requests.post("http://httpbin.org/post") print r.headers
print r.headers['content-length']
print r.headers.get('via')
结果:
{'Content-Length': '448', 'Via': '1.0 squid.david.dev:3128 (squid/2.6.STABLE21)', 'Proxy-Connection': 'keep-alive', 'X-Cache': 'MISS from squid.david.dev', 'X-Cache-Lookup': 'MISS from squid.david.dev:3128', 'Server': 'nginx', 'Access-Control-Allow-Credentials': 'true', 'Date': 'Thu, 29 Dec 2016 07:35:26 GMT', 'Access-Control-Allow-Origin': '*', 'Content-Type': 'application/json'}
448
1.0 squid.david.dev:3128 (squid/2.6.STABLE21)
响应cookie
有些响应中会有cookie信息,你可以这样获取
r = requests.post("http://httpbin.org/post")
print r.cookies
可以通过cookies参数发送cookie信息到服务器
import requests cookies = dict(cookies_are='working')
r = requests.post("http://httpbin.org/post",cookies=cookies)
print r.text
结果:
{
"args": {},
"data": "",
"files": {},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Cache-Control": "max-age=259200",
"Content-Length": "0",
"Cookie": "cookies_are=working",
"Host": "httpbin.org",
"User-Agent": "python-requests/2.11.1",
"Via": "1.1 squid.david.dev:3128 (squid/2.6.STABLE21)"
},
"json": null,
"origin": "172.10.236.215, 106.37.197.164",
"url": "http://httpbin.org/post"
}
重定向与请求历史
重定向:默认情况下,head不能自动处理重定向,可以通过allow_redirects=True来启用自动处理重定向
GET、OPTIONS、POST、PUT、PATCH 或者 DELETE可以自动处理重定向,可以通过allow_redirects=False来禁用重定向
可以使用r.history方法来追踪重定向,是一个 Response
对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。
r = requests.head('http://github.com')
print r.url
print r.history
结果:head无法处理重定向
http://github.com/
[] r = requests.head('http://github.com',allow_redirects=True)
print r.url
print r.history
结果:head启用了自动处理重定向
https://github.com/
[<Response [301]>]
r = requests.get('http://github.com')
print r.url
print r.status_code
print r.history
结果:http被自动处理重定向为https
https://github.com/
200
[<Response [301]>] r = requests.get('http://github.com', allow_redirects=False)
print r.url
print r.status_code
print r.history
结果:get禁用了自动处理重定向
http://github.com/
301
[]
超时
可以传递一个数值给timeout参数,来设置请求后的最大应达时间,如果在此时间内没有应答,将会引发一个异常。
requests.get('http://github.com', timeout=0.001)
错误与异常
网络问题:ConnectionError
返回不成功的状态码:r.raise_for_status()抛出一个HTTPError
请求超时:Timeout
超过最大重定向次数:TooManyRedirects
实例讲解:
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ import requests
# 登陆任何页面获取cookes
ck = requests.get(url="http://dig.chouti.com")
cookies = ck.cookies.get_dict() # 用户登陆,携带上一次的cookie,获取最新的cookie
payload = {
'phone':'8615xx',
'password':'xx',
'oneMonth':"",
}
login = requests.post("http://dig.chouti.com/login",
data=payload,
cookies=cookies)
# 点赞
dian = {"linksId":""}
# requests.post(url="http://dig.chouti.com/link/vote",
# cookies=cookies,
# data=dian)
# 减赞
requests.post(url="http://dig.chouti.com/vote/cancel/vote.do",
cookies=cookies,
data=dian)
登陆抽屉并点赞
#!/usr/bin/env python
# _*_ coding:utf-8 _*_ import requests s = requests.Session()
s.get(url="http://dig.chouti.com") payload = {
'phone':'',
'password':'kongzhagen.com',
'oneMonth':"",
}
s.post("http://dig.chouti.com/login",data=payload) dian = {"linksId":""}
# 点赞
s.post(url="http://dig.chouti.com/link/vote",data=dian)
# 减赞
# s.post(url="http://dig.chouti.com/vote/cancel/vote.do",data=dian)
另一种方法
requests 快速入门的更多相关文章
- 转:Python requests 快速入门
迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: ·Requests 已安装 ·Reques ...
- Python Requests快速入门
迫不及待了吗?本页内容为如何入门Requests提供了很好的指引.其假设你已经安装了Requests.如果还没有, 去 安装 一节看看吧. 首先,确认一下: Requests 已安装 Requests ...
- requests快速入门
Requests 是唯一的一个非转基因的 Python HTTP 库,人类可以安全享用. 警告:非专业使用其他 HTTP 库会导致危险的副作用,包括:安全缺陷症.冗余代码症.重新发明轮子症.啃文档症. ...
- GitHub新手快速入门日常操作流程
GitHub新手快速入门日常操作流程 1. 注册帐号 打开https://github.com/,填写注册信息并提交. 2. 登录帐号 打开https://github.com/login,输入注册的 ...
- Nginx快速入门菜鸟笔记
Nginx快速入门-菜鸟笔记 1.编译安装nginx 编译安装nginx 必须先安装pcre库. (1)uname -a 确定环境 Linux localhost.localdomain 2.6. ...
- AngularJS快速入门指南09:SQL
我们可以将之前章节中的代码用来从数据库中读取数据. 通过PHP Server从MySQL数据库中获取数据 <div ng-app="myApp" ng-controller= ...
- Java程序员快速入门Go语言
这篇文章帮助Java程序员快速入门Go语言. 转载至 开源中国社区. http://www.oschina.net 本文将以一个有代表性的例子为开始,以此让Java程序员对Go语言有个初步认识,随后将 ...
- JAVA WEB快速入门之从编写一个基于SpringMVC框架的网站了解Maven、SpringMVC、SpringJDBC
接上篇<JAVA WEB快速入门之通过一个简单的Spring项目了解Spring的核心(AOP.IOC)>,了解了Spring的核心(AOP.IOC)后,我们再来学习与实践Maven.Sp ...
- 【Flask-RESTPlus系列】Part1:快速入门
0x00 内容概览 Flask-RESTPlus安装 快速入门 初始化 一个最简单的API示例 资源路由 端点 参数解析 数据格式化 顺序保留 完整例子 0x01 Flask-RESTPlus安装 1 ...
随机推荐
- 一些Layout的坑。坑死我自己了
iOS这个东西,初学感觉,还好还好,然后一年之后再来修复一下初学的时候的代码,我只是感觉头很晕- - 别扶我. AutoLayout的坑,明明以前都没有的!!!升了iOS10就突然发现了这个坑,其实也 ...
- 学习SVG系列(5):SVG渐变
SVG渐变 渐变是一种从一种颜色到另一种颜色的平滑过渡,可以把多个颜色的过渡应用到同一个元素. 渐变有两种: Linear Redial 线性渐变-<linearGradient> lin ...
- 背景建模post_processing常用opencv函数(怒了)
1.saturate_cast<uchar>来说,就是把数据转换成8bit的0~255区间,负值变成0,大于255的变成255.如果是浮点型的数据,变成round最近的整数 2.cv::M ...
- 十个最适合 Web 和 APP 开发的 NodeJS 框架
在浏览器以外运行 JavaScript 对于 JavaScript 爱好者来说非常神奇,同时也肯定是 web 应用程序开发界最受欢迎的进步之一.全球各地的开发者张开双臂拥抱 NodeJS. 对于新手来 ...
- AllanCodeMaker 代码生成器 release0.9.0 下载 支持C#,Java,可自订模板
接我前面的文章(2015-8-18 更新下载链接) http://www.cnblogs.com/allanyang/p/4687534.html 这几天事情多,所以改动不大,修改了一些小细节.公司那 ...
- background-origin和background-clip的区别
background-origin和background-clip是CSS3内新增加的属性,其实一个是对背景图片的放置,另一个是对背景图片的剪裁. background-origin和backgrou ...
- PHPnow在win8下安装失败的解决办法
提示: 安装服务[ Apache_pn ]失败,可能原因如下:1.服务名已存在,请卸载或使用不同服务名.2.非管理员权限,不能操作Window NT服务. 解决方案: 搜索:命令提示符 , 右键以 ...
- Maven学习笔记(1)之安装Maven
此笔记是学习Maven时自己摸索+各种百度而来,并非全部原创,望与各位一同学习,勿拍~勿拍~ 安装步骤 1.下载Maven的最新版本,地址:http://maven.apache.org/downlo ...
- js 控制框架页面跳转 top.location.herf = "url"
top.location.href和localtion.href有什么不同 top.location.href=”url” 在顶层页面打开url(跳出框架) self.locatio ...
- android 瀑布流效果 保存地址
http://tech.ddvip.com/2013-09/1379785198203013_2.html