1.查看源码
<head>
<title>下面的表达式的值是秋名山的车速</title>
<meta charset="UTF-8">
</head>
<p>亲请在2s内计算老司机的车速是多少</p>
<div>373719747-1878154638-1233431774-1476346255*1056350133+1218001988+1332727283*746947109*406838675*343521773+1142418537=?;</div>
<style>
div,p{
text-align: center;
margin: 0 auto;
}
</style>
查看源代码可以知道这里,我们如果自己把数字复制到代码里面算,然后再用工具post,肯定不可能两秒内完成,除非手速无敌。所以我们这里需要使用脚本,获取post后的结果。
这里我直接附上脚本代码
import requests
from lxml import etree
s=requests.Session()
url='http://114.67.246.176:15457'
response = s.get(url).text
x=etree.HTML(response)
path=x.xpath('//div/text()')
z="".join(path[0])[:-3]
z=eval(z)
data={
'value':z
}
flag=s.post(url,data).text
print(flag)
下面再来对原理的分析。
2.Requests库和lxml库的一些知识
(1). Requests库
1.requests.get(url)方法。
2.requests.post(url,构造的参数值)。
3.参数值构造的格式:
data{
‘要传参的变量名’:参数值
}
4.这里只列举的大概,想了解的更详细可以查看我学习时的博客:https://blog.csdn.net/baidu_41871794/article/details/83904024
这里我们需要使用Requests库中的get方法获取div标签中的内容,但是我们通过requests.get(url).text只能获取所有的源代码信息,不能单独取出div标签的内容,如果你足够耐心,也可以通过数组方式一个一个读出来,因为text是一个字符串,所以你可以耐心的一个一个数的方式,或者通过字符串匹配的方式,将div标签中的内容拿出来,但是那会非常的麻烦,有没有更简单的方法呢,这里就需要用到lxml库中的etree类。
(2).etree类
想看详细的去这个网址看看https://www.cnblogs.com/fightccc/p/10808590.html
这里直接上代码解释
import requests
from lxml import etree
r=requests.get("http://www.baidu.com")
html = etree.HTML(r.text) # 调用HTML类进行初始化
resultAll = html.xpath('//*') #选取所有节点
#print("获取所有节点:",resultAll)
resultDivAll = html.xpath('//div') #选取div子孙节点
#print("获取div所有节点:",resultDivAll)
resultDiv_img = html.xpath('//div/img') #选取div下img节点
#print("获取div节点下img节点:",resultDiv_img)
resultDiv_imgSrc = html.xpath('//div/img/@src') #获取div_img的src属性值
print("获取div节点下img的src值:",resultDiv_imgSrc)
使用这种方法就可以获取div标签的内容。
但是注意这里获得的值是一个对象数组,
如果直接输出结果,会发现是一些地址,
所以需要这样构造’//div/text()’
我的理解是在这个对象里面调用text()方法。
通过上面的了解。
我们就可以得到div标签里的内容了。
现在我们要做的就是计算我们得到的字符串的式子的结果。
首先我们需要先对得到的字符串进行进一步的处理
z="".join(path[0])[:-3]
这里还有另一种写法
z="".join(path[0][:-3])
path[0]也可以写成path,再这里是一样的,因为我们这里数组就一个元素。
这两种写法是一样的。
原因是path变量是我们通过利用etree获得的字符串数组,他保存了标签下的所有节点。
处理后我们就可以调用eval()方法来执行z的内容。
就可以得出式子结果,
最后再利用Requests.post()方法,就可以得到返回结果的网页,然后再用方法中的text变量,将页面的源码放出来,就可以看到flag。
这题可能是由于服务器问题,需要跑多几次,有些时候,返回的页面是空的,有些时候你就可以看到flag。