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查看数据的真实请求地址
查看豆瓣某个系列的排行榜,可以在地址栏中看到部分的请求参数
如果我们进行向下滑动翻页的话,地址栏是没有发送变化的,说明该页面局部刷新,该请求为ajax请求,请求地址不是真实的地址
打开浏览器的开发者工具,查看具体的请求地址和参数
Chrome浏览器:右键鼠标-检查-Network-Fetch/XHR
点击翻页,Name会加入新的请求地址,右侧可以看到相关的参数,请求路径,请求方法,请求内容,响应内容,请求参数
#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 形式请求。这样在登录验证之后,其他页面访问就不需要重新验证了