Python正则表达式和requests爬虫

Some people,when confronted with a problem,think,”I know,I’ll use regular expressions.”Now they have two problems.

----Jamie Zawinski

正则表达式

正则表达式是可匹配文本片段的模式。最简单的正则表达式为普通字符串,与自己匹配。python模块re提供了其对正则表达式的支持。

requests模块

Requests是用Python语言编写,基于urllib,采用Apache2Licensed开源协议的HTTP库,是一个需要单独安装的第三方库。通过pip执行指令:

1
pip install requests


来安装requests模块。py3版本安装时自带pip。如果报错,可能需要对pip进行更新,执行:

1
python -m pip install -U pip


来对pip安装更新,需要注意的是这里需要将python添加进环境变量才可以执行。这样就完成requests模块的安装。

脚本

接下来便可以尝试利用正则表达式结合requests爬虫来写一个脚本用于爬取网页信息,以一道简单的CTF题为例:http://120.24.86.145:8002/qiumingshan/
打开页面后要求2s内计算算术式的值,多次刷新后得到提示用post传递value参数:

首先引用模块正则表达式和requests爬虫:

1
import re

1
import requests

接下来使用Session对象来确保对话的持续,使服务器知道请求均为同一PC端发出。使用get获得网页源码中的内容:

1
search = requests.session()

1
resault = search.get('http://120.24.86.145:8002/qiumingshan/')

接下来通过正则表达式来提取需要利用的信息:

1
re = re.search(r'^<div>(.*)=\?;</div>$', resault.text,re.S|re.M|re.I)

在正则表达式中,“.”为通配符,与除换行符外的其他字符都匹配,“.*”表示通配符可出现0、1或多次。从网页中我们可以看到每次算术式都在改变,但是最后的“=?”是不变的,所以对最后的“=?”保留原样,并使用反斜杠\进行转义:“=\?”(正则表达式中问号代表0或1,是特殊字符),而为了表示re模块需要的单个反斜杠,通常需要用两个反斜杠来进行转义,包涵解释器的转义和re模块执行的转义。所以在表达式的开始我使用了原始字符串的标志r来取消了解释器反斜杠的使用。
由脱字符^来开始,打开链接,F12进行审查元素,可以看到需要利用到的部分包括在HTML标签“<div>…</div> ”中:

将主体算术部分用小括号“()”来进行编组,此时“.*”为编组1。以美元符号“$”来表示字符串的末尾,用resault.text将字符串返回。re.S、re.M、re.I的作用分别为以“.”代替任何字符,多行模式,以及忽略大小写,按位或运算符“|”在这里表示这些flags定义全部成立。

1
value ={'value': eval(re.group(1))}

定义一个字典value,其键值分别为’value’和算术式的结果。eval函数用于计算字符串表示的python表达式的值并返回结果,即计算出编组1中算术式的值,并作为值与’value’匹配。
发送post请求:

1
resault = search.post('http://120.24.86.145:8002/qiumingshan/', data=value)

post请求的参数以data关键字参数来传递,而data参数传递字典,这里传递的便是字典’value’。
显示结果:

1
2
print('The Resault is:',eval(re.group(1)))
print(resault.text)

这样解题的脚本便完成了。在IDLE中运行,可以得到flag。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2024 青域 All Rights Reserved.

UV : | PV :