http请求的难易对一门语言来讲是很重要的并且是愈来愈重要,但对于python一是urllib一些写法不太符合人的思惟习惯文档也至关难看,二是在python2.x和python3.x中写法还有差异。html
实在是太难用,开始差点因为这个缘由想放弃python,直到看urllib.request文档时看到下边这句话,认识了requests。总的而言requests配得上“HTTP for Humans”的口号。python
适用于python2.六、python2.七、python3.4及以上版本,参见官方说明。我这里使用的是当前最新的python3.7。json
pip install requests # ubuntu类系统也能够直接用apt安装 # sudo apt-get install python-requests
下边对于https的连接请求时会带上”verify=False“参数,由于默认Python会进行证书校验若是不是信任的证书会报错,带上”verify=False“指示不进行证书校验。ubuntu
import requests
import requests url='https://www.baidu.com' r = requests.get(url,verify=False) print(r.status_code)
import requests url='https://www.baidu.com' data='username=ls&password=toor' r = requests.post(url,data=data,verify=False) print(r.status_code)
当前不少api是以json形式提交的,因此在使用post的时候咱们可能想提交json数据。python3.x
提交json有两步:一是data要编码成json形式(python中的字典形式上和json同样但本质上不同因此要编码),二是设置“Content-type”头的值为application/json(设置头部参见下面2.5,这里先用)api
import json import requests # 必定要设置Content-Type值为application/json headers={} headers['Content-Type']='application/json' url='https://www.baidu.com' data={"username":"ls","password":"toor"} # 必定要用json.dumps把data格式化成json # r = requests.post(url,headers=headers,data=json.dumps(data),verify=False) # 或者直接使用json参数代替data,此时requests会自动进行格式化和设置Content-Type头的工做 r = requests.post(url,json=data,verify=False) print(r.status_code)
为了方便对比验证,另外再附curl post提交的方法:cookie
curl -H "Content-Type:application/json" -X POST --data '{"username": "ls","password":"toor"}' https://www.baidu.com/
import requests url='http://docs.python-requests.org/en/master/' proxies={ 'http':'127.0.0.1:8080', 'https':'127.0.0.1:8080' } r = requests.get(url,proxies=proxies) print(r.status_code)
import requests url='http://docs.python-requests.org/en/master/' headers={ 'User-Agent':'self-defind-user-agent', 'Cookie':'name=self-define-cookies-in header' } r = requests.get(url,headers=headers) print(r.status_code)
实验发现若是自定义header中定义了cookies那么此处设置的cookies不生效session
import requests
url='http://docs.python-requests.org/en/master/'
cookies={'name1':'cookie1','name2':'cookies2'}
#cookies=dict(name1='cookie1',name2='cookies2')
r = requests.get(url,cookies=cookies)
print(r.status_code)
常常不少请求只有在登陆后才能进行,实现登陆效果通常的作法是执行登陆请求,而后从返回结果中提取sessionid放入自定义cookie中。app
这种方法在requests中也行得通,但requests提供了更为简单的方法,直接使用request.Session类来请求便可,其保持登陆的原理是保留以前请求中服务端经过set-cookie等设置的参数。python2.7
s = Session() url='http://docs.python-requests.org/en/master/' # 全部方法和直接使用requests时同样用便可 s.get(url)
参考:
http://docs.python-requests.org/en/master/(官方文档)
http://www.javashuo.com/article/p-qhesnjmy-bt.html
https://stackoverflow.com/questions/9733638/post-json-using-python-requests