3、requests

requests是使用Apache2 licensed 许可证的HTTP库。

用python编写,比urllib2模块更简洁,本质就是封装了urllib3。

Request支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

在python内置模块的基础上进行了高度的封装,从而使得python进行网络请求时,变得人性化,使用Requests可以轻而易举的完成浏览器可有的任何操作。

requests会自动实现持久连接keep-alive

安装

pip install requests

使用

requests.get(‘https://github.com/timeline.json’)                                # GET请求
requests.post(“http://httpbin.org/post”)                                        # POST请求
requests.put(“http://httpbin.org/put”)                                          # PUT请求
requests.delete(“http://httpbin.org/delete”)                                    # DELETE请求
requests.head(“http://httpbin.org/get”)                                         # HEAD请求
requests.options(“http://httpbin.org/get” )                                     # OPTIONS请求

传参

字典传递参数params,如果值为None的键不会被添加到url中

如果是get请求,那么会自动拼接在url后面

如果是post请求,requests默认使用application/x-www-form-urlencoded对POST数据编码,内部自动将参数序列化为json

import requests

params = {
    'wd':'python'
}

resp = requests.get('https://www.baidu.com/s',params=params)

print(type(resp))
print(resp.status_code)

'''
<class 'requests.models.Response'>
200
'''

Response

requests的get、post等方法的返回值就是一个Response对象

r = requests.get('https://www.baidu.com/')
r.encoding  #获取当前的编码
r.encoding = 'utf-8'  #设置编码
r.text  #以encoding设置解析返回内容。字符串方式的响应体,会自动根据响应头部的字符编码进行解码。
r.content  #以字节形式(二进制)返回。字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩。
r.headers  #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.status_code  #响应状态码
r.raw  #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read()   
r.ok   # 查看r.ok的布尔值便可以知道是否登陆成功
#*特殊方法*#
r.json()  #Requests中内置的JSON解码器,以json形式返回,前提返回的内容确保是json格式的,不然解析出错会抛异常
r.raise_for_status()  #失败请求(非200响应)抛出异常

请求头和cookie

只需要将字典形式的请求头和cookie传入headerscookies就可以了

from email import header
import requests

headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
cookies = {
    'cookieKey':'cookieValue'
}

resp = requests.get('https://www.baidu.com/',headers=headers,cookies=cookies)


print(resp.status_code)

'''
200
'''

代理

将代理以字典形式传入proxies就可以

from email import header
import requests

proxies = {
    'http':'103.37.141.69:80',
    'https':'103.37.141.69:80'
}

resp = requests.get('https://www.baidu.com/',proxies=proxies)


print(resp.status_code)

'''
200
'''

超时

单位:秒

r = requests.get('url',timeout=1) 

会话对象

能够跨请求保持某些参数,访问时使用session对象进行访问就可以了

import requests

session = requests.Session()
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'
}
cookies = {
    'cookieKey':'cookieValue'
}
proxies = {
    'http':'103.37.141.69:80',
    'https':'103.37.141.69:80'
}

resp = session.get('https://www.baidu.com/',headers=headers,cookies=cookies,proxies=proxies)


print(resp.status_code)

'''
200
'''

文件上传

import requests

upload_files = {'file': open('report.xls', 'rb')}
r = requests.post(url, files=upload_files)