一、requests库
安装:pip install requests
导包:import requests
1.requests库的使用:
(1).请求方法:
Requests的请求不再像urllib一样需要去构造各种Request、opener和handler,直接使用Requests构造的方
法,并在其中传入需要的参数即可。
每一个请求方法都有一个对应的API:
①发送GET请求:get()方法
response = requests.get('http://httpbin.org/get')
print(response) #返回的是<Response [200]>。
print(response.text) #获取响应内容,一般情况下会自动解码成字符串
#当然我们也可以通过response.encoding指定编码格式
response.encoding = 'utf-8'
print(response.encoding) #通过这看编码格式
②发送POST请求:post()方法
POST请求请求可通过 data参数,字典格式,传入表单数据。
response = requests.post('http://httpbin.org/post',data = {'key':'value'})
print(response.text)
'''
其实data就是要填入表单的数据,说到这是不是和urllib3中post请求的fields参数一样是字典且填入form表
单,而get请求的fields参数是直接作为查询参数添加到url后。
'''
(2).requests响应: 返回值
1.响应内容: text属性
通过Requests发起请求获取到的是一个 requests.models.Response 对象,通过这个对象我们可以很方便的获取响应的内容。
之前通过 urllib 获取的响应的内容都是 bytes的二进制格式,需要我们自己去将结果 decode()一次转换成字符串数据。而Requests通过text属性,就可以获得字符串格式的响应内容。
例1:
response = requests.get('http://www.quanshuwang.com')
print(response.text)
#回忆一下乱码怎么办,response.encoding = '**',**得看html中得charset是什么。
response.encoding = 'utf-8' #字符编码
2.二进制数据:content属性
*若想要获得原始得二进制数据,比如说图片,使用 content 属性即可。
例1:爬取图片,如图 2-1、2-2。
response = requests.get('图片地址')
with open('image.jpg','wb') as f:
f.write(response.content)
3.json数据:json()方法
*若访问之后获取的是json数据,那么我们可以使用 json() 方法,直接获取转换成字典格式的数据。
例1:爬取图片
response = requests.get('http://httpbin.org/get')
print(response.json())
print(type(response.json() ) )
4.状态码:status_code 属性
*通过 status_code 属性获取响应的状态码.
例1:
response = requests.get('')
print(response.status_code)
5.响应报头:headers 属性
*通过 headers 属性获取响应的报头。
例1:
response = requests.get('')
response.headers #快捷方式
response.request.headers #完整写法
print(type(response.headers))
#返回的是<class 'requests.structures.CaseInsensitiveDict'>
print(response.headers['Set-COOKIE']) #注意键名不区分大小写,键值是区分的。
6.服务器返回的Cookies: cookies 属性
*通过 cookies 属性获取服务器返回的Cookies。
例1:
# http://httpbin.org/get没有cookie
response = requests.get('http:/www.baidu.com')
print(response.cookies)
7.查看请求的 url:url属性
#通过 url 属性查看请求的 url。
print(requests.url ) #返回请求url,这个是快捷方式。
response.request.url #响应是没有url的,只有数据
(3)请求的十大参数: 参数
1、url:目标数据的统一资源定位符,字符串。
例、
img_url = "https://zhidao.baidu.com"
response = requests.get(url = img_url)
2.params : 传递请求参数 , 字典形式。
传递 url 参数也不用再像urllib中那样需要去拼接URL,而是简单的,构造一个字
典,并在请求时将其传递给 params 参数。
例1:
args = {'key1':'好好学习','key2':'天天向上'}
response = requests.post('http://httpbin.org/post',params = args )
print(response.text) #获取响应数据,为字符串类型。
print(response.request.url) #看拼接的结果
print(response.url) #
有时候会遇到相同的url参数名,但有不同的值,而python的字典又不支持键的重名,那么我们可以把键的值用 列表 表示。
例1:
args = {'key1': 'value1', 'key2': ['value2', 'value3']}
response = requests.get('http://httpbin.org/get', params=args)
print(response.url)
结果: http://httpbin.org/get?key1=value1&key2=value2&key2=value3
3.data : 传递表单数据 , 字典形式。
info = {'username':'wsq','password':'123'}
response = requests.post('http://httpbin.org/post',data = info)
4.headers : 自定义请求头(Headers) , 字典形式。
*若想自定义请求的Headers,同样的将字典数据传递给headers参数。
例:
headers = {'Www':'wWqQ'}
response = requests.post('http://httpbin.org/post',data = info,params = args
headers = headers)
#只需填一个参数即可,注意是字典格式
print(response.request.headers)#查看请求头
print(response.request.headers['wWw'])#查看请求头中某一个键值,注意键名不区分大小写而键值是区分 的。
5.cookies : 自定义Cookie, 字典形式。
Requests中自定义Cookies时也不用再去构造CookieJar对象,直接将字典传递给cookies参数即可。
例:
cookie = {'key1': 'value1'}
response = requests.post('http://httpbin.org/post',data = info,params = args
headers = headers,
cookies = cookie)
print(response.cookies)#看它的cookie,若没设置返回的是<RequestsCookieJar[]>是空的。
6.设置代理: proxies , 字典形式。
代理:意味着客户端发送请求给代理,代理替客服端发送请求到服务端。
当需要代理时,同样构造代理字典,传递给参数 proxies。
例1:
proxy = {
'http':'http://182.11.66.999:8000'
#这里可以有很多个http或者https,这就涉及了代理池。
}
response = requests.get('http://httpbin.org/ip',proxies = proxy)
#用代理发送get请求到ip接口
print(response.text) #这时返回的是ip地址,这个ip就是代理的,保护了自身ip。
7.allow_redirects重定向: 默认为True,设置为False,关闭。
在网络请求中,常常遇到状态码是 3 开头的重定向问题,在Requests中是默认开启允许重定向的,也就是遇到重 定向问题,会自动继续访问。
例1:
response = requests.get('http://github.com')
print(response.url)#这时显示的是https的地址
response = requests.get('http://github.com',allow_redirects=False)
#加上参数allow_redirects并赋值为False,意味着不允许重定向。
print(response.text)#这个打印的结果是没有的,
print(response.headers)#响应头中会看到键名为Location的键值对,这就是重定向地址,在JS中....如 图6-1、6-2
8.verify: 证书验证 , 默认为None,当遇到例如SSL验证等设置为False即可,但会给出警告。
有时使用抓包工具,会出现因为抓包工具提供的证书并不是由受信任的数字证书颁发机构颁发的,所以证书的验证会 失败,所以我们就需要关闭证书验证。在请求的时候把 verify 参数设置为 False 就可以关闭证书验证了。 但是关闭证书验证后,会出现 warning。可使用以下方法关闭:
requests.packages.urllib3.disable_warnings()
例1:
response = requests.get('https://www.quanshuwang.com')
print(response.text)#会出现 SSLError 错误,如图7-1
#当我们加上verify 参数时就好了
response = requests.get('https://www.quanshuwang.com',verify = False)
print(response.text)
运行这段代码时会报错:
requests.exceptions.SSLError:HTTPSConnectionPool(host='www.quanshuwang.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:841)'),)) 。这时我们只需加一个verify = False 即可。
9.timeout: 设置超时.以秒为单位。
例1:
response = requests.get('http://github.com',timeout = 0.001)
print(response.text)
#若超时会出现:requests.exceptions.ConnectTimeout
10.json : 提交JSON数据。
注意:参数data与json同时有时,json为空。
例:
json = {'华夏':'豪杰'}
response = requests.get('http://github.com',json = json)
print(response.text)