您的位置:首页 > 编程语言 > Python开发

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('爬取完成')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: