python requests库与正则表达式的一次实战_deep__的博客-程序员秘密

在实验吧看到一道编程题   http://ctf5.shiyanbar.com/jia/

在三秒钟的时间内,计算出这个大数,而且三秒必须完成获取和提交数据的任务。

刚开始写了一个程序:


每次把这个字符复制过来,然后再把结果粘回去。

后来我发现,手速这个东西,我可能没有。

然后想了想能不能使用python的requests库结合正则表达式来做呢?

答案是肯定的。

由于之前没有接触过requests库,就先看看官方文档。

http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

里面介绍了requests库的requests.get方法和post方法

一般的页面用get和post方法就可以完成,但是在实际使用的时候发现用get和post方法会导致产生两个会话,导致提交无法完成。类似这样:




可以发现两个值的内容完全不一样。

由于了解不够,急于求成没了解自己的需求(个人检讨)

其实在requests库中还有高级用法“会话对象”session实例:

r=requests.Session()
通俗理解就是当你和他人谈话的时候可以执行到对话结束。

而使用get和post方法时候每次生成一个新的会话。

http://docs.python-requests.org/zh_CN/latest/user/advanced.html#advanced   (高级用法文档) 

准备工作完成,接下来就应该分析问题了,我们需要把网页中的计算式提取出来,然后进行运算,运算完将计算结果post出去。

分析网页:


需要将<div name='my_expr'>(9044 + 461) x (6060 - 80) - (793 + 396 - 437) x 979 </div>=?

这个字符串提取出来,使用正则表达式。


模式
描述
^
匹配字符串的开头
$
匹配字符串的末尾。
.
匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。
[...]
用来表示一组字符,单独列出:[amk] 匹配 'a','m'或'k'
[^...]
不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。
re*
匹配0个或多个的表达式。
re+
匹配1个或多个的表达式。
re?
匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式
re{ n}
 
re{ n,}
精确匹配n个前面表达式。
re{ n, m}
匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式
a| b
匹配a或b
(re)
G匹配括号内的表达式,也表示一个组
(?imx)
正则表达式包含三种可选标志:i, m, 或 x 。只影响括号中的区域。
(?-imx)
正则表达式关闭 i, m, 或 x 可选标志。只影响括号中的区域。
(?: re)
类似 (...), 但是不表示一个组
(?imx: re)
在括号中使用i, m, 或 x 可选标志
(?-imx: re)
在括号中不使用i, m, 或 x 可选标志
(?#...)
注释.
(?= re)
前向肯定界定符。如果所含正则表达式,以 ... 表示,在当前位置成功匹配时成功,否则失败。但一旦所含表达式已经尝试,匹配引擎根本没有提高;模式的剩余部分还要尝试界定符的右边。
(?! re)
前向否定界定符。与肯定界定符相反;当所含表达式不能在字符串当前位置匹配时成功
(?> re)
匹配的独立模式,省去回溯。
\w
匹配字母数字
\W
匹配非字母数字
\s
匹配任意空白字符,等价于 [\t\n\r\f].
\S
匹配任意非空字符
\d
匹配任意数字,等价于 [0-9].
\D
匹配任意非数字
\A
匹配字符串开始
\Z
匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串。c
\z
匹配字符串结束
\G
匹配最后匹配完成的位置。
\b
匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。
\B
匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。
\n, \t, 等.
匹配一个换行符。匹配一个制表符。等
\1...\9
匹配第n个分组的子表达式。
\10
匹配第n个分组的子表达式,如果它经匹配。否则指的是八进制字符码的表达式。
https://www.cnblogs.com/chuxiuhong/p/5885073.html (python正则表达式的一篇文章)

由于提取到的是 * 为 x,需要将计算式中的x替换为*,使用字符串中的replace方法。

str.replace('oldchr','newchar')

替换后字符串就成了:

(9044 + 461) * (6060 - 80) - (793 + 396 - 437) * 979

使用python的eval()函数将字符串进行计算。


得到结果,然后使用以下代码:

payload={"pass_key":d}
e=session.post(url,payload)
encoding='UTF-8'
print(e.text)

调用session方法,将得到的结果post出去。

完整代码如下:

import requests
import re


session = requests.Session()
url='http://ctf5.shiyanbar.com/jia/'
r=session.get(url)
r.raise_for_status()
r.encoding='gb2312'
print(r.text)
key='name=\'my_expr\'>(.*?)</div>'
b="".join(re.findall(key,r.text))
c=b.replace('x','*')
print(c)
d=(eval(c))
print(str(d))

payload={"pass_key":d}
e=session.post(url,payload)
encoding='gb2312'
print(e.text)

运行结果:


得到key。

如有错误希望大家指出!









版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/h1012946585/article/details/80268584

智能推荐

自动驾驶OS市场的现状及未来_九章智驾的博客-程序员秘密

站在车企的角度看,QNX有点像Mobileye——尽管“易用”,但限制了车企的自主性;而Linux则有点像英伟达——比较“难用”,但赋予了车企很大的自主权及面向未来的兼容性。随着车企对软件...

kubernetes应用flannel失败_m673010624的博客-程序员秘密

按照官网给的命令kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml回头查看k8s的运行状态,有一项卡在了这里kubectl get pods -n kube-system显示ImagePullBackOffkube-flann...

浅谈springMVC中的设计模式(4)——建造者模式_春天写下一个bug的博客-程序员秘密

建造者模式,对于后端开发人员来说应该是很熟悉的,我们比较常用的HttpClient框架在构建Client时就用到了建造者模式。定义 惯例先来看看建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。UriComponents 可以说建造者模式理解起来是比较的容易的。它就是将复杂类的构建与其本身解耦合,并在其构造类中完成对它不同形式的创建。 在sp...

关于PInvoke 和COM Interop _hcmfys2009的博客-程序员秘密

关于PInvoke 和COM Interop.1. 平台调用        利用平台调用这种服务,托管代码可以调用在动态链接库 (DLL)(如 Win32 API 中的 DLL)中实现的非托管函数。此服务将查找并调用导出的函数,然后根据需要跨越互用边界封送其参数(整数、字符串、数组、结构等)。要封装平台功能,一种有效的方法是将常用的 DLL 函数包装在托管类中。虽然不必在每种情形下都这样做,但...

servletConfig与servletContext_donCoder的博客-程序员秘密

一、区别1、定义 1)ServletConfig:Servlet的配置对象,容器在初始化Servlet时通过它传递信息给Servlet。 2)ServletContext:上下文对象,提供了一系列方法供Servlet与Web容器交互。2、创建时机 1)ServletConfig:在容器初始化Servlet的时候,并为其提供上下文初始化参数的名/值对的引用。 2)ServletContext:容器启动的时候,并为其提供Servlet初始化参数的名/值...

根据总条数和每页数据计算页数_根据总条数算页数_咸于233的博客-程序员秘密

分页总数计算,根据总记录数获取分页总数int pageSize = 20; //每页记录数量int totalCount = 100005; //总记录数int pageCount; //总页数//方法一:pageCount = (totalCount + pageSize - 1) / pageSize; //推荐写法//方法二:pageCount = (totalCount - ...

随便推点

仿苹果 底部弹窗 选择列表_仿苹果消息弹出框_半身风雪的博客-程序员秘密

showDialog(barrierDismissible: true,//是否点击空白区域关闭对话框,默认为true,可以关闭context: context,builder: (BuildContext context) {var list = List();list.add(‘拍摄照片’);list.add(‘从相册选取’);list.add(‘选择文件’);return ...

【PAT 乙级1036】跟奥巴马一起编程_一——一的博客-程序员秘密

输入格式:输入在一行中给出正方形边长 N(3≤N≤20)和组成正方形边的某种字符 C,间隔一个空格。输出格式:输出由给定字符 C 画出的正方形。但是注意到行间距比列间距大,所以为了让结果看上去更像正方形,我们输出的行数实际上是列数的 50%(四舍五入取整)。输入样例:10 a//结尾无空行输出样例:aaaaaaaaaaa aa aa aaaaaaaaaaa//结尾无空行AC程序#include&lt;stdio.h&gt;int

在小程序里 用php curl 访问 imgSecCheck 报41005错误_小程序 errcode 41005_灰熊哦的博客-程序员秘密

想用到微信公众平台的图片识别系统,结果报错{"errcode":41005,"errmsg":"media data missing hint: [xScHza03164711]"}"代码如下:&lt;?php class getImgSecCheck{function get_data(){ $url = "https://api.weixin.qq.com/wxa/im...

ubuntu server连接wifi_ubuntu界面连接wifi_我就是全世界的博客-程序员秘密

ubuntu 连接wpa2的wifi需要用到工具wpasupplicant启动无线连接获取ip最近在香橙派zero plus上烧录了ubuntu16 server的镜像 因为没有网线口 只能用wifi进行连接一般情况下ubuntu 16是集成了wpa_supplicant工具的我们直接用就好了其配置文件目录 /etc/wpa_supplicant在该文件夹下建立home.conf文件(...

2020年新媒体运营的就业前景怎么样?_骨灰级收藏家的博客-程序员秘密

疫情之下,求职就业有多难?谁能想到,2020年开年就飞来一只黑天鹅。如果没有疫情的影响,这个春节本该是大家大肆消费的时节,可因为病毒的快速蔓延,我们只能瑟缩在家中,不能旅游、不能外出聚餐、不能正常上班…没有消费,产品就会滞留,企业日子自然不好过。企业不好过就更别提还招聘员工干活了,辞退和裁员都来不及。1.年年喊的史上最难就业季?今年最惨!根据智联招聘统计最近统计数据显示:今年的企业招聘需求整体呈缩减趋势。从整体招聘规模的变化来看,更多企业将招聘规模调整到10人以下,原本招聘规模在500人以上的企业,

智能循迹避障小车C语言程序编写思路,智能循迹避障小车毕业设计论文_王小约的博客-程序员秘密

《智能循迹避障小车毕业设计论文.docx》由会员分享,可免费在线阅读全文,更多与《智能循迹避障小车毕业设计论文》相关文档资源请在帮帮文库(www.woc88.com)数亿文档库存里搜索。1、较器来采集高低电平,从而实现信号的检测。避障亦是此原理。电路图如图。市面上有很多红外传感器,在这里我选用TCRT型光电对管。图循迹原理图主控电路本模块主要是对采集信号进行分析,同时给出PWM波控制电机速度,起停...

推荐文章

热门文章

相关标签