1、发送HTTP请求,可以带参数或不带
import requests
r=requests.get(url,params,kwargs)
r=requests.post(url,data,json,kwargs)
2、响应对象的获取
Response.text:获取响应正文文本内容
Response.content:获取响应正文的二进制字节内容
Response.json();获取响应正文的json串,并对其进行json decode操作,返回一个字典
Response.status_code:获取响应的状态码
Response.raise_for_status():如果响应状态是40X或50X,可以使用此方法抛出一下异常
Response.headers:获得响应结果的头部相关信息
r.raw :返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
3、发请求时,可以传入修改的请求头,如:
headers = {'Accept':'text/html,application/xhtml/+xml,application/xml;',
'Accept-Encoding':'gzip',
'Accept-Language':'zh-CN,zh;q=0.8',
'Referer':'http://www.example.com',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chorme/42.0.2311.90 Safari/537.36'
}
res1 = requests.post(url1, data=data, headers=headers)
4、发送post请求
application/x-www-form-urlencoded
最常见post提交数据的方式,以form表单形式提交数据。
application/json
以json串提交数据。
multipart/form-data
一般使用来上传文件。
4.1以表单形式发送请求,只需将请求的参数构造成一个字典传给data参数即可
url='http://httpbin.org/post'
d={'key1':'value1','key2':'value2'}
r=requests.post(url,data=d)
4.2以json格式发送请求,将一个json串传给data参数即可
像urllib和urllib2,如果用到json,就要引入新模块,如json和simplejson,但在requests中已经有了内置的函数,r.json()。
就拿查询IP的API来说
import requests
#import json ???
url='http://httpbin.org/post'
s=json.dumps({'key1':'value1','key2':'value2'})
r=requests.post(url,data=s)
4.3以multipart形式发送post请求,将一个文件传给files参数即可
url='http://httpbin.org/post'
files={'file':open('123.txt','rb')}
#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))} #显式的设置文件名
r=request.post(url,files=files)
拓展:
更加方便的是,你可以把字符串当着文件进行上传:
复制代码
import requests
url = 'http://127.0.0.1:5000/upload'
files = {'file': ('test.txt', b'Hello Requests.')} #必需显式的设置文件名
r = requests.post(url, files=files)
print(r.text)
5、Cookie设置
5.1获取响应的cookies
Response.cookies
5.2发送带cookies的请求,将cookies字典传给参数cookies即可
url='http://httpbin.org/post'
cookies={'cookies_are':'working'}
r=requests.get(url,cookies=cookies)
5.3请求的超时设置,只需在post方法的timeout参数设置一个值即可,timeout 仅对连接过程有效,与响应体的下载无关
url='http://httpbin.org/get'
r=requests.get(url,timeout=0.001)
6、异常
ConnectionError
由于网络原因,无法建立连接。
HTTPError
如果响应的状态码不为200,Response.raise_for_status()会抛出HTTPError 异常。
Timeout
超时异常。
TooManyRedirects
若请求超过了设定的最大重定向次数,则会抛出一个 TooManyRedirects 异常。
7、身份验证
基本身份认证(HTTP Basic Auth):
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
# r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd')) # 简写print(r.json())
另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:
requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))
8、 代理访问
采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。
import requests
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://www.zhidaow.com", proxies=proxies)
如果代理需要账户和密码,则需这样:
proxies = {
"http": "http://user:pass@10.10.1.10:3128/",
}
9、Cookies与会话对象
如果某个响应中包含一些Cookie,你可以快速访问它们:
import requests
r = requests.get('http://www.google.com.hk/')
print(r.cookies['NID'])
print(tuple(r.cookies))
要想发送你的cookies到服务器,可以使用 cookies 参数:
复制代码
import requests
url = 'http://httpbin.org/cookies'
cookies = {'testCookies_1': 'Hello_Python3', 'testCookies_2': 'Hello_Requests'}
# 在Cookie Version 0中规定空格、方括号、圆括号、等于号、逗号、双引号、斜杠、问号、@,冒号,分号等特殊符号都不能作为Cookie的内容。
r = requests.get(url, cookies=cookies)
print(r.json())
复制代码
会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
下面就来一个真正的实例,如下是快盘签到脚本:
复制代码
import requests
headers = {'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, compress',
'Accept-Language': 'en-us;q=0.5,en;q=0.3',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:22.0) Gecko/20100101 Firefox/22.0'}
s = requests.Session()
s.headers.update(headers)
# s.auth = ('superuser', '123')
s.get('https://www.kuaipan.cn/account_login.htm')
_URL = 'http://www.kuaipan.cn/index.php'
s.post(_URL, params={'ac':'account', 'op':'login'},
data={'username':'****@foxmail.com', 'userpwd':'********', 'isajax':'yes'})
r = s.get(_URL, params={'ac':'zone', 'op':'taskdetail'})
print(r.json())
s.get(_URL, params={'ac':'common', 'op':'usersign'})