request其他用法

    ## session的使用

使用会话来完成请求,会话会自动帮我们保存和提交cookie

```python
user_agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
# 创建一个会话
session = requests.session()


# 1.请求登录页面
res = session.get("https://github.com/login",headers={
    "Referer": "https://github.com/",
    "User-Agent": user_agent
})
print(res.status_code)
token = re.search('name="authenticity_token" value="(.*?)"',res.text).group(1)
print(token)

# 2.发送登录请求,带上cookie,带上请求体
res2 = session.post("https://github.com/session",
                     headers = {
                         "Referer": "https://github.com/login",
                         "User-Agent": user_agent},
                     data={
                         "commit": "Sign in",
                         "utf8": "✓",
                         "authenticity_token": token,
                         "login": "oldboyedujerry",
                         "password": "123654asdAsd"},
                     allow_redirects = False
                     )

print(res2.status_code)

# 访问个人主页
res3 = session.get("https://github.com/settings/profile",
                    headers={
                        "User-Agent": user_agent,
                        "Referer": "https://github.com/login"
                    })

print(res3.status_code)

with open("tt.html","wt") as f:
    f.write(res3.text)
# 判断是否登录成功
print("oldboyedujerry" in  res3.text)
```

## response属性

```python
import requests
respone=requests.get('http://www.jianshu.com')
# respone属性
print(respone.text) # 获取解码后的内容 html
print(respone.content) # 获取二进制字节数据
print(respone.json()) # 对响应进行json反序列化
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.url)
print(respone.history) # 重定向历史
print(respone.encoding) # 响应体编码方式

#关闭:上下文管理
from contextlib import closing
with closing(requests.get('xxx',stream=True)) as response:
    for line in response.iter_content():
    pass
```

## 指定响应体编码

```python
import requests
response=requests.get('http://www.autohome.com/news')
response.encoding = "GBK"
print(response.text)
print(response.encoding)
```

## 分段获取数据

```python
# 当响应体数据太大的时候一次性获取所有可能造成内存溢出
# 可以使用iter_content 分段获取数据,
# chunk_size指定每次获取的长度,
# decode_unicode 是否进行解码 通常为false
import requests
respone = requests.get("https://www.qq.com")
with open("tt.html","wt") as f:
	for i in respone.iter_content(chunk_size=1024,decode_unicode=False):
        f.write(i)
```

## 获取原始套接字响应数据

```python
r = requests.get('https://api.github.com/events', stream=True)
# <requests.packages.urllib3.response.HTTPResponse object at 0x101194810>
print(r.raw.read(10))
```

## SSL Cert Verification

```python
#证书验证(大部分网站都是https)
import requests
respone=requests.get('https://www.12306.cn') #如果是ssl请求,首先检查证书是否合法,不合法则报错,程序终端


#改进1:去掉报错,但是会报警告
import requests
respone=requests.get('https://www.12306.cn',verify=False) #不验证证书,报警告,返回200
print(respone.status_code)


#改进2:去掉报错,并且去掉警报信息
import requests
from requests.packages import urllib3
urllib3.disable_warnings() #关闭警告
respone=requests.get('https://www.12306.cn',verify=False)
print(respone.status_code)

#改进3:加上证书
#很多网站都是https,但是不用证书也可以访问,大多数情况都是可以携带也可以不携带证书
#知乎\百度等都是可带可不带
#有硬性要求的,则必须带,比如对于定向的用户,拿到证书后才有权限访问某个特定网站
import requests
respone=requests.get('https://www.12306.cn',
                     cert=('/path/server.crt',
                           '/path/key'))
print(respone.status_code)
```

## 使用代理

```python
#官网链接: http://docs.python-requests.org/en/master/user/advanced/#proxies

#代理设置:先发送请求给代理,然后由代理帮忙发送(封ip是常见的事情)
import requests
proxies={
    'http':'http://112.98.126.100:8118',#带用户名密码的代理,@符号前是用户名与密码
    'https':'https://124.42.68.152:90',
}
respone=requests.get('https://www.baidu.com',
                     proxies=proxies)

print(respone.status_code)



#支持socks代理,安装:pip install requests[socks]
import requests
proxies = {
    'http': 'socks5://user:pass@host:port',
    'https': 'socks5://user:pass@host:port'
}
respone=requests.get('https://www.12306.cn',
                     proxies=proxies)

print(respone.status_code)
```

## 超时设置

```python
#超时设置
#两种超时:float or tuple
#timeout=0.1 #代表接收数据的超时时间
#timeout=(0.1,0.2)#0.1代表链接超时  0.2代表接收数据的超时时间

import requests
respone=requests.get('https://www.baidu.com',
                     timeout=0.0001)
```

## 捕获异常

```python
#异常处理
import requests
from requests.exceptions import * #可以查看requests.exceptions获取异常类型

try:
    r=requests.get('http://www.baidu.com',timeout=0.00001)
except ReadTimeout:
    print('===:')
# except ConnectionError: # 链接失败
#     print('-----')
# except Timeout: # 超时
#     print('aaaaa')

except RequestException: # 其他异常
    print('Error')
```

## 上传文件

```python
import requests
files={'file':open('a.jpg','rb')} # value为文件对象
respone=requests.post('http://httpbin.org/post',files=files)
print(respone.status_code)
```





## 



## 






    
posted @ 2019-01-23 19:22  不沉之月  阅读(117)  评论(0编辑  收藏  举报