HTTP协议:接口测试_发送请求_get方法

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_codeHTTP请求的返回状态,200表示连接成功,404表示失败
response.textHTTP响应内容的字符串形式,即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的内容
jsonJson数据:JSON格式的数据,作为Request的内容
headers请求头:字典、HTTP定制头
cookiesCookie信息:字典或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文件形式保存的

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:创作都市 设计师:CSDN官方博客 返回首页

打赏作者

不怕猫的耗子A

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值