Python库之requests库详解
安全研发
2021年07月31日 22:03
收录于文集
共11篇

课程目标

  1. 掌握安装第三方模块的方法

  2. 掌握requests库的常用方法与返回值

  3. 掌握requests下载保存数据


核心知识

比如time,socket,os这些库都是系统自带的,第三方库是其他程序员编写与维护的库,系统没有自带,需要下载安装。他们调用方法也是使用import调用的。

系统库与第三方库的唯一区别就是:一个是默认自带不需要下载安装的库,一个是需要下载安装的库。

requests库是网络请求库,非常的简单使用,常用于爬虫,文件下载,漏洞验证等许多业务区。

安装第三方模块

安装python后会默认安装pip,pip是下载与安装第三方模块的工具。

使用方法如下:

代码块
JavaScript
自动换行
复制代码
python3 -m pip install 第三方库的名字

举个例子,以安装requests库

python3 -m pip install requests
复制成功

了解GET与POST请求方式

GET和POST是HTTP请求的两种基本方法,通俗简单的理解,就是你打开一个网页的时候使用get请求,登陆账号密码的时候使用post请求。即get是从服务器上获取数据,post是向服务器传送数据,还有就是get请求方式你可以在浏览器看到请求的网址和数据,post请求方式则无法在浏览器网址栏看到。

具体查看网址的请求方式,可以在浏览器种F12查看网络流量即可看到。

不同请求方式

除了get,post,还有head,delete,options请求方式。他们的用法如出一辙

代码块
JavaScript
自动换行
复制代码
import requests
r = requests.post('http://www.langzi.fun/admin.php', data = {'user':'langzi'})
# post 请求
r = requests.put('http://www.langzi.fun', data = {'user':'langzi'})
# put 请求
r = requests.delete('http://www.langzi.fun/delete')
r = requests.head('http://www.langzi.fun/index.html')
r = requests.options('http://www.langzi.fun/get')
复制成功

介绍最常见是三种方式以及用途:

代码块
JavaScript
自动换行
复制代码
get-->请求数据-->发起请求,获取完整的数据,速度慢-->获取网页的内容,爬虫,poc编写
psot-->发送数据-->主动服务器提交数据,返回获取完整的数据-->提交数据,获取网页返回的结果,爬虫,poc编写
head-->头请求-->很少网络流量获得概要信息,获取请求头,状态码,速度极快-->敏感目录扫描
复制成功

状态码

200 ---> 请求成功,网页内容存在

301/302 ---> 自动跳转到其他网页

400/401/404 ---> 网页内容不存在

head方式

代码块
JavaScript
自动换行
复制代码
import requests
r = requests.head(url='http://langzi.fun/')
# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
print(r.url)
# 请求的网址,字符串类型
print(r.headers)
# 请求头,字典类型
print(r.status_code)
# 状态吗,整数类型
print(r.encoding)
# 网页的编码,字符串类型
print(r.cookies)
# 保存的cookie
复制成功

运行结果>>>

代码块
JavaScript
自动换行
复制代码
http://langzi.fun/
{'Server': 'nginx/1.15.11', 'Date': 'Wed, 01 Jan 2020 05:29:19 GMT', 'Content-Type': 'text/html', 'Content-Length': '64868', 'Last-Modified': 'Tue, 17 Dec 2019 13:13:57 GMT', 'Connection': 'keep-alive', 'ETag': '"5df8d495-fd64"', 'Accept-Ranges': 'bytes'}
200
ISO-8859-1
<RequestsCookieJar[]>
复制成功

get方式

代码块
JavaScript
自动换行
复制代码
import requests
r = requests.get(url='http://langzi.fun/')
# 定义一个变量r,使用get方式请求网址
print(r.content)
# 打印出网页的内容--bytes格式
复制成功

如上就是发起对网页的一次请求,并且打印出网页的内容。

发起请求除了能获取网页的内容,还能获取如下的数据

