requests模块说明
1、requests是使用Apache2 Licensed许可证的HTTP库,用Python编写
2、Python 标准库中的 urllib2 模块提供了所需要的大多数 HTTP 功能,但是它的API太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务
3、requests库支持HTTP连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL和POST数据自动编码
requests模块介绍
1、HTTP就是一个发送请求和获取响应的过程,而requests模块只需要一步就能完成这样的一个过程,并且requests支持所有的HTTP请求的方法和响应数据
⑴通常发起HTTP请求都是通过浏览器(客户端)完成的,在使用requests模块发起请求时,就相当于绕过了浏览器等客户端了
2、以下为requests模块的基本语法介绍:
response = requests.请求方法(URL,**kwargs)
注:
1、其中URL参数是必填的,毕竟HTTP请求就是对指定的URL进行发送,其他各种参数可根据实际请求的需要选择性使用(这里先使用可变关键字参数代替)
2、发送请求后会返回响应结果:响应结果是一个Response对象<class 'requests.models.Response'>
⑴把响应结果赋值给变量,也就是这里的response变量。然后就可以使用Response对象的方法或属性来获取我们想要的具体的响应内容
⑵至于Response对象包括了哪些具体的响应内容,后面会一一介绍
requests模块包含方法
1、常见的HTTP请求方式有GET、POST等,这些请求方式在requests模块中都是支持的
2、在requests模块中,可以通过调用不同的方法来实现不同的请求方式
3、以下为requests模块中定义的不同的请求方式对应的方法函数
方法 | 说明 |
requests.request( ) | 构造一个请求,支撑以下各个方法的基础方法 |
requests.get( ) | 获取返回HTML网页的主要方法,对应HTTP的GET方法 |
requests.post( ) | 向HTML网页提交post请求的方法,对应HTTP的POST方法 |
requests.head( ) | 获取HTML网页信息头的主要方法,对应HTTP的HEAD方法 |
requests.put( ) | 向HTML网页提交put请求的方法,对应HTTP的PUT方法 |
requests.patch( ) | 向HTML网页提交局部修改的请求,对应HTTP的PATCH方法 |
requests.delete( ) | 向HTML网页提交删除请求,对应HTTP的DELETE方法 |
response对象的属性
1、发送请求后会返回响应结果:响应结果是一个Response对象<class 'requests.models.Response'>
⑴把响应结果赋值给一个response变量。然后就可以使用response对象的方法或属性来获取我们想要的具体的响应内容
2、返回的response对象内包含了整个返回内容,但某些返回内容是我们需要的,有些返回内容不是我们需要的。因此response对象就提供了许多方法和属性来供我们获取response对象中具体的一些内容
2、response对象常见的一些属性和方法,如下
属性 | 说明 |
response.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
response.text | HTTP响应内容的字符串形式,即URL对应的页面内容(获取返回的主体) |
response.headers | 获取返回的信息头 |
response.cookies | 获取返回的cookie |
response.encoding | 从HTTP header中获得响应内容的编码方式 |
response.apparent_encoding | 从内容中分析出的响应内容的编码方式(备选编码方式) |
response.content | HTTP响应内容的二进制形式(爬图片、视频之类的后可以用这种格式保存) |
response.json( ) | 针对响应为json字符串解码为python字典(响应为Json格式时才能用该函数):前提是响应为json格式,使用该方法会自动将json格式的响应转为Python字典 |
response.url | 返回访问的URL |
response.encoding = 'utf-8' | 设置响应报文编码 |
response.ok | 查看Response.ok的布尔值便可以知道是否登陆成功 |
response.raise_for_status( ) | 失败请求(非200响应)抛出异常 |
reuqests模块中的request()方法
1、前面介绍了request()方法的作用是:构造一个请求,支撑其他各种方法
⑴也就是说,其他的方法(如get、post方法都是基于这个方法实现的)
⑵就是在request()方法的基础上再封装了一次,让使用者能更方便的使用(至于是怎么再次封装的,后面介绍)
2、request()方法的语法为:request(method, url, **kwargs)
⑴method参数:表示请求方法,必填参数。常见有GET请求,POST请求(此外还有HEAD、PUT、PATCH、DELETE)
⑵url参数:请求的URL地址,必填参数
⑶kwargs参数:表示一些服务器与客户端通讯过程中支持的参数。requests模块中一般有13个参数
①这些参数是可选的,因此使用的是可变关键字参数
②是一个可变的关键字参数类型,在传实参时,以关键字参数的形式传入,python会自动解析成字典的形式
3、request()方法源码:
例1:
例2:
# 导入requests模块
import requests
# 调用request方法来构造一个请求,请求方式为GET,请求的URL地址为https://hao.360.com/,无可选参数
response = requests.request("GET","https://hao.360.com/")
print(response)
print(type(response))
# 以字符串输出响应主体
print(response.text)
"""
<Response [200]>
<class 'requests.models.Response'>
<!DOCTYPE html>
<!--[if lt IE 7 ]><html class="ie6" lang="zh-cn"><![endif]-->
<!--[if IE 7 ]><html class="ie7" lang="zh-cn"><![endif]-->
<!--[if IE 8 ]><html class="ie8" lang="zh-cn"><![endif]-->
<!--[if IE 9 ]><html class="ie9" lang="zh-cn"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html class="" lang="zh-cn"><!--<![endif]-->
<head>
<meta charset="utf-8" />
<title>360导航_一个主页,整个世界</title>
......
"""
kwargs参数详解
1、kwargs参数:表示一些服务器与客户端通讯过程中支持的参数。requests模块中一般有13个参数。是一个可变的关键字参数类型
2、另外:request()方法是requests库其他所有方法的基础:get()方法、post()方法等
⑴所以**kwargs这十三个参数并不是request()方法独有的,而是适用于request()方法以及其延伸出的六种方法(get方法、post方法等)
⑵get()、post()等方法底层调用的就是request()方法,而request()方法支持这13种可变关键字参数,因此get()、post()等方法也是支持这13种可变关键字参数的(只是说有些请求方法可能用不到某些参数)
3、客户端在与服务器进行通信的过程中,会存在需要客户端来向服务器提交一些数据或身份验证信息的情况。这个时候就需要用到这13个参数中的某些参数了
⑴在使用requests模块中的方法进行请求时,我们可以自己选择是否传入一些参数(以关键字的形式传入)来达到我们的请求目的
⑵这13个参数可以选择不传入;或传入了参数,但其值为None,都不会影响到请求结果(前提是请求合法)
4、kwargs的详细参数如下:
参数 | 作用 |
params | 查询字符串参数:字典或字节序列,作为参数增加到url中 |
data | 表单数据:字典、字节序列或文件对象,作为Request的内容 |
json | Json数据:JSON格式的数据,作为Request的内容 |
headers | 请求头:字典、HTTP定制头 |
cookies | Cookie信息:字典或CookieJar, Request中的cookie |
auth | 元组,支持HTTP认证功能 |
files | 字典类型,传输文件 |
timeout | 设定超时时间,秒为单位 |
proxies | 字典类型,设定访问代理服务器,可以增加登录认证 |
allow_redirects | 重定向开关:True/False, 默认为True |
stream | 获取内容立即下载开关:True/False, 默认为True |
verify | 认证SSL证书开关:True/False, 默认为True |
cert | 本地SSL证书路径 |
例3:
# 导入requests模块
import requests
# 可选参数为params
response = requests.request("GET","https://hao.360.com/",params={"a":1,"b":2})
print(response.url)
# 可选参数为params:13个关键参数,传入的参数但其值为None是对请求没有影响的(前提请求时正确的)
response = requests.request("GET","https://hao.360.com/",params=None)
print(response.url)
"""
https://hao.360.com/?a=1&b=2
https://hao.360.com/
"""
reuqests模块中的get()方法
1、HTTP请求中的GET方法,是最常见的请求方式。一般用户向服务器获取数据(也可以提交数据:如通过查询字符串参数提交数据等)
2、requests模块中get()方法对应着HTTP请求中的GET方法:通过调用get()方法来实现GET请求
3、get()方法的语法为:get(url, params=None, **kwargs)
4、其源码为:
例4:
注:
1、get()方法中会经常用到params参数,所以在get方法源码中将其单独提出来,其余12个参数就没单独提出来。这个其实没啥影响,param参数也是可以传,也可以不传;其他12个参数也是一样的
2、kwargs13个参数,如果传入了参数,但是其值时None的话,是对请求没有影响的。就相当于没传这个参数的
URL参数
1、URL参数是唯一的必填参数,必须要有URL地址才能发送请求
例5:
#请求一个静态网页,使用get()方法
import requests
url = "https://www.163.com/"
response = requests.get(url)
print(response.status_code) #获取状态码
print(response.cookies) #获取cookie,这种获取的cookie不能用于登录,因为它不是完整的
print(response.headers) #获取响应头
print("以下为返回响应的主体",response.text)
"""
200
<RequestsCookieJar[]>
{'Transfer-Encoding': 'chunked', 'Vary': 'Accept-Encoding,User-Agent,Accept......
以下为返回响应的主体 <!DOCTYPE HTML>
<!--[if IE 6 ]> <html class="ne_ua_ie6 ne_ua_ielte8" id="ne_wrap"> <![endif]-->
<!--[if IE 7 ]> <html class="ne_ua_ie7 ne_ua_ielte8" id="ne_wrap"> <![endif]-->
.......
"""
例5_1:
import requests
method = 'GET'
url = 'https://hao.360.com/'
response = requests.request(method=method, url=url)
print(response.text)
"""
<!DOCTYPE html>
<!--[if lt IE 7 ]><html class="ie6" lang="zh-cn"><![endif]-->
<!--[if IE 7 ]><html class="ie7" lang="zh-cn"><![endif]-->
<!--[if IE 8 ]><html class="ie8" lang="zh-cn"><![endif]-->
<!--[if IE 9 ]><html class="ie9" lang="zh-cn"><![endif]-->
<!--[if (gt IE 9)|!(IE)]><!--><html class="" lang="zh-cn"><!--<![endif]-->
<head>
<meta charset="utf-8" />
<title>360导航_一个主页,整个世界</title>
"""
注:
1、在get( )方法中将变量url直接传入,即完成了带着URL的get请求,结果会赋值给变量response
2、在response中包含了返回结果的所有数据,可以根据需要获取想要的数据(本例子中分别获取了状态码、cookie、信息头、返回主体)
headers参数
1、headers参数是最常用的参数之一,例5只是一个最简单的请求(没有带其他参数),而很多时候需要带入headers参数发送请求,才可以获取响应的请求结果
⑴特别是网站有反爬虫机制时更需要带上headers参数(User-Agent),
⑵另外该参数也可以模拟PC端请求和手机端请求(将User-Agent改为请求的手机型号)
2、请求头部的任意内容都可以作为headers参数的值传入:将头部内容作为一个字典传入
3、一个请求的头部会包含很多数据(以键值对的形式存在),一般来说再用requests库构造一个请求时,并不需要将所有头部信息都传入。经常使用到的头部信息有
⑴Content-Type:指明服务端接受数据的类型
⑵Cookie:用户登录信息,表明用户已登录,类似的有Token等。另外Cookie信息可以方法Cookies参数中
⑶User-Agent:用户模拟浏览器,一般情况下可以不传入
⑷下面图片为一个请求的headers信息,可以看到请求头部包含了很多数据,这些数据以键值对的形式存在
例6:
import requests
url = "https://www.163.com/"
# 以字典形式传入headers信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 ",
"Content-Type": "application/x-www-form-urlencoded;charset=UTF-8"}
response = requests.get(url=url, headers=headers)
print(response.status_code)
print(response.headers)
print("以下为返回响应的主体", response.text)
"""
200
{'Vary': 'Accept-Encoding,User-Agent,Accept', 'Content-Type': 'text/html; charset=GBK'......
以下为返回响应的主体 <!DOCTYPE HTML>
<!--[if IE 6 ]> <html class="ne_ua_ie6 ne_ua_ielte8" id="ne_wrap"> <![endif]-->
.......
"""
cookies参数
1、cookies也是最常用的参数之一,因为只要涉及需要登录后才能获取的数据,都需要用到cookies参数
⑴有些网页必须是要用户登录之后才能看到的(比如个人中心等),在使用requests库发送这类请求时,就必须带上Cookie数据,表明用户已登录(用户是谁)
⑵HTTP协议是无状态的,也就是前后请求是无联系的,服务器不知道当前请求是谁。因此使用Cookie来存储用户信息,这样服务器才知道当前是哪个用户在请求
如何查找Cookie
1、登录时获得Cookies:打开登录页面并输入账号、密码后打开抓包工具,点击【登录】按钮,此时就可以抓到登录时的请求
⑴这种方法也适用于获取提交的表单(打开抓包工具后,输入数据并提交)
2、进入我们需要的网页后,点击F5刷新
3、登录后打开抓包工具再打开我们需要的网页
注:
1、通过这个方式找Cookie会发现其实一个URL(整个网页)是由很多子URL(元素JS脚本等)组成的,即每个资源都存在一个URL(路径),做测试时不仅可以获取整个URL(页面),也可以获得其中某个字URL(元素),所以需要确定好哪个才是我们需要的URL信息
2、在登录时最好勾选【记住密码】之类的
3、抓取Cookie时,建议使用后两种方法,登录时获取的cookies可能并不是完整的
发送带Cookie数据的请求:cookies参数
1、将抓包获取到的Cookie信息作为一个字典赋值给Cookies参数。这样就完成了一个带cookies参数的请求
⑴HTTP请求头由关键字/值对组成,关键字和值用英文冒号":"分隔
⑵因此要传递给服务器的Cookie信息就是:cookie信息部分的{关键字名:完整的cookie值}
①字典键名:头部关键字名。常见的就是cookie、Token等
②字典值:完整的cookie值
例7:以粉笔网"我的订单"页面为例。这个页面必须是用户登录后才能看到的
⑴先抓包获取请求的必要信息
⑵构造请求:加入cookie数据
import requests
url = "https://ke.fenbi.com/win/v3/user_orders/my"
# 以字典形式传入headers信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 "}
cookies = {"cookie": "sid=-2420600; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2272C%22first_id%22%3A%22178f3307-0510d66b6-d7e1938-2073600"}
params = {
"platform": "win",
"vendor": "web",
"app": "WEBSTUDENT",
"deviceId": "uuid",
"av": "13",
"kav": "27",
"ua": "cef",
"version": "2.0.0.1160",
"device_app": "WEBSTUDENT",
"len": "10",
"max_id": "0"}
response = requests.get(url=url, headers=headers,cookies=cookies)
#因为改地址返回的是一个json数据,因此可以使用response.json()方法来直接获取字典格式的返回数据
print("以下为返回响应的主体", response.json())
"""
以下为返回响应的主体 {'msg': '', 'nextId': '691955207245496320',
'datas': [{'payFee': 9.0, 'items': [{'payFee': 9.0, 'contentType': 0, 'affiliatedItems': None, 'quantity': 1,
'contentTitle': '2020省考上岸礼包', 'lectureSummary': {'classHours': 11, 'hasUserExamInfo': False, 'price': 9.0,
'offline': None, 'saleStatus': -1, 'topPrice': 9.0, 'hasQQGroup': False, 'hasClassPeriod': False,
......
"""
⑶构造请求,不带cookie数据
import requests
url = "https://ke.fenbi.com/win/v3/user_orders/my"
# 以字典形式传入headers信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36 "}
# cookies = {"cookie": "sid=-240500; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%22first_id%22%3A%22146953307-0510d6b6-d7e1938-2070"}
params = {
"platform": "win",
"vendor": "web",
"app": "WEBSTUDENT",
"deviceId": "uuid",
"av": "13",
"kav": "27",
"ua": "cef",
"version": "2.0.0.1160",
"device_app": "WEBSTUDENT",
"len": "10",
"max_id": "0"}
response = requests.get(url=url, headers=headers)
print("以下为返回响应的主体", response.json())
"""
以下为返回响应的主体 {'data': 'status=401,reasonPhrase=Unauthorized', 'msg': '请求异常,请检查请求或者重试', 'code': -1}
"""
注:
1、可以看到如果请求中没有带cookie数据时,请求未被服务器正常处理,未返回预期的数据。所以在构造请求时必须注意是否需要携带cookie信息
2、将获取的cookie信息以字典的形式赋值给get()等方法的cookies参数,即完成了带着cookie信息的请求
发送带Cookie数据的请求:headers参数
1、从上面的抓包数据中我们可以看到cookies信息时存在在请求头部中的。因此在传递cookie信息时,不仅可以将cookie信息放在cookies参数中,也可以放在headers参数中
例7_1:
import requests
url = "https://ke.fenbi.com/win/v3/user_orders/my"
# 以字典形式传入headers信息
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36",
"cookie": "sid=-24271280600; sensorsdata2015jssdkcross=%7B%22distinC%22first_id%22%3A%22178f3307-02656b6-d938-20700"}
params = {
"platform": "win",
"vendor": "web",
"app": "WEBSTUDENT",
"deviceId": "uuid",
"av": "13",
"kav": "27",
"ua": "cef",
"version": "2.0.0.1160",
"device_app": "WEBSTUDENT",
"len": "10",
"max_id": "0"}
response = requests.get(url=url, headers=headers)
print("以下为返回响应的主体", response.json())
"""
以下为返回响应的主体 {'msg': '', 'nextId': '691955207245496320',
'datas': [{'payFee': 9.0, 'items': [{'payFee': 9.0, 'contentType': 0, 'affiliatedItems': None, 'quantity': 1,
'contentTitle': '2020省考上岸礼包', 'lectureSummary': {'classHours': 11, 'hasUserExamInfo': False, 'price': 9.0,
'offline': None, 'saleStatus': -1, 'topPrice': 9.0, 'hasQQGroup': False, 'hasClassPeriod': False,
......
"""
注:
1、cookie也可以通过headers参数传递,因为cookie信息也是存在于请求头部中的
⑴使用cookies参数时:cookie信息是以字典的形式发送的{cookie:Value}
⑵而使用headers参数时:在headers之中cookie只是其中的一个键值对元素
2、两种方法中建议使用cookies参数:一方面把cookie单独分离出来,不用与headers其他参数放在一起,让代码更加清晰;另一方面通过post请求返回的cookies是可以直接赋值到cookies参数之中的,不需要在做转换
3、cookie信息的作用时用于服务器识别当前请求的用户是谁。但是用于识别用户的技术不止有cookie,还有Token等。
⑴不管是使用cookie还是Token还是其他技术,其用户信息都是以键值对存在的:键为技术名,值为用户信息
⑵服务端通过头部中指定键名(技术名)来获取其对应的值(用户信息)
⑷因此在传递cookie等信息时,一定要写正确键名,不然服务器就会获取不到对应的值
⑸特别是在前后端分离项目中,一般识别用户都是用的是Token而不是cookie了
例7_2:
注:
1、比如上图中识别用户用的就是Token,而不是Cookie了:"Authorization:Bearer 39f3..."
2、因此我们在传递用户信息时(前面的cookie,这里的Token)
⑴就不能是用cookies={"cookie":"Bearer 39f3..."}
⑵而应该是用cookies={"Authorization":"Bearer 39f3..."}
⑶因为服务器是根据键名来获取用户信息的,人家本来是根据Authorization来获取的,但是你传了一个cookie上去,这样肯定就不对了
⑷因此我们在构造请求时就必须弄清楚,服务器时根据哪一个键值对来识别用户的,同时也要保证传入的键名与实际一致
params参数
1、params参数是用于传递"查询字符串参数"的
⑴即URL中的参数部分:以key1=value1&key2=value2(字典)的形式跟在URL之后
2、URL中的参数部分可以放在URL中直接发送,也可以使用params参数进行发送
⑴为了区分URL和参数,最好不要将查询字符串参数放在URL之中
⑵实现URL与参数分离。使用params关键字以一个字典来传递查询字符串参数
3、将需要传递的查询字符串参数以字典的形式赋值给params参数,即完成了带params信息的请求
4、如果params参数值为None,那么是不会添加到url请求中的
5、还需要注意一点的是:不管是GET方法还是POST方法都是可以使用params参数的,且不管是哪个方法params参数都是用于传递查询字符串参数的(其不能传递其他形式的参数)
例8:
⑴先通过抓包,确定好请求方式、数据等
⑵编写代码:通过步骤1可以看到该请求使用的是查询字符串参数,因此需要使用params参数
import requests
url = "http://127.0.0.1:8000/login/QueryBookInfo"
params = {"bookName":"Python","bookPrice":"21"}
headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36"}
response = requests.get(url=url,headers=headers,params=params)
# 打印请求响应
print(response.json())
# 打印拼接后的URL
print(response.url)
"""
{'status': 'success', 'data': {'bookName': 'Python', 'bookPrice': '21'}}
# 可以看到是将params参数拼接到URL中了
http://127.0.0.1:8000/login/QueryBookInfo?bookName=Python&bookPrice=21
"""
例8_1:
import requests
lists = ['python', 'php', 'Java']
for params in lists:
url = 'http://www.baidu.com/s?wd=%s' % (str(params))
r = requests.get(url)
print(r.url)
#或
import requests
lists = ['python', 'php', 'Java']
for i in lists:
params = {"wd":str(i)}
url = "http://www.baidu.com/s"
r = requests.get(url=url,params=params)
print(r.url)
"""
http://www.baidu.com/s?wd=python
http://www.baidu.com/s?wd=php
http://www.baidu.com/s?wd=Java
"""
获取返回信息
1、前面提到过:发送请求后会返回响应结果:
⑴响应结果是一个Response对象<class 'requests.models.Response'>
⑵我们可以根据Response对象的方法或属性来获取我们需要的数据
获取响应头
例5:
import requests
aims_url = "http://www.weather.com.cn/weather1d/101010100.shtml#search"
r=requests.get(aims_url,stream=True)
print(r.headers)#获得返回报文的信息头
print(r.headers.get('Content-Type')) #获取响应报文类型
print(r.request.headers) #获得请求报文的信息头
"""
{'Server': 'nginx', 'Content-Encoding': 'gzip', ', 'Content-Type': 'text/html', 'Connection': 'keep-alive'}
text/html
print(r.request.headers)
{'Accept': '*/*', 'User-Agent': 'python-requests/2.21.0', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive'}
"""
注:
1、r.headers返回的是一个字典
2、可以使用r.headers.get('参数键名')方法来取得部分响应头
3、可以使用r.request.headers直接获得请求头(也就是我们向服务器发送的头信息)
获取响应信息的输出格式
例6:
import requests
aims_url = "https://blog.csdn.net/qq_25987491/article/details/80058044"
r=requests.get(aims_url)
print(r.encoding)
#上面代码输出结果为:UTF-8(响应信息是以utf-8格式输出的)
修改响应信息输出格式
例6_1:
import requests
aims_url = "https://blog.csdn.net/qq_25987491/article/details/80058044"
r=requests.get(aims_url)
r.encoding = 'ISO-8859-1'
print(r.encoding)
#上面代码输出结果为:ISO-8859-1(响应信息是以ISO-8859-1格式输出的)
注:
以字节流返回响应信息:r.content返回的是二进制字节流(r.text是以字符串形式返回)
例6_3:
import requests
imgUrl = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superman/img/logo_top_86d58ae1.png"
def saveImage( imgUrl,imgName ="default.jpg" ):
r = requests.get(imgUrl, stream = True)
image = r.content
destDir="D:\\"
print("保存图片"+destDir+imgName)
try:
with open(destDir+imgName ,"wb") as jpg:
jpg.write(image)
print("成功")
return
except IOError:
print("IO Error")
return
finally:
jpg.close
saveImage(imgUrl)
#输出结果为:URL对应的图片(网页中的对应元素)
获取格式为JSON的响应
例7:
import requests
aims_url = "http://httpbin.org/get"
r=requests.get(aims_url,stream=True)
print(r.json())
#上面代码输出结果为:
#{'args': {}, 'url': 'https://httpbin.org/get', 'headers': {'Accept': '*/*', 'Host': 'httpbin.org', 'Accept-Encoding': 'gzip}}
注:
2、只有响应格式本身为JSON的数据才能使用该方法获取,若响应格式不是JSON并使用了该方法会报"json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)"
拓展
保存会话
会话对象,能够跨请求保持某些参数
使用session.get(url)发出get请求会带上之前保存在session中的cookie,能够请求成功
例5:
import requests
aims_url = "http://www.weather.com.cn/weather1d/101010100.shtml#search"
session = requests.session()#实例化session
response = session.get(aims_url,stream=True)
response.encoding = "utf-8" #响应报文编码不为utf-8,因此需要设置下
print(response.headers)#获得返回报文的信息头
print(response.status_code)
print(response.text)
"""
{'Connection': 'keep-alive', 'X-Via': '1.1 PS-PEK-01vfL225:3.....
200
<!DOCTYPE html>
<html>
<head>
<link rel="dns-prefetch" href="http://i.tq121.com.cn">
<meta charset="utf-8" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>【北京天气】北京今天天气预报,今天,今天天气,7天,15天天气预报,天气预报一周,天气预报15天查询</title>
.......
"""
关于重定向
有时候我们在请求url时,服务器会自动把我们的请求重定向,比如github会把我们的http请求重定向为https请求。我们可以使用r.history来查看重定向:
例8:
>>> r = requests.get('http://pythontab.com/')
>>> r.url
'http://pythontab.com/'
>>> r.history
[]
从上面的例子中可以看到,我们使用http协议访问,结果在r.url中,打印的却是https协议。那如果我非要服务器使用http协议,也就是禁止服务器自动重定向,该怎么办呢?使用allow_redirects 参数:
r = requests.get('http://pythontab.com', allow_redirects=False)
关于请求时间
我们可以使用timeout参数来设定url的请求超时时间(时间单位为秒):
例9:
requests.get('http://pythontab.com', timeout=1)
关于代理
我们也可以在程序中指定代理来进行http或https访问(使用proxies关键字参数),如下:
例10:
proxies = {
"http": "http://10.10.1.10:3128",
"https": "http://10.10.1.10:1080",
}
requests.get("http://pythontab.com", proxies=proxies)
下载页面
使用Requests模块也可以下载网页,代码如下:
例11:
import requests
r=requests.get("https://www.baidu.com/")
with open("haha.html","wb") as html:
html.write(r.content)
html.close()
#下载下来的网页是以HTML文件形式保存的