Python爬虫——4-1.数据筛选之正则表达式
2018-01-12 21:49
591 查看
一、关于正则表达式的回顾
1.正则表达式两种操作:核心操作和快捷操作 核心操作:通过re模块的compile函数,将正则字符串编译成匹配对象,通过匹配对象对字符串进行匹配 如: reg="my" pattern=re.compile(reg) str="my nama is youya ,my age is 20!" pattern.match(str) 快捷操作:直接使用re模块的match、search、findall、finditer等函数 如: re.match(reg,str)
match():
用于根据表达式进行字符匹配的操作函数~只匹配一次[从指定的起始位置进行匹配]
search(): 用于根据表达式进行字符匹配的操作函数~只匹配一次[从完整的目标字符串中进行检索匹配] findall(): 用于根据表达式进行字符匹配~匹配多次,返回匹配到的列表 finditer(): 用于根据表达式进行字符撇皮~匹配多次,返回匹配到的迭代器 split(): 根据指定的表达式对目标字符串进行切割,返回切割后的列表 sub(): 用于字符替换 1. 匹配对象的函数match(string[, pos[, endpos]]) search(string[, pos[, endpos]]) findall(string[, pos[, endpos]]) finditer(string[, pos[, endpos]])2. re模块的函数match(pattern, string, flags=0) search(pattern, string, flags=0) findall(pattern, string, flags=0) finditer(pattern, string, flags=0) 3. 公共函数【匹配对象|re模块操作方式一样】split():拆分字符串的函数 sub():根据正则替换字符串的函数
4.核心操作和快捷操作两种方法的match函数的对比
# 引入正则模块re import re str="my name is youya ,my age is 20!" reg1='my' reg2='20' # 核心操作的match函数 # 编译匹配对象pattern p1=re.compile(reg1) p2=re.compile(reg2) # match函数 # 1.1-1使用匹配对象的match函数,使用默认的从起始位置开始匹配 str_reg1=p1.match(str) str_reg2=p2.match(str) print str_reg1,str_reg1.group() print str_reg2 # print str_reg2.group() # 运行结果 # <_sre.SRE_Match object at 0x0000000002E7FAC0> my # None 报错:None类型没有group属性 #1..1-2使用匹配对象的match函数,自定义起始位置开始匹配 str_reg3=p1.match(str,1) str_reg4=p2.match(str,28) print str_reg3 print str_reg4 print str_reg4.group() print str_reg4.span() #运行结果 # None # <_sre.SRE_Match object at 0x0000000002C2F098> # 20 # (28, 30)
5.正则表达式基本语法结构
表达式 | 描述 |
^ | 匹配开头 |
$ | 匹配结束 |
. | 匹配任意..字符 |
x? | 匹配字符x出现0次或者1次 |
x+ | 匹配字符x出现1次或者多次 |
x* | 匹配字符x出现0次或者多次 |
(xy)+ | 分组的方式,匹配字符串xy出现1次或者多次 |
(x|y)+ | 匹配字符x或者y出现了1次或者多次 |
[xy]+ | 匹配字符x或者y出现了1次或者多次 |
[0-9]+ | 匹配一个数字出现了1次或者多次; |
[a-z]+ | 匹配一个小写字母出现了1次或者多次 |
[A-Z]+ | 匹配一个大写字母出现了1次或者多次 |
[a-zA-Z]+ | 匹配一个字母[大小写均可]出现了1次或者多次 |
x{m,} | 匹配字符x出现了m次以上 |
x{m,n} | 匹配字符x出现了m次以上n次以下 |
x{,n} | 匹配字符出现了n次以下 |
\d | 匹配一个数字,和[0-9]相同 |
\D | 匹配一个非数字,和[^0-9]相同 |
\w | 匹配一个字母数字或者下划线,和[a-zA-Z0-9_]相同 |
\W | |
\s | 匹配一个空白字符 |
\S | |
\b | 匹配一个字符的边缘位置 hello worhellold : \bhello\b |
* | 贪婪匹配符,和其他表达式一起使用 |
? | 懒惰匹配符,和其他表达式一起使用 |
二、正则表达式在爬虫中的应用
1. 关于数据
爬虫程序,主要是运行在网络中进行数据采集的一种计算机程序,正常的一个爬虫采集数据的过程大致如下:
* 访问目标服务器
* 采集数据,获取访问url的数据
* 根据需要筛选数据
* 处理数据,存储到文件或者数据库,等待下一步进行数据分析或者数据展示
由于存在着不同的服务器和软件应用,所以爬虫获取到的数据就会出现各种不同的表现形式,但是总体来说还是有规律的,有规律就可以被掌握的
首先,关于爬虫处理的数据,一般分为两种数据
* 非结构化数据:数据的内容整体没有固定的格式和语法规范
* 结构化数据:数据的内容有固定的语法规范,按照一定的结构进行组织管理
这两种数据都分别表示什么样的数据呢,分别应该通过什么样的方式进行处理呢,这是爬虫在采集完数据之后,针对数据进行筛选必须要进行的操作
接下来,了解两种不同的数据的表现形式
* 非结构化数据
无格式字符串数据:用户名、邮箱、账号、电话号码、地址、电影名称、评分、评论、商品名称等等
* 结构化数据
带有一定的格式的数据:HTML网页文档、XML网页文档、JSON等等
第三,对于不同的数据,进行有效数据筛选时,应该分别怎么进行操作呢
* 非结构化数据:由于没有任何固定的格式,只能根据字符出现的规律进行动态匹配的方式来完成数据的提取:**正则表达式**
* 结构化数据:由于数据本身存在一定的规律性,可以通过针对这些规律的分析工具进行数据的提取:**正则表达式、Xpath、BeautifulSoup4、select、css等等**
2. 正则表达式
正则表达式是一门单独的技术,在实际操作过程中由于它优雅的字符匹配特性,各种编程语言都陆续支持正则表达式的操作方式,Python中通过内建模块re进行正则表达式的处理,大致按照如下三个步骤进行数据的操作:
* 确定源数据:获取整体数据
* 按照目标数据定义正则表达式匹配规则
* 从整体数据中匹配符合要求的数据
正则表达式的处理,最核心的是先掌握正则表达式的语法和匹配规则,根据实际操作的不同需要,正则表达式定义了不同的数据匹配方式
3.正则表达式在爬虫中的应用,以爬取百度图片为例
# -*-coding:utf-8 -*- ''' 主要讲解正则表达式在爬虫中的应用,以爬取百度图片为例 ''' # 引入需要的模块 import requests import re # 定义访问的路由 url='https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%94%AF%E7%BE%8E&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&word=%E5%94%AF%E7%BE%8E&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&pn=30&rn=30&gsm=1e&1515674436338=' header={ "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36", "Referer":"http://image.baidu.com/", "Accept-Encoding":"gzip, deflate, br", "Accept-Language":"zh-CN,zh;q=0.9", } # 发送请求 response=requests.get(url,headers=header,verify=False) response.encoding='UTF-8' content=response.text # 获取网页文本数据 # 使用正则匹配 reg='"thumbURL":"(.*?)"' pattern=re.compile(reg) url_list=pattern.findall(content) for url in url_list: filename =url[-20:] response2=requests.get(url,verify=False) # 得到图片的二进制文件 print('正在%s保存二进制文件'%filename.encode('utf-8')) with open('b_file/%s'%(filename),'wb') as f: f.write(response2.content) # .content表示二进制文件,.text表示文本文件 print('爬取完成')
相关文章推荐
- Python 爬虫4——使用正则表达式筛选内容
- Python 爬虫4——使用正则表达式筛选内容
- 转 Python爬虫入门七之正则表达式
- python3爬虫初探(三)之正则表达式
- Python数据分析学习-re正则表达式模块
- python 使用正则表达式的爬虫
- [转载]Python爬虫入门七之正则表达式
- Python 爬虫学习笔记之正则表达式
- 06Python爬虫---正则表达式01之原子
- python爬虫学习(1)--关于正则表达式输入和提取中文
- Python爬虫 正则表达式
- Python爬虫知识(2)——正则表达式复习
- 玩转python爬虫之正则表达式
- Python爬虫——4-2.数据筛选之XPath
- 正则表达式基础——以Python爬虫为实例
- 【Python3 爬虫】09_正则表达式(re.math()、re.search()、re.sub()、全局匹配函数)
- python3 爬虫入门(三)正则表达式基本使用
- Python爬虫入门七之正则表达式
- Python爬虫入门(7):正则表达式
- python-用正则表达式筛选文本信息