代码块
JavaScript
自动换行
复制代码
print(r.text)
# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
print(r.content)
# 请求的网页的内容--bytes格式,如果要转中文字符串,需要调用decode()方法
print(r.content.decode('utf-8'))
# 请求的网页的内容--字符串格式,自动转换成中文,不同网站编码不同
print(r.url)
# 请求的网址,字符串类型
print(r.headers)
# 请求头,字典类型
print(r.status_code)
# 状态码,整数类型
print(r.encoding)
# 网页的编码,字符串类型
print(r.cookies)
# 保存的cookie
复制成功

requests支持url参数格式化,比如网址为:

代码块
JavaScript
自动换行
复制代码
http://www.langzi.fun/ge?key2=value2&key1=value1
复制成功

使用params方便对网址参数进行维护

代码块
JavaScript
自动换行
复制代码
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://langzi.fun/ge", params=payload)
# 这里的网址自动转变成了 http://www.langzi.fun/ge?key2=value2&key1=value1
复制成功

post方式

发送到数据需要保存为字典格式:

代码块
JavaScript
自动换行
复制代码
d = {'user':'admin','password':'123456'}
r = requests.post(url='http://www.langzi.fun/admin.php',data=d)
复制成功

还可以上传文件,格式也需要是字典格式

代码块
JavaScript
自动换行
复制代码
files = {'file': open('report.xls', 'rb')}
r = requests.post(url='http://www.langzi.fun/upload', files=files)
复制成功

如果上传极大的文件,需要使用requests toolbelt 参考文档

其他设置

设置超时

当访问一个网址,希望如果10秒钟后还没有回应,就直接报错,使用timeout参数即可实现

代码块
JavaScript
自动换行
复制代码
r = requests.get(url='http://langzi.fun/',timeout=10)
复制成功

设置请求头

requests是一个网络请求库,但是许多网站会检测你发起过来的请求是否使用浏览器打开,这个时候就需要加上请求头伪装成浏览器

代码块
JavaScript
自动换行
复制代码
headersssssss = {'User-Agent':'ozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36'}
r = requests.get(url='http://langzi.fun/',timeout=10,headers=headersssssss)
复制成功

除了浏览器请求头,还可以加上网址的cookie等信息,避免对方网址的反爬虫发现。

不检测https证书

requests会对https网址验证ssl证书,如果证书验证失败,则会抛出异常,关闭方法如下:

代码块
JavaScript
自动换行
复制代码
requests.packages.urllib3.disable_warnings()
r = requests.get(url='http://langzi.fun/',timeout=10,verify=False)
复制成功

禁止网页重定向

默认情况下,requests 会自动处理所有重定向,可以通过参数设置禁止重定向

代码块
JavaScript
自动换行
复制代码
r = requests.get(url='http://langzi.fun/',timeout=10,verify=False,allow_redirects=False)
复制成功

保存数据

保存网页的内容

代码块
JavaScript
自动换行
复制代码
r = requests.get('http://www.langzi.fun')
con = r.content.decode('utf-8')
with open('浪子博客首页.txt','a+',encoding='utf-8')as a:
    a.write(con)
复制成功

保存图片数据

代码块
JavaScript
自动换行
复制代码
import requests
r = requests.get('http://www.langzi.fun/upload/my_girl.jpg')
with open('第一张图片.jpg','wb')as a:
    a.write(r.content)
复制成功

保存视频数据

代码块
JavaScript
自动换行
复制代码
import requests
r = requests.get('http://www.langzi.fun/upload/xxoo.mp4',stream=True)
for it in r.iter_content():
    with open('一段视频.mp4','wb')as a:
        a.write(it)
复制成功

其他的保存压缩包/音频等文件方式与下载视频方式一样,需要注意保存文件的后缀即可


应用场景

  1. 暴力破解、撞库、爬虫等场景下使用

  2. 模拟网站的登陆,查看,下载数据

  3. POC/EXP的编写,漏洞扫描器网络请求


总结归纳

  1. 掌握requests最常用的三种请求方式:head/get/post

  2. 掌握requests参数的设置

  3. 掌握requests返回值

  4. 掌握requests如何保存数据


