gingingg
- 关注
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9
0
1
2
3
4
5
6
7
8
9

一.爬虫原理与正则表达式的重要
无论我们在学习何种编程语言:java,php,python或其他语言时,或者进行代码审计的时候,都会遇到使用正则表达式的语句,而在代码审计中含有正则表达式的语句更是我们的目标。所以正则表达式尤为重要。
而正式开始复习爬虫之前我们还是需要强调网络爬虫到底是什么,网络爬虫,顾名思义,就是利用我们所写的脚本在互联网中定向或不定向的采集信息的一种程序,而也就是聚焦网络爬虫与通用网络爬虫。
1.爬虫的原理:
(以下为通用网络爬虫的运行过程):
1.首先将原始的url放入队列中
2.在原始url界面中查看新的url(源码中查看)
3.将新的url存放进队列中
4.读取新的url及其中信息
5.查看是否满足完成条件,满足则退出
而聚焦爬虫则是相对于上面的过程会在将新的url放入队列读取的时候多进行一步,会将不满足条件的url进行过滤,或不满足条件的信息进行过滤。
2.神魔是正则表达式 -_- :
上面进行了正则表达式概念的论述,也表明了正则表达式在学习网安与爬虫的时候的重要性,基础嘛,还是要学习好的,以后才可以见了代码不慌,而正则表达式就是一种进行数据筛选的表达式,常见的还有xpath表达式,大佬们可以自行查阅了解。
3.原子
在正则表达式中,原子是最基本的组成单位,而每个正则表达式至少要包含一个原子。
最常见的原子类型有:普通字符,非打印字符,通用字符或原子表
下面是例子:
#普通字符做原子
import re
ste="dhasjdhak"
pipei="jdh"
a=re.search(pipei,ste)
print(a)
#非打印字符作为原子
ste1="""dhasjdhak
在这里有一个换行符"""
pipei1="\n"
a1=re.search(pipei1,ste1)
print(a1)
#通用字符作为原子
'''
常见通用字符:
\w:字母数字下划线
\W:除字母数字下划线
\d:十进制数字
\D:除十进制数字
\s:空白字符
\S:除空白字符
'''
str2="dhasj1 d123hak"
pipei2="\w\d\s\w\w\w"
a2=re.search(pipei2,str2)
print(a2)
#原子表
#原子表就是在[]中任意一个原子只要包含的就可以匹配
str3="dhasjdhak"
pipei3="as[jhd]dh" #值得注意的是当在原子表中添加^时,例如[^jhd],则此时原子表的意思就是除了jhd不提取其他都可以匹配提取
a3=re.search(pipei3,str3)
print(a3)
当没有匹配的时候会显示none,需要注意的是,我们需要匹配的原子在search函数使用中要放在第一个参数的位置,否则不会报错但是一般会显示none,因为这是匹配目标与被匹配目标反了,所以当然会匹配不成功了。
4.元字符
在正则表达式中我们有时需要进行一些遍历匹配,而一次一次写语句过于麻烦了,所以我们可以使用元字符来进行操作。
元字符就是在正则表达式中一些特殊含义的字符,方便了我们的操作。
#元字符
'''
. :除换行外的任意一个字符
^ :不在原子表中时代表匹配开始位置
$ :匹配结束位置
* :前面的原子出现0/1/多次
? :前面的原子出现0/1次
+ :前面的原子出现1/多次
{n} :前面的原子出现n次/////{n,} :前面的原子至少出现n次
{n,m} :前面的原子至少出现n次,至多出现m次
| :模式选择符
() :模式单元
'''
string='''taoyunnnn1122ddsajkldjasdujisajdoas'''
pat="tao..."
rst=re.search(pat,string)
print(rst)
pat="^ao..."
rst=re.search(pat,string)
print(rst)
pat="bai..$"
rst=re.search(pat,string)
print(rst)
pat="tao.*"
rst=re.search(pat,string)
print(rst)
pat="taoyun+"
rst=re.search(pat,string)
print(rst)
pat="yun{1,4}"
rst=re.search(pat,string)
print(rst)
5.模式修正符
在不改变正则表达式的情况之下,通过模式修正符改变正则表达式的含义,来实现匹配结果的功能。
#模式修正符
'''
I 匹配时忽略大小写*
M 多行匹配*
L 本地化识别匹配
U unicode
S 让.匹配包括换行符*
'''
string='''Python
这又是一个换行符'''
pat="hon."
rst=re.search(pat,string,re.S) #利用 re.模式修正符 来运用
print(rst)
6.贪婪模式与懒惰模式
顾名思义,贪婪模式就是尽量多的匹配,但是懒惰模式就是尽量少匹配。
#贪婪模式与懒惰模式
string="lidaluchengshuaid"
st1="l.*d" #贪婪模式 比较模糊
st2="l.*?d" #懒惰模式 比较精准
str1=re.search(st1,string)
str2=re.search(st2,string)
print(str1)
print(str2)
7.正则表达式函数
正则表达式函数有re.match()函数,re.search()函数,全局匹配函数,re.sub()函数等。
match函数
从头开始匹配
string="lidaluchengshuaid"
st1="i.*d" #贪婪模式
str1=re.match(st1,string)
print(str1)
此时由于i不在开头的字符,所以匹配无法成功。
search函数
我们之前一值使用的就是search函数,与match不同的是search可以在任意地方进行匹配使用。
所以match更多用于一些限定的地方进行匹配。
全局匹配函数
#3.全局匹配函数
#使用search与match函数时,只能对于目标字符串进行一次匹配,但是当我们要对其进行多次匹配时,就会用到全局匹配
string="lidaluchengshuaid"
st1="l.*?d"
str1=re.compile(st1).findall(string)
print(str1)
8.常见匹配
#匹配网址
string="<a herf='http://www.baidu.com'>百度首页</a>"
str='[a-zA-Z]+://[^/s]+[.com|.cn]'
res=re.compile(str).findall(string)
print(res)
#匹配电话号码
string="dsajkdjla019-317288718dahjsdjaskl0986-73812793127ajshkdljal"
str="\d{4}-\d{7}|\d{3}-\d{8}"
res=re.compile(str).findall(string)
print(res)
9.简单爬虫编写
import urllib.request
import re
res = urllib.request.urlopen("https://www.xxxx.net/").read().decode("utf-8")
str="<script src=[^/d][a-zA-Z]://[^/d]+[.js|.jsp][^/d]></script>"
tse=re.compile(str).findall(res)
print(tse)
爬取某网站的src网址,
仅限于玩耍,有的兄弟可能运行不起来,兄弟们可以自己试着写写。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)

