掌握安装第三方模块的方法
掌握requests库的常用方法与返回值
掌握requests下载保存数据
比如time,socket,os这些库都是系统自带的,第三方库是其他程序员编写与维护的库,系统没有自带,需要下载安装。他们调用方法也是使用import调用的。
系统库与第三方库的唯一区别就是:一个是默认自带不需要下载安装的库,一个是需要下载安装的库。
requests库是网络请求库,非常的简单使用,常用于爬虫,文件下载,漏洞验证等许多业务区。
安装python后会默认安装pip,pip是下载与安装第三方模块的工具。
使用方法如下:
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请求方式。他们的用法如出一辙
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')
介绍最常见是三种方式以及用途:
get-->请求数据-->发起请求,获取完整的数据,速度慢-->获取网页的内容,爬虫,poc编写
psot-->发送数据-->主动服务器提交数据,返回获取完整的数据-->提交数据,获取网页返回的结果,爬虫,poc编写
head-->头请求-->很少网络流量获得概要信息,获取请求头,状态码,速度极快-->敏感目录扫描
200 ---> 请求成功,网页内容存在
301/302 ---> 自动跳转到其他网页
400/401/404 ---> 网页内容不存在
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
运行结果>>>
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[]>
import requests
r = requests.get(url='http://langzi.fun/')
# 定义一个变量r,使用get方式请求网址
print(r.content)
# 打印出网页的内容--bytes格式
如上就是发起对网页的一次请求,并且打印出网页的内容。
发起请求除了能获取网页的内容,还能获取如下的数据
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参数格式化,比如网址为:
http://www.langzi.fun/ge?key2=value2&key1=value1
使用params方便对网址参数进行维护
payload = {'key1': 'value1', 'key2': 'value2'}
r = requests.get("http://langzi.fun/ge", params=payload)
# 这里的网址自动转变成了 http://www.langzi.fun/ge?key2=value2&key1=value1
发送到数据需要保存为字典格式:
d = {'user':'admin','password':'123456'}
r = requests.post(url='http://www.langzi.fun/admin.php',data=d)
还可以上传文件,格式也需要是字典格式
files = {'file': open('report.xls', 'rb')}
r = requests.post(url='http://www.langzi.fun/upload', files=files)
如果上传极大的文件,需要使用requests toolbelt 参考文档
当访问一个网址,希望如果10秒钟后还没有回应,就直接报错,使用timeout参数即可实现
r = requests.get(url='http://langzi.fun/',timeout=10)
requests是一个网络请求库,但是许多网站会检测你发起过来的请求是否使用浏览器打开,这个时候就需要加上请求头伪装成浏览器
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等信息,避免对方网址的反爬虫发现。
requests会对https网址验证ssl证书,如果证书验证失败,则会抛出异常,关闭方法如下:
requests.packages.urllib3.disable_warnings()
r = requests.get(url='http://langzi.fun/',timeout=10,verify=False)
默认情况下,requests 会自动处理所有重定向,可以通过参数设置禁止重定向
r = requests.get(url='http://langzi.fun/',timeout=10,verify=False,allow_redirects=False)
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)
import requests
r = requests.get('http://www.langzi.fun/upload/my_girl.jpg')
with open('第一张图片.jpg','wb')as a:
a.write(r.content)
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)
其他的保存压缩包/音频等文件方式与下载视频方式一样,需要注意保存文件的后缀即可
暴力破解、撞库、爬虫等场景下使用
模拟网站的登陆,查看,下载数据
POC/EXP的编写,漏洞扫描器网络请求
掌握requests最常用的三种请求方式:head/get/post
掌握requests参数的设置
掌握requests返回值
掌握requests如何保存数据
安装python.msi时候没有勾选安装pip的情况下,就不会帮你安装pip的,在cmd下输入命令安装
python3 -m pip install -U pip setuptools
如果报错的话,到Python pip网站下载get-pip.py 文件,python3 get-pip.py安装即可。
如果你安装的时候勾选了pip,但是目录下并没有pip,可以通过命令调出pip
python3 -m ensurepip
然后会发现目录下生成了pip文件
在linux系统的python3环境中,你发现怎么样折腾安装不上pip3,各种报错显示:
No module named pip
这个时候使用apt-get安装即可
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
保存cookies,第一步登录你的账户密码获取cookie,然后使用cookie登录
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 了.
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)
上传图片
file = {'uploadFile': open('./image.png', 'rb')}
r = requests.post('http://pythonscraping.com/files/processing2.php', files=file)
print(r.text)
自动取消报警
from requests.packages import urllib3
urllib3.disable_warnings()
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已经想的很周到了。
使用
requests.utils.get_encodings_from_content(r.text)requests.utils.get_encodings_from_content(r.text)
即可获取网页的编码,返回对象是一个列表。取索引为0的值即可。
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)