[toc]
由于自己太菜了,大一学不会web,也因为太懒不愿意去审源码。而且misc又有很多有趣的题目,就被吸引过去了。但是我打CTF的初衷就是学习web的,看到身边的师傅们web越来越强了,而我还是这么菜,所以拖到大二才真正开始web学习。希望还能赶上师傅们的脚步。
此文章会在碰到新的requests库知识时,随时更新。
requests库作为python里写网页脚本非常重要库之一,经常用得到,所以学习使用requests库很关键。
安装命令:pip install requests
1.利用requests直接执行get请求
import requests
res = requests.get("http://47.110.54.152/")
print(res.url) #查看url地址
print(res.encoding) #查看字符编码
print(res.text) #查看响应内容
print(res.content) #查看数据流
print(res.status_code) #查看响应码
print(res) #直接查看res,类似于查看响应码
print(res.cookies)#查看cookies
#如果有cookies的话才会有值,本次测试的是没有输出cookies的网站
输出结果
http://47.110.54.152/
UTF-8
.........
.........
200
<Response [200]>
<RequestsCookieJar[]>
2.利用requests进行post请求
post请求比较复杂,一般需要知道先在网页中获取各种所需的参数。
比如在爬取有道翻译的过程中,利用爬虫脚本爬取有道翻译的post请求:

我们可以看到,有道翻译利用参数i来储存,还有其余很多的审查元素。

而在最终翻译结果则储存在['translateResult'][0][0]['tgt']

在General中可以看到request URL的地址,
然后我们就可以写一个爬虫脚本了:
import requests
content=input('请输出你要翻译的内容:')
url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
data = {
"i": content,
"from":"AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "16016993115161",
"sign": "e4dd3b253a91d059f1f725e6c3b20e27",
"lts": "1601699311516",
"bv": "b396e111b686137a6ec711ea651ad37c",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTlME",
}
r = requests.post(url, data = data)
result = r.json()
print('result:%s'%(result['translateResult'][0][0]['tgt']))
利用这个脚本,则可以随时爬取有道翻译的post请求了。当然,如果一次性传输大量的流量给网站,有可能ip会被ban,最好不要轻易尝试。
3.利用requests进行web验证
很多时候在网页中需要输入参数,而requests可以替人胜任这个工作。代码如下:
import requests
auth=('answer', '123456')
response = requests.get('http://47.110.54.152:1221/', auth = auth)
print(response.text)
这个代码就是给http://47.110.54.152:1221/这个网站传了一个answer=123456的值
由于水平有限,目前对requests库有一些了解的用处已写在文章中,其他功能以后随缘补充。
实战:

题目要求:连续一千次输入对计算结果,(当然可以计算器慢慢解)

F12查看数据保存位置,这三行话都是保存在text中的,没法直接读取text中的数据,所以需要利用正则表达式提取式子。

随便输入一个答案123456,能发现答案储存在answer中,所以就可以写出一个脚本解题。
脚本如下:
import requests
import re
import time
url = 'http://47.110.54.152:1221/index.php'
s = requests.session()
source = s.get(url)
for i in range(0,1001):
equation = re.findall(r'\d+.[+-].\d+', source.text) #算式正则
answer = eval(equation[0])
print(answer , i)#运行的时候看得见效果
source = s.post(url,data={"answer":answer})#向网站传入answer值
time.sleep(0.01)#让每次输入有停顿,防止网页崩溃
print(source.text)