拓展知识

安装 pip

安装python.msi时候没有勾选安装pip的情况下,就不会帮你安装pip的,在cmd下输入命令安装

代码块
JavaScript
自动换行
复制代码
python3 -m pip install -U pip setuptools
复制成功

如果报错的话,到Python pip网站下载get-pip.py 文件,python3 get-pip.py安装即可。

如果你安装的时候勾选了pip,但是目录下并没有pip,可以通过命令调出pip

代码块
JavaScript
自动换行
复制代码
python3 -m ensurepip
复制成功

然后会发现目录下生成了pip文件

在linux系统的python3环境中,你发现怎么样折腾安装不上pip3,各种报错显示:

代码块
JavaScript
自动换行
复制代码
No module named pip
复制成功

这个时候使用apt-get安装即可

代码块
JavaScript
自动换行
复制代码
apt-get install python3-pip
pip3 -v
复制成功

离线安装第三方库

1. 在[pypi](https://pypi.org/project/)官方搜索你需要的库的名字

2. 找到文件压缩包,下载后并解压,压缩包的格式为tar.gz

3. 在解压后的文件夹内执行命令

4. python3 setup.py install

第二种方式是

1. 在[pypi](https://pypi.org/project/)官方或者[Python库](https://www.lfd.uci.edu/~gohlke/pythonlibs/)搜索你需要的库的名字

2. 找到文件压缩包,文件格式为.wheel

3. 下载wheel文件后,在wheel文件夹执行如下命令

4. python3 -m pip install 文件名.wheel


requests其他常用功能

保存cookies,第一步登录你的账户密码获取cookie,然后使用cookie登录

代码块
JavaScript
自动换行
复制代码
payload = {'username': 'admin', 'password': 'password'}
r = requests.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
print(r.cookies.get_dict())
r = requests.get('http://pythonscraping.com/pages/cookies/profile.php', cookies=r.cookies)
print(r.text)
复制成功

使用Session自动化管理cookies

同样是执行上面的登录操作, 下面就是使用 session 的版本. 创建完一个 session 过后, 我们直接只用 session 来 post 和 get. 而且这次 get 的时候, 我们并没有传入 cookies. 但是实际上 session 内部就已经有了之前的 cookies 了.

代码块
JavaScript
自动换行
复制代码
session = requests.Session()
payload = {'username': 'admin', 'password': 'password'}
r = session.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
print(r.cookies.get_dict())
r = session.get("http://pythonscraping.com/pages/cookies/profile.php")
print(r.text) 
复制成功

上传图片

代码块
JavaScript
自动换行
复制代码
file = {'uploadFile': open('./image.png', 'rb')}
r = requests.post('http://pythonscraping.com/files/processing2.php', files=file)
print(r.text)
复制成功

自动取消报警

代码块
JavaScript
自动换行
复制代码
from requests.packages import urllib3
urllib3.disable_warnings()
复制成功

下载大文件

代码块
JavaScript
自动换行
复制代码
r = requests.get('http://www.langzi.fun/tools.zip',stream=True)
for it in r.iter_content(): 
    with open('xx.zip','wb')as a:
        a.write(it)
复制成功

网页编码

之前我都是推荐使用chardet.detect方法获取网页的编码,但是我发现requests已经想的很周到了。

使用

代码块
JavaScript
自动换行
复制代码
requests.utils.get_encodings_from_content(r.text)requests.utils.get_encodings_from_content(r.text)
复制成功

即可获取网页的编码,返回对象是一个列表。取索引为0的值即可。

获取网页标题

代码块
JavaScript
自动换行
复制代码
r = requests.get(url,headers=headers(),allow_redirects=False,verify=False,timeout=10)
    print(url + ':' + str(r.status_code))
    encoding = requests.utils.get_encodings_from_content(r.text)[0]
    res = r.content.decode(encoding,'replace')
    title_pattern = '<title>(.*?)</title>'
    title = re.search(title_pattern,res,re.S|re.I)
复制成功