文末有干货 “Python高校”,马上关注
真爱,请置顶或星标
来源:离岛 链接:
https://segmentfault.com/a/1190000013196759
通过爬虫抓取到的内容,需要提取出有用的东西,这一步就是数据提取或者数据清洗
内容一般分为两部分,非结构化的数据 和 结构化的数据。
非结构化数据:先有数据,再有结构,比如文本、电话号码、邮箱地址(利用正则表达式处理)、HTML 文件(利用正则、XPath、CSS选择器)
结构化数据:先有结构、再有数据,比如JSON(JSON Path)/XML (Xpath/正则等)
不同类型的数据,我们需要采用不同的方式来处理。
实际上爬虫一共就四个主要步骤:
明确目标 (要知道你准备在哪个范围或者网站去搜索)
爬 (将所有的网站的内容全部爬下来)
取 (去掉对我们没用处的数据)
处理数据(按照我们想要的方式存储和使用)
什么是正则表达式
正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
在任何编程语言中都有正则表达式,JS、JAVA、C#等等多有,Python 自1.5版本起增加了re 模块,re 模块使 Python 语言拥有全部的正则表达式功能。
正则匹配的规则
re模块使用步骤
在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。
有一点需要特别注意的是,正则表达式使用 对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀,示例:r'testt.tpython'
re 模块的一般使用步骤如下:
1.使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象
2.通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。
3.最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作
import re
str="abcdefabcdef" #待匹配的字符串
m=re.compile("a") #编译正则表达式,第一个参数是表达式字符串,第二个参数是标志位,比如re.I 匹配不对大小写敏感,re.S等等
result=m.findall(str)
print(result) #输出["a","a"]
具体的正则表达式如何编写,其实就是根据上图的元字符进行组合,匹配你要的结果,
小练习1:找出字符串中的数字。d表示 0-9 + 表示匹配前一个字符1次或无限次
import re
str="a11b22c3"
m=re.compile("\d+")
print(m.findall(str)) #输出['11', '22', '3']
小练习2:找出单词中包含 oo的单词
import re
str="1oo1 tina is a good girl ,she is cool"
m=re.compile("[a-z]oo[a-z]")
print(m.findall(str)) #输出['good', 'cool']
大概知道了正则的书写方式以后,先来看后续的步骤,不要着急,编写正则是个积累的过程。
compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象,Pattern 对象提供的一系列方法对文本进行匹配查找,来罗列下方法:
m.search函数会在字符串内查找模式匹配,只要找到第一个匹配然后返回,如果字符串没有匹配,则返回None。
import re
str="1oo1 tina is a good girl ,she is cool"
m=re.compile("[a-z]oo[a-z]")
print(m.search(str)) #<_sre.SRE_Match object; span=(15, 19), match='good'>
m.findall遍历匹配,可以获取字符串中所有匹配的字符串,返回一个列表。
import re
str="1oo1 tina is a good girl ,she is cool"
m=re.compile("[a-z]oo[a-z]")
print(m.findall(str)) #输出['good', 'cool']
m.match()决定RE是否在字符串刚开始的位置匹配
import re
str="aooz tina is a good girl ,she is cool"
m=re.compile("[a-z]oo[a-z]")
#str为待匹配的字符串,第一个参数是起始位置,第二个是字符串长度,从0开始,长度为6
print(m.match(str,0,6)) #<_sre.SRE_Match object; span=(0, 4), match='aooz'>
m.split()按照能够匹配的子串将string分割后返回列表
import re
str="aa1bb2cc3dd4"
m=re.compile("\d+")
# split(string[, maxsplit]),maxsplit 用于指定最大分割次数,不指定将全部分割
# list=m.split(str) #输出['aa', 'bb', 'cc', 'dd', '']
list=m.split(str,2) #输出['aa', 'bb', 'cc3dd4']
print(list)
m.sub()使用re替换string中每一个匹配的子串后返回替换后的字符串。
import re
str="aa1bb2cc3dd4"
m=re.compile("\d+")
result=m.sub('*',str)
print(result) #输出aa*bb*cc*dd*
正则练习题
1 已知字符串:
info = 'baidu'
用正则模块提取出网址:"http://www.baidu.com"和链接文本:"baidu"
2 字符串:"one1two2three3four4" 用正则处理,输出 "1234"
3 已知字符串:text = "JGood is a handsome boy, he is cool, clever, and so on..." 查找所有包含'oo'的单词。
正则练习题答案:
import re
# 1 已知字符串:
# info = 'baidu'
# 用正则模块提取出网址:"http://www.baidu.com"和链接文本:"baidu"
info = 'baidu'
# pattern1=re.compile(r'http:.+.com')#['www.baidu.com', 'baidu']
# pattern1=re.compile(r"[a-z.]*baidu[.a-z]*")#['www.baidu.com', 'baidu']
pattern1=re.compile(r"[w.]*baidu\.*\w*") #['www.baidu.com', 'baidu']
f1=pattern1.findall(info)
print(f1)
# print(f1[0])
#2 字符串:"one1two2three3four4" 用正则处理,输出 "1234"
info1="one1two2three3four4"
pattern2=re.compile(r'\d{1}')
f2=pattern2.findall(info1)
print(f2) #['1', '2', '3', '4']
# 3 已知字符串:text = "JGood is a handsome boy, he is cool, clever, and so on..." 查找所有包含'oo'的单词。
info3="JGood is a handsome boy, he is cool, clever, and so on..."
pattern3=re.compile(r'\w*oo\w*')
f3=pattern3.findall(info3)
print(f3)
爬虫内涵段子正则匹配爬取
#coding:utf8
from urllib import request
import re
#定义一个爬虫类
class Splider:
def __init__(self):
# 初始化起始页的位置
self.page = 1
# 爬取开关,如果为True继续爬取
self.switch = True
def loadPage(self):
'''
下载页面
'''
# 拼接完成的url
url = 'http://www.neihan8.com/article/list_5_'+str(self.page)+'.html'
headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
request1 = request.Request(url,headers=headers)
response = request.urlopen(request1)
# 每页的html源码
html = response.read().decode('gbk')
print(html)
# 创建正则表达式规则对象,匹配每页里的段子内容,re.S是匹配全部的字符串内容
pattern = re.compile('(.*?)',re.S)
# 将正则匹配对象应用到html源码字符串里,返回这个页面里的所有段子的列表
content_list = pattern.findall(html)
print(content_list)
# for content in content_list:
# print content.decode('gbk')
self.dealPage(content_list)
def dealPage(self,content_list):
'''
处理每页的段子
content_list: 每页的段子列表集合
'''
for item in content_list:
item = item.replace('',"").replace('
','').replace('”','').replace('“','').replace('
','').replace('
','').replace('…','')
print(item)
# 处理完成后调用writePage()将每个段子写入文件内
self.writePage(item)
def writePage(self,item):
'''
把每条段子逐个写入文件里
item:处理后的每条段子
'''
# 写入文件内
print('正在写入数据....')
with open('duanzi.txt','a') as f:
f.write(item)
def startWork(self):
'''
控制爬虫的功能
'''
while self.switch:
# 用户确定爬取的次数
self.loadPage()
command = input('如果想继续爬取,请按回车(退出输入的quit)')
if command == 'quit':
# 如果停止爬取,则输入quit
self.switch = False
# 每次循环,page页码自增1
self.page = self.page+1
print("谢谢使用")
if __name__ == '__main__':
duanziSpider = Splider()
duanziSpider.startWork()
(完)
技术书籍PDF电子书下载
我总结的82页《Python之路V1.1.pdf》,都是干货
520 页机器学习笔记!图文并茂可能更适合你,文末附下载方法
541页的《利用Python进行数据分析》(附电子书和源码下载)
下载 | 《Python数据科学速查表中文版》
343页经典书籍《算法之道(第二版)》pdf下载
下载 | Python 学习手册(第 4 版)
300 页干货!李宏毅《一天搞懂深度学习》(附下载)
可以通过下述步骤来获取: 1. 加我微信二维码。
2. 回复关键词:PDF
工具
最靠谱的Pycharm 汉化安装+ 破解详细教程!
Python数据分析、挖掘常用工具
Python 最强 IDE 详细使用指南!
一款 Python 自动抢票神器,收藏起来回家不愁!
实践和数据分析
Python 开发植物大战僵尸游戏
用 Python 来找合适的妹子
一键分析你上网行为,看你是在认真工作还是摸鱼
Python给照片换底色,基于opencv模块
10个经典的小技巧:快速用 Python 进行数据分析
使用 Python 进行微信好友分析
爬虫
我给曾经暗恋的初中女同学,用Python实现了她飞机上刷抖音
为了能早点买房,我用 Python 预测房价走势!
被女朋友三番五次拉黑后,我用 Python 写了个“舔狗”必备神器
谁偷偷删了你的微信?别慌!Python 揪出来为了给女友挑合适的内衣,我用 Python 爬了天猫内衣店的数据Python爬完数据后,我终于买车不用坐引擎盖哭啦
算法
机器学习必学10大算法
哈工大硕士生用Python实现了11种数据降维算法,代码已开源!
Github标星3w+,热榜第一,如何用Python实现所有算法
Python算法:如何解决回文索引问题
Python算法:如何解决楼梯台阶问题
这里除了干货一无所有
看完本文有收获?请转发分享给更多人