一、数据获取
数据获取基于网络爬虫技术实现,采用requests和xpath实现请求的发送与响应数据的解析。基于网络爬虫的数据获取流程如图1所示。
图1中,首先,构造url,分别构造了历史、小说、言情、教育类书籍的url,以列表的形式存储;其次,构建User-Agent,以headers参数的形式传入;然后,采用requests对目标网页发起get请求,需要注意的是,由于目标网页为分页展示,需要对url中的页数进行遍历;最后,将请求返回的数据通过etree.HTML方法转换为html对象,采用xpath对标签进行解析,获取所需的数据。
本文获取了图书信息的11个特征字段,包括封面链接、详情链接、书名、标签、作者、出版社、出版时间、价格、评分、评论数、简介。并将数据持久化存储到sqlit3数据库,如图2所示。
图2 sqlit3存储
二、数据清洗
本文数据清洗分为两部分,第一部分在解析标签时进行了数据清洗,第二部分为存储后sqlit3数据库后再读取时进行了数据清洗。
(1)标签解析时的数据清洗
在通过xpath解析标签,获取相应数据时,出现了一些杂数据,比如带有空格、‘\\n’以及莫名换行等问题,针对这些问题,采用replace方法进行替换,将以上无用字符串替换为空,解决标签解析时出现无意义字符串的问题。
(2)数据再读取的数据清洗
基于sqlite3.connect方法建立与数据库的连接,通过pandas的read_sql方法读取数据为dataframe对象,从而展开对数据的清洗,包括重复值处理和缺失值处理,如图3所示。
图3中,首先,采用duplicated().sum()统计数据的重复值,得到重复值数量为13,采用drop_duplicates()方法进行去重操作,去重后,再次调用duplicated().sum()查看去重结果;然后展开对数据的缺失值处理,由于在爬虫采集数据时,将缺失值定义为了空字符串,所以pandas集成的缺失值统计方法isnull无法检测到空字符串为缺失值,因此,设计了双重for循环,以blag变量为判断标志的缺失值检测算法,输入为原始数据data,输出为存在缺失值字段的行索引列表drop_list,然后采用drop方法删除缺失值所在的行,结果如上图3所示,原始数据量为1623,缺失值处理后的数据量为1486,验证了该方法的有效性。
同时,价格字段需要保留数值,去掉单位,但是价格字段的形式丰富,无法直接通过pandas操作,因此,设计双重for循环对价格字段进行清洗,流程如图4所示。
三、数据分析
通过调研资料和观察数据,首先尝试了对书籍评分的预测,该问题属于回归问题,由于采集的字段多为长文本数据,多数特征无法用于预测,综合考虑后,选择了价格、评价数量、标签以及评分四个字段进行建模。首先对,标签字段进行了数值化处理,集体采用LabelEncoder方法实现;其次,对训练集和测试集进行划分,然后采用随机森林进行预测,最后进行测试集测试性能,实现结果并不好,基于r2的回归问题评价指标仅有0.13181878212607695,表示特征并无直接关系回归分析难以建模,存在较大的难度。
四、数据可视化
通过随机森林对图书评分进行了预测,为了进一步探究预测的结果,基于matplotlib库对预测结果进行了可视化分析,如图5所示。