德胜云资讯,添加一些关于程序相关的内容,仅供大家学习交流(https://www.wxclwl.com)

网站地图

搜索
德胜云咨询
后端分类 爬虫 网络安全 PHP SQL
热门标签:
最新标签:

什么是爬虫数据清洗Python爬虫数据提取爬虫数据存储硬核推荐,

日期:2023/03/26 05:11作者:朱政廷人气:

导读:这一步就是数据提取或者数据清洗内容一般分为两部分,非结构化的数据和结构化的数据。非结构化数话号码、邮箱地址、HTML文件结构化数据:先有结构、再...
通过爬虫抓取到的内容,需要提取出有用的东西,这一步就是数据提取或者数据清洗

内容一般分为两部分,非结构化的数据 和 结构化的数据。

非结构化数据:先有数据,再有结构,比如文本、电话号码、邮箱地址(利用正则表达式处理)、html 文件(利用正则、XPath、css选择器)

结构化数据:先有结构、再有数据,比如JSON(JSON Path)/XML (Xpath/正则等)

不同类型的数据,我们需要采用不同的方式来处理。

实际上爬虫一共就四个主要步骤:

明确目标 (要知道你准备在哪个范围或者网站去搜索)

爬 (将所有的网站的内容全部爬下来)

取 (去掉对我们没用处的数据)

处理数据(按照我们想要的方式存储和使用)

什么是正则表达式

正则表达式,又称规则表达式,通常被用来检索、替换那些符合某个模式(规则)的文本。

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

在任何编程语言中都有正则表达式,JS、JAVA、C#等等多有,Python 自1.5版本起增加了re 模块,re 模块使 Python 语言拥有全部的正则表达式功能。

正则匹配的规则

re模块使用步骤

在 Python 中,我们可以使用内置的 re 模块来使用正则表达式。

有一点需要特别注意的是,正则表达式使用 对特殊字符进行转义,所以如果我们要使用原始字符串,只需加一个 r 前缀,示例:rtestt.tpython

re 模块的一般使用步骤如下:

1.使用 compile() 函数将正则表达式的字符串形式编译为一个 Pattern 对象

2.通过 Pattern 对象提供的一系列方法对文本进行匹配查找,获得匹配结果,一个 Match 对象。

3.最后使用 Match 对象提供的属性和方法获得信息,根据需要进行其他的操作

import restr="abcdefabcdef" #待匹配的字符串m=re.compile("a") #编译正则表达式,第一个参数是表达式字符串,第二个参数是标志位,比如re.I 匹配不对大小写敏感,re.S等等result=m.findall(str) print(result) #输出["a","a"]

具体的正则表达式如何编写,其实就是根据上图的元字符进行组合,匹配你要的结果,

小练习1:找出字符串中的数字。 d表示 0-9 + 表示匹配前一个字符1次或无限次

import restr="a11b22c3"m=re.compile("\d+") print(m.findall(str)) #输出[11, 22, 3]

小练习2:找出单词中包含 oo的单词

import restr="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 restr="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 restr="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 restr="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 restr="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 restr="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 = <a href="http://www.baidu.com">baidu</a># 用正则模块提取出网址:"http://www.baidu.com"和链接文本:"baidu"info = <a href="http://www.baidu.com">baidu</a># pattern1=re.compile(rhttp:.+.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:utf8from urllib import requestimport 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(<div\sclass="f18 mb20">(.*?)</div>,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(<p>,"").replace(</p>,).replace(&rdquo;,).replace(&ldquo;,).replace(<br />,).replace(<br />,).replace(&hellip;,) 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()

排行

网站地图

Copyright © 2002-2022 香港德胜云网络 版权所有 | 备案号:蜀ICP备2023007363号-5

声明: 本站内容全部来自互联网,非盈利性网站仅供学习交流