1、Requests介绍

Requests 是使用 Apache2 Licensed 许可证的 基于Python开发的HTTP 库,其在Python内置模块的基础上进行了高度的封装,从而使得Pythoner进行网络请求时,变得美好了许多,使用Requests可以轻而易举的完成浏览器可有的任何操作。支持使用cookie保持会话,支持文件上传,支持自动响应内容的编码,支持国际化的URL和POST数据自动编码。

作用:模拟浏览器发送请求,得到浏览器返回的数据

HTTP协议:
        概念:服务器和客户端进行数据交互的一种形式(URL绑定服务器,请求数据时,满足特定要求)
        常用的表头请求信息
            User-Agent:表示请求载体的身份标识(浏览器访问时候,网站会收到浏览器和服务器的相关信息)
            Connection:请求完毕后,是断开连接还是保持连接
         常用的相应头信息:
- Content-Type:网站返回客户端的数据类型,json,text,等 HTTPS协议: 安全的超文本的传输协议,数据进行了加密了 加密方式: 1、对称公钥加密:传递密文和秘钥(客户端设置),服务器得到数据和秘钥,服务器按照特定的规则(秘钥)进行数据解密 缺点:可能会被第三方拦截请求,得到密文和秘钥,进行数据解密 2、对称性加密:服务端设置好加密方式,配置公钥和私钥,把公钥传递给客户端,客户端通过公钥加密,传输数据,服务端 得到数据,私钥进行解密 缺点:第三方拦截公钥,对公钥进行篡改,然后拦截密文,解密。第二点,通信速度较慢 3、证书加密:配置ssl证书(会有一个签名,服务端和客户端都充分信任,其他第三方无法获知这个签名) 如果第三方对公钥进行了篡改,那么服务端就无法识别,会终止数据传输 requests模块 基于网络请求的模块: urllib requests 高效简洁 作用:模拟浏览器发送请求 使用: 1、指定URL 2、发起请求 3、获取响应数据 4、持久化存储

2、Requests的基础使用

 2.1  get方式请求数据

#得到百度的搜索结果
'''
UA检测:在正常浏览器中访问的时候,服务端会得到一个请求头,如果服务端对请求头设置了拦截,则requests
        的请求会被拦截
'''
# 设置请求载体
headers = {
    # 在浏览器中,network查看
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',

}
#设置UA伪装:请求载体伪装成一款浏览器
def get_baidu_search(s_context):
    #百度搜索的请求地址
    url='http://www.baidu.com/s?ie=utf-8&f=3&rsv_bp=1&tn=baidu'

    #如果链接中需要参数,可以直接在链接中定义.使用format,或者替换
    #可以使用字典参数,默认会字典的形式加入链接中
    param={
          'wd' : s_context
    }
    response=requests.get(url,param,headers=headers)
    return response  #返回一个对象
#在对象中可以获取想要的数据

主要的返回参数

response.status_code
响应状态码,200请求成功
response.text
以encoding解析返回内容。字符串方式的响应体
response.json()
返回数据自动转成json格式的数据类型
response.content
返回二进制的数据格式

2.2  post方式请求数据

#得到百度翻译的结果
'''
如果页面的数据是通过动态加载的,ajax请求,那么请求地址并不是浏览器上显示的地址
这时需要抓包工具,或者浏览器自带的开发者功能,network中,fetch/XHR类中,可以
查看到具体请求接口地址
#可以查看接口返回的数据和数据类型

如果页面是局部刷新,那么发起了一个ajax请求,这个请求可能是get or post
#某些请求中,可以解析页面的div节点,得到响应的数据
'''
#发送的是一个ajax请求,地址栏不会发送改变,局部动态的加载数据
def get_result_from_baidu_translation(content):
    url='https://fanyi.baidu.com/sug'
    #该结构可以接受json,具体在浏览器中查看请求参数接受什么类型的数据
    #'application / x - www - form - urlencoded;charset = UTF - 8'  字符串类型
    #Content-Type: application/json    json格式的数据类型

    #请求发送的数据包,该数据不会显示在地址栏中
    data={
        'kw':content
    }
    response=requests.post(url,data=data,headers=headers)
    return response

2.3查看数据的真实请求地址

查看豆瓣某个系列的排行榜,可以在地址栏中看到部分的请求参数

Python模块之requests_python

 

如果我们进行向下滑动翻页的话,地址栏是没有发送变化的,说明该页面局部刷新,该请求为ajax请求,请求地址不是真实的地址

打开浏览器的开发者工具,查看具体的请求地址和参数

Chrome浏览器:右键鼠标-检查-Network-Fetch/XHR

点击翻页,Name会加入新的请求地址,右侧可以看到相关的参数,请求路径,请求方法,请求内容,响应内容,请求参数

Python模块之requests_服务端_02

 

 

#ajax的get请求
#获取豆瓣中电影排行数据,传入一个分类id,默认爬取动漫的排行榜
def get_rank_douban(sort_id=25):
    url='https://movie.douban.com/j/chart/top_list'
    param={
        'type': sort_id,
        'interval_id': '100:90',
        'action':'',
        'start': 1,
        'limit': 20
    }
    response=requests.get(url,params=param,headers=headers)
    return response

 3、Requests下载文件

3.1当文件比较下时候,可以直接把整个存入内存中,一次性下载

import requests
 
r = requests.get("https://img.sitven.cn/Tencent_blog_detail.jpg")
with open(r"D:\a.jpg", "wb") as f:
    f.write(r.content)

3.2当文件比较大的时候,按照字节读取文件,某个特定的数据大小写入

def downlaod_file():
    #请求地址
    url = 'http://in.sinx2.com//Public/Uploads/yxtshopSn/excel/Member_20210914174720.csv'
    response = requests.get(url=url, stream=True)
    if response.status_code == 200:
        chunk_size = 1024*1024  #1M
        #按照字节的形式把数据保存到文件中
        with open(r'../file/Member_20210910094342.xlsx', 'wb') as f:
            for chunk in response.iter_content(chunk_size=chunk_size):   #每次按照1024*1024取出数据
                #存入数据
                if chunk:
                    f.write(chunk)
        print("下载成功")

在某些需要先登录才能访问的网站,请求时候需要requests.session.get or post  形式请求。这样在登录验证之后,其他页面访问就不需要重新验证了