我们知道网络爬虫是一种从互联网上进行开放数据采集的重要手段。但是咱们所收集的数据并不全都是直接能够使用的。它们由于各种原因,原始数据往往会存在许多问题,例如数据格式不正确,数据存在冗余等等。这些我们暂时可以理解为脏数据。
那么直接使用我们获取到的第一手原始数据呢?这个时候我们就需要进行数据清洗。
考虑到学弟学妹们基础较为薄弱,因此学长在此选择一个较为简单的爬虫demo。方便学弟学妹们进行理解。此demo的数据采集部分实现从某图书网站自动下载感兴趣的图书信息的功能。主要实现的功能包括单页面图书信息下载,图书信息抽取,多页面图书信息下载等。本demo学长认为挺适合大数据初学者了解数据采集以及数据清洗的哈哈。
下面这一点是学长个人建议哈~学长认为如果进行数据清洗的话,使用Anaconda集成的Jupyter进行操作是很的。
在进行演示之前我们需要知道什么是数据清洗!
数据清洗:为了便于后续的处理和分析,对数据进行的质量诊断、数据整合、数据转换、缺失值处理和异常值处理等操作。
1、缺失值处理:对存在缺失的数据进行插补2、异常值处理:对数据集中存在的不合理值进行处理3、数据转换:将数据从一种表现形式转换成另一种表现形式
1、Mapreduce(Hadoop):基于集群的高性能并行计算框架;并行计算与运行软件框架;并行程序设计模型与方法。2、Pandas(Python):解决数据分析任务的Python库,提供了诸多数据清洗的函数和方法。3、OpenRefine:数据清洗工具,能够对数据进行可视化操作,类似Excel,但其工作方式更像数据库。
本demo学长使用Pandas进行数据清洗。
安装Anaconda的话,学长建议去官网进行下载安装。
点击之后选择自己的操作系统以及版本对应的下载链接
点击后即可自动下载。下载完成后即可安装。
在此,博主推荐两个下载网址:
两个镜像源地址都可以进行下载,不过第一个为官网版本更新比较完整。学长建议各位下载可以选择官网版本,并且如果下载没必要直接下载最新版本。当然了至于怎样下载主要还是看个人。
我们打开Anaconda之后的界面如下:
那么如何使用JupyterNotebook呢?下面看我操作:
到这里我们就知道如何新建文件了。下面就开始进入正题了!
爬取内容描述:从当当网搜索页面,按照关键词搜索,使用Python编写爬虫,自动爬取搜索结果中图书的书名、出版社、价格、作者和图书简介等信息。
我们先随机输入一个关键词进行搜索,在此我们把机器学习作为关键词。
我们可以看到有乱码,看到这个乱码我们就要知道这是我们输入关键词的URLEncode下面我们尝试把后面的多余部分删除
下图中的GIF为演示解码与编码的过程:
下面我们对比下是不是如此:
经过对比我们发现链接是一样的,那么我们接下来尝试直接输入汉字搜索尝试下
我们发现是可行的,那么我们就可以确定URL链接为:
分析的话我们肯定要先从源码进行分析:
点开第一个
标签,且class分别为"name"、“detail”、"price"等,这些标签下分别存储了商品的书名、详情、价格等信息。
我们以书名信息的提取为例进行具体说明。点击
标签,我们发现书名信息保存在一个name属性取值为"itemlist-title"的标签的title属性中,如下图所示:
我们先来看下xpath解析的内容
下面为代码实现:
信息项
xpath路径
书名
//li/p/a[@name=“itemlist-title”]/@title
出版信息
//li/p[@class=“search_book_author”]
当前价格
//li/p[@class=“price”]/span[@class=“search_now_price”]/text()
星级
//li/p[@class=“search_star_line”]/span[@class=“search_star_black”]/span/@style
//li/p[@class=“search_star_line”]/a[@class=“search_comment_num”]/text()
由于此部分学长早已经测试过了,因此在此就不再测试了。
下面我们可以编写一个函数content,输入一个页面内容,自动提取出页面包含的所有图书信息。
如果先实现多页的话,我们需要观察下搜索页面的翻页。
假设我们一共希望下载15页内容,则可以通过以下代码实现。
首先,我们借助Pandas包提供的read_csv方法读取原始数据,将其转换成Pandas中的DataFrame格式。注意由于数据中包含中文,需要正确设置字符编码。
正则表达式的话,其实学长之前已经介绍过了,不过现在再次用到。那么学长就再简单的介绍下吧!
正则表达式是一种按照特定规则搜索文本的方法。在正则表达式中\d表示数字,+表示匹配前一个字符1次或无限次,常见的正则表达式符号含义见下表所示。
上图是不是比较多,所以学长在百科上找到了另一个合集:
在Python中,re包实现了正则表达式的匹配,常用的search函数能够完成匹配。下面我们编写get_numers函数用来提取一个字符串中的数值。
原始数据
数值
width:0%;
0
width:10%;
10
0.5
width:20%;
20
1
width:30%;
30
1.5
width:40%;
40
2
width:50%;
50
2.5
width:60%;
60
3
width:70%;
70
3.5
width:80%;
80
4
width:90%;
90
4.5
width:100%;
100
5
这个时候,我们就可以写出如下代码:
从原始数据中可以看出以/分隔的第一个数据是作者,因此我们可以直接提取。使用字符串的split方法可以对字符串按照特定字符分割,并且分割后是列表形式,例如:
采样正则表达式匹配出版社信息,正则表达式为(\S{1,10}出版社)。下面我们实现get_publisher函数,从出版信息列找那个提取出版社信息。
出版日期的格式为YYYY-MM-DD,对应的正则表达式为(\d{4}-\d{2}-\d{2})。
书名信息中混合这书的简介信息,观察原始数据中书名一列,能找到一些规律。除去最开始可能包含的一些包含在【】和[]中间的标注信息,剩余的内容中书名和其他内容基本是由空格隔开的。所以我们首先将【】和[]去掉,然后按照空格分隔字符串,第一个内容便是书名。实现方法如下:
美好的日子总是短暂的,虽然还想继续与大家畅谈,但是本篇博文到此已经结束了,如果还嫌不够过瘾,不用担心,我们下篇见!