-
掌握安装第三方模块的方法
-
掌握requests库的常用方法与返回值
-
掌握requests下载保存数据
比如time,socket,os这些库都是系统自带的,第三方库是其他程序员编写与维护的库,系统没有自带,需要下载安装。他们调用方法也是使用import调用的。
系统库与第三方库的唯一区别就是:一个是默认自带不需要下载安装的库,一个是需要下载安装的库。
requests库是网络请求库,非常的简单使用,常用于爬虫,文件下载,漏洞验证等许多业务区。
2-1
安装第三方模块
安装python后会默认安装pip,pip是下载与安装第三方模块的工具。
使用方法如下:
1python3 -m pip install 第三方库的名字
举个例子,以安装requests库
1python3 -m pip install requests
2-2
GET/POST区别
GET和POST是HTTP请求的两种基本方法,通俗简单的理解,就是你打开一个网页的时候使用get请求,登陆账号密码的时候使用post请求。即get是从服务器上获取数据,post是向服务器传送数据,还有就是get请求方式你可以在浏览器看到请求的网址和数据,post请求方式则无法在浏览器网址栏看到。
具体查看网址的请求方式,可以在浏览器种F12查看网络流量即可看到。
2-3
HTTP请求方式
除了get,post,还有head,delete,options请求方式。他们的用法如出一辙
1import requests
2r = requests.post('http://www.langzi.fun/admin.php', data = {'user':'langzi'})
3# post 请求
4r = requests.put('http://www.langzi.fun', data = {'user':'langzi'})
5# put 请求
6r = requests.delete('http://www.langzi.fun/delete')
7r = requests.head('http://www.langzi.fun/index.html')
8r = requests.options('http://www.langzi.fun/get')
介绍最常见是三种方式以及用途:
1get-->请求数据-->发起请求,获取完整的数据,速度慢-->获取网页的内容,爬虫,poc编写
2psot-->发送数据-->主动服务器提交数据,返回获取完整的数据-->提交数据,获取网页返回的结果,爬虫,poc编写
3head-->头请求-->很少网络流量获得概要信息,获取请求头,状态码,速度极快-->敏感目录扫描
2-4
状态码
200 ---> 请求成功,网页内容存在
301/302 ---> 自动跳转到其他网页
400/401/404 ---> 网页内容不存在
2-5
head请求方式
head请求方式也叫头请求,它使用很少网络流量获得概要信息。比如获取请求头信息,状态码信息,速度极快。一般用在网页是否存在检测,或者粗略的信息获取上。
1import requests
2r = requests.head(url='http://langzi.fun/')
3# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
4print(r.url)
5# 请求的网址,字符串类型
6print(r.headers)
7# 请求头,字典类型
8print(r.status_code)
9# 状态吗,整数类型
10print(r.encoding)
11# 网页的编码,字符串类型
12print(r.cookies)
13# 保存的cookie
运行结果>>>
1http://langzi.fun/
2{'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'}
3200
4ISO-8859-1
5<RequestsCookieJar[]>
2-6
get请求方式
get请求方式,发起请求,获取完整的数据,速度慢。但是能获取网页的完整内容,还能获取请求头信息,获取状态码信息等等。常用在网页数据抓取,网页数据内容分析上,比如爬虫,漏洞验证等。
1import requests
2r = requests.get(url='http://langzi.fun/')
3# 定义一个变量r,使用get方式请求网址
4print(r.content)
5# 打印出网页的内容--bytes格式
如上就是发起对网页的一次请求,并且打印出网页的内容。
发起请求除了能获取网页的内容,还能获取如下的数据
1print(r.text)
2# 请求的网页的内容,自动编码,但是有几率会乱码,不建议使用
3print(r.content)
4# 请求的网页的内容--bytes格式,如果要转中文字符串,需要调用decode()方法
5print(r.content.decode('utf-8'))
6# 请求的网页的内容--字符串格式,自动转换成中文,不同网站编码不同
7print(r.url)
8# 请求的网址,字符串类型
9print(r.headers)
10# 请求头,字典类型
11print(r.status_code)
12# 状态码,整数类型
13print(r.encoding)
14# 网页的编码,字符串类型
15print(r.cookies)
16# 保存的cookie
requests支持url参数格式化,比如网址为:
1http://www.langzi.fun/ge?key2=value2&key1=value1
使用params方便对网址参数进行维护
1payload = {'key1': 'value1', 'key2': 'value2'}
2r = requests.get("http://langzi.fun/ge", params=payload)
3# 这里的网址自动转变成了 http://www.langzi.fun/ge?key2=value2&key1=value1
2-7
post请求方式
post请求方式,能主动发送数据,主动服务器提交数据,返回获取完整的数据。一般在用户登录,点击按钮等位置用,可以主动提交数据,获取网页返回的结果,常用于爬虫,漏洞验证编写上,和get方式获取的结果是差不多的,不过请求方式不一样。
发送到数据需要保存为字典格式:
1d = {'user':'admin','password':'123456'}
2r = requests.post(url='http://www.langzi.fun/admin.php',data=d)
还可以上传文件,格式也需要是字典格式
1files = {'file': open('report.xls', 'rb')}
2r = requests.post(url='http://www.langzi.fun/upload', files=files)
如果上传极大的文件,需要使用requests toolbelt 参考文档(https://toolbelt.readthedocs.io/en/latest/)
2-8
其他参数设置
设置超时
当访问一个网址,希望如果10秒钟后还没有回应,就直接报错,使用timeout参数即可实现
1r = requests.get(url='http://langzi.fun/',timeout=10)
设置请求头
requests是一个网络请求库,但是许多网站会检测你发起过来的请求是否使用浏览器打开,这个时候就需要加上请求头伪装成浏览器
1headersssssss = {'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'}
2r = requests.get(url='http://langzi.fun/',timeout=10,headers=headersssssss)
除了浏览器请求头,还可以加上网址的cookie等信息,避免对方网址的反爬虫发现。
不检测https证书
requests会对https网址验证ssl证书,如果证书验证失败,则会抛出异常,关闭方法如下:
1requests.packages.urllib3.disable_warnings()
2r = requests.get(url='http://langzi.fun/',timeout=10,verify=False)
禁止网页重定向
默认情况下,requests 会自动处理所有重定向,可以通过参数设置禁止重定向
1r = requests.get(url='http://langzi.fun/',timeout=10,verify=False,allow_redirects=False)
保存数据
保存网页的内容
1r = requests.get('http://www.langzi.fun')
2con = r.content.decode('utf-8')
3with open('浪子博客首页.txt','a+',encoding='utf-8')as a:
4 a.write(con)
保存图片数据
1import requests
2r = requests.get('http://www.langzi.fun/upload/my_girl.jpg')
3with open('第一张图片.jpg','wb')as a:
4 a.write(r.content)
保存视频数据
1import requests
2r = requests.get('http://www.langzi.fun/upload/xxoo.mp4',stream=True)
3for it in r.iter_content():
4 with open('一段视频.mp4','wb')as a:
5 a.write(it)
其他的保存压缩包/音频等文件方式与下载视频方式一样,需要注意保存文件的后缀即可。
-
暴力破解、撞库、爬虫等场景下使用
-
模拟网站的登陆,查看,下载数据
-
POC/EXP的编写,漏洞扫描器网络请求
-
掌握requests最常用的三种请求方式:head/get/post
-
掌握requests参数的设置
-
掌握requests返回值
-
掌握requests如何保存数据
安装 pip
安装python.msi时候没有勾选安装pip的情况下,就不会帮你安装pip的,在cmd下输入命令安装
1python3 -m pip install -U pip setuptools
如果报错的话,到Python pip(https://pip.pypa.io/en/stable/installing/)网站下载get-pip.py 文件,python3 get-pip.py安装即可。
如果你安装的时候勾选了pip,但是目录下并没有pip,可以通过命令调出pip
1python3 -m ensurepip
然后会发现目录下生成了pip文件
在linux系统的python3环境中,你发现怎么样折腾安装不上pip3,各种报错显示:
1No module named pip
这个时候使用apt-get安装即可
1apt-get install python3-pip
2pip3 -v
离线安装第三方库
-
在pypi(https://pypi.org/project/)官方搜索你需要的库的名字
-
找到文件压缩包,下载后并解压,压缩包的格式为tar.gz
-
在解压后的文件夹内执行命令
-
python3 setup.py install
第二种方式是
-
在pypi(https://pypi.org/project/)官方或者Python库(https://www.lfd.uci.edu/~gohlke/pythonlibs/)搜索你需要的库的名字
-
找到文件压缩包,文件格式为.wheel
-
下载wheel文件后,在wheel文件夹执行如下命令
-
python3 -m pip install 文件名.wheel
requests其他常用功能
保存cookies,第一步登录你的账户密码获取cookie,然后使用cookie登录
1payload = {'username': 'admin', 'password': 'password'}
2r = requests.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
3print(r.cookies.get_dict())
4r = requests.get('http://pythonscraping.com/pages/cookies/profile.php', cookies=r.cookies)
5print(r.text)
使用Session自动化管理cookies
同样是执行上面的登录操作, 下面就是使用 session 的版本. 创建完一个 session 过后, 我们直接只用 session 来 post 和 get. 而且这次 get 的时候, 我们并没有传入 cookies. 但是实际上 session 内部就已经有了之前的 cookies 了.
1session = requests.Session()
2payload = {'username': 'admin', 'password': 'password'}
3r = session.post('http://pythonscraping.com/pages/cookies/welcome.php', data=payload)
4print(r.cookies.get_dict())
5r = session.get("http://pythonscraping.com/pages/cookies/profile.php")
6print(r.text)
上传图片
1file = {'uploadFile': open('./image.png', 'rb')}
2r = requests.post('http://pythonscraping.com/files/processing2.php', files=file)
3print(r.text)
自动取消报警
1from requests.packages import urllib3
2urllib3.disable_warnings()
下载大文件
1r = requests.get('http://www.langzi.fun/tools.zip',stream=True)
2for it in r.iter_content():
3 with open('xx.zip','wb')as a:
4 a.write(it)
网页编码
之前我都是推荐使用chardet.detect方法获取网页的编码,但是我发现requests已经想的很周到了。
使用
1requests.utils.get_encodings_from_content(r.text)
即可获取网页的编码,返回对象是一个列表。取索引为0的值即可。
获取网页标题
1 r = requests.get(url,headers=headers(),allow_redirects=False,verify=False,timeout=10)
2 print(url + ':' + str(r.status_code))
3 encoding = requests.utils.get_encodings_from_content(r.text)[0]
4 res = r.content.decode(encoding,'replace')
5 title_pattern = '<title>(.*?)</title>'
6 title = re.search(title_pattern,res,re.S|re.I)
往期推荐
本文始发于微信公众号(安全研发):Python安全开发之第三方库requests讲解【C10课】
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论