赞
踩
说明:网络爬虫就是从互联网中定向或者不定向的采集信息的一种程序。网络爬虫有很多类型:通用网络爬虫、聚焦网络爬虫等等
应用:
(1)搜索引擎
(2)采集金融数据
(3)采取商品信息
(4)自动过滤广告
(5)采集信息,进行相关数据分析等等
说明:要用正则表达式,要导入模块import re
说明:是正则表达式中最基本的单位,每个正则表达式中至少要包含一个原子,常见的原子有:普通字符作为原子、非打印字符作为原子,通用字符作为原子、原子表四类。
普通字符作为原子
import re
str = 'Hello123Python!'
pat = '123' #pat为正则表达式
result = re.search(pat, str)
print(result)
# 结果:<re.Match object; span=(5, 8), match='123'>
非打印字符作为原子:
① 换行符:\n
② 制表符:\t
③ 回车符:\r
等等
import re
str = 'Hello123Python!'
pat2 = '\n'
print(re.search(pat2, str))
# 结果:None
通用字符作为原子
\w
字母、数字、下划线\W
非字母、数字、下划线\d
十进制数\D
非十进制数\s
匹配任何不可见字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。\S
匹配任何可见字符。等价于[^ \f\n\r\t\v]。import re
str = 'Hello123Python!'
pat3 = '\w\d\d'
print(re.search(pat3, str))
# 结果:<re.Match object; span=(4, 7), match='o12'>
原子表:[一个或多个原子]
,这表示一个原子表,匹配时从中选一个符合要求的原子,若没有,返回None
还可以通过[^一个或多个原子]
进行取反,表示除了原子表中的元素都可以提取
import re
str = 'Hello123Python!'
pat4 = '\w[139]\d'
print(re.search(pat4, str))
# 结果:<re.Match object; span=(4, 7), match='o12'>
pat5 = 'l[^alo]' #表示除了原子表[alo]内的元素外我都可以提取
print(re.search(pat5, str))
# 结果:None
说明:元字符就是正则表达式中具有一些特殊含义的字符。
.
表示 除\n
和\r
以外的任何一个字符
[\s\S]
^
表示后一个原子处于开始位置$
表示前一个原子处于结束位置*
表示前面的原子接着出现0或1或多次?
表示前面的原子接着出现0或1次+
表示前面的原子接着出现1或多次{n}
表示前面一个原子出现恰好n次(操作时n用具体的数字代替){n,}
表示前面一个原子出现至少n次{n, m}
表示最少匹配 n 次且最多匹配 m 次|
表示模式选择或
"\da|\db"
表示为\da
或\db
[.com|.cn]
表示为.com
或.cn
()
表示模式单元,直接提取正则式中的某部分[\s\S].*
、[\d\D].*
、[\w\W].*
都可以无限匹配,包括换行符eg:
import re str = 'Hello1ooo123Python!' pat = '^He..' #pat为正则表达式 result = re.search(pat, str) print(result) pat2 = '..on!$' #pat2为正则表达式 result = re.search(pat2, str) print(result) pat3 = '1o*' #pat3为正则表达式 result = re.search(pat3, str) print(result) pat4 = 'e.*' #pat4为正则表达式 result = re.search(pat4, str) print(result) pat5 = '1o{4}' #pat5为正则表达式 result = re.search(pat5, str) print(result) pat6 = 'o(\d*?)P' result = re.compile(pat6).findall(str) print(result) #结果: <re.Match object; span=(0, 4), match='Hell'> <re.Match object; span=(14, 19), match='thon!'> <re.Match object; span=(5, 9), match='1ooo'> <re.Match object; span=(1, 19), match='ello1ooo123Python!'> None ['123']
I
匹配时忽略大小写S
让.
能够匹配换行符M
多行匹配U
unicodeL
本地化识别匹配注意:以上字母必须为大写
eg:
import re str = 'Hello1ooo123Python!' pat = 'hell' #pat为原子 result = re.search(pat, str, re.I) print(result) str = '''Hello1ooo 123Python!''' pat = 'oo.1' #pat为原子 result = re.search(pat, str, re.S) print(result) #结果: <re.Match object; span=(0, 4), match='Hell'> <re.Match object; span=(7, 11), match='oo\n1'>
说明:
.*
、\d*
等等,就是元字符或原子与符号*
的组合.*?
、\d*?
等等,就是元字符或原子与符号*?
的组合eg:
import re
str = 'HelloPython!'
pat = 'H.*o' #贪婪模式
pat2 = 'H.*?o' #懒惰模式
result = re.search(pat, str)
result2 = re.search(pat2, str)
print(result)
print(result2)
#结果:
<re.Match object; span=(0, 10), match='HelloPytho'>
<re.Match object; span=(0, 5), match='Hello'>
re.match()
函数,对数据从头开始匹配,结果只有一个re.search()
函数,任意位置匹配,结果只有一个list
,语法:re.compile(正则表达式).findall(数据)
re.sub(正则表达式, 字符串, 数据)
函数,任意位置匹配,结果是多个,用指定的字符串代替匹配到的字符串eg:
import re #match()函数 str = 'HelloPython!' pat = 'H.*?o' #懒惰模式 print(re.match(pat, str)) pat = 'h.*?o' print(re.match(pat, str)) str = 'HelloHsadoHazzzoHo' pat = 'H.*?o' print(re.search(pat, str)) #全局匹配函数 result = re.compile(pat).findall(str) print(result) #sub()函数 out = re.sub(pat, 'J', str) print(out) #结果: <re.Match object; span=(0, 5), match='Hello'> None <re.Match object; span=(0, 5), match='Hello'> ['Hello', 'Hsado', 'Hazzzo', 'Ho'] JJJJ
re.sub()
函数能替换所有符合要求的正则表达式,下面举一个清洗数据的例子:
import re
str = '<a>abc<b>defg<c>'
pat = '<.*?>'
data = re.sub(pat, '', str)
print(data)
# 结果:
abcdefg
.com
和.cn
网址eg:
import re
str = '<a href=http://www.baidu.com>百度首页</a>'
#[a-zA-Z]表示从a到z和A到Z的所有字母
#|为模式选择或 [.com|.cn]表示为.com或.cn
pat = '[a-zA-Z]+://[^\s]*[.com|.cn]'
print(re.compile(pat).findall(str))
#结果:
['http://www.baidu.com']
说明:电话号码有两种
eg:
import re
str = 'dsadasdgs031-1564653233adads2312-24644567dZDxz'
pat = '\d{3}-\d{8}|\d{4}-\d{7}'
print(re.compile(pat).findall(str))
#结果:
['031-15646532', '2312-2464456']
eg:爬取该网址内的QQ号
#简单爬虫编写,自动爬取上面两个QQ号 import urllib.request import re data = urllib.request.urlopen("https://www.yiibai.com/python3").read().decode("utf-8") #decode()函数是设置读取编码格式 pat = 'QQ群:(\d*)' result = re.compile(pat).findall(data) print(result) #结果: ['227270512', '479429477'] #简单爬虫编写,自动爬取该网页所有QQ群 import urllib.request import re data = urllib.request.urlopen("https://www.yiibai.com/python3").read().decode("utf-8") #decode()函数是设置读取编码格式 pat = '[1-9]{6,10}' result = re.compile(pat).findall(data) # 去除重复的QQ号 result = list(set(result)) print('该网站共有'+str(len(result))+'个QQ群:') print(result) # 结果: 该网站共有17个QQ群: ['769728683', '65515455', '5798217', '415553199', '1932146371', '6215498', '175248146', '9485766451', '944874', '6494738921', '456236', '816911', '629264796', '153241', '397883996', '479429477', '851549']
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。