python爬虫和数据分析的书籍_豆瓣书籍数据爬取与分析
前言
17年底,买了清华大学出版社出版的《Hadoop权威指南》(第四版)学习,没想到这本书质量之差,超越我的想象,然后上网一看,也是骂声一片。从那个时候其就对出版社综合实力很感兴趣,想通过具体数据分析各个出版社的出版质量,另外借此也可以熟悉大数据生态和相关操作。
豆瓣上的书籍数据刚好可以满足需求,所以有了思路:
1. 用python编写爬虫,爬取豆瓣上的书籍信息,并持久化到mysql数据库;
2. 使用sqoop将mysql里的数据导入hive;
3. 通过hive进行离线分析。
一、爬虫部分
1. 爬虫思路及架构
通过观察豆瓣网书籍的具体页面,我们可以发现,具体书籍网址的组成形式为:
其中bookid为具体的数字。第一种思路是设定一个比较大的数字,然后从1到这个数字的范围之内去遍历所有数字对应的网址,但是我们可以发现,这些书的id往往非常大,基本都是百万级别的数字,一个个去撞库非常不现实。
其实每本书都有很多标签,每个标签都汇集了同一类的所有书,要是可以获取到所有标签,然后根据这些标签一个个去遍历就可以获得豆瓣上所有的书了,当然不同标签之间肯定有重复的书,所以还要考虑去重的问题。
所以,这个爬虫的思路主要是:
2) 通过上一步获取的标签,组成标签页的网址,进入标签页获得本页的所有书籍链接,通过书籍链接获取需要信息;
3) 对书籍信息进行标准化,持久化处理;
4) 爬完本标签,切到下一个标签,继续爬,重复2,3步;
5) 应对网站反爬虫机制;
6) 错误日志和程序崩溃处理。
编程语言选择python,持久化工具选择mysql数据库。
2. 数据库设计
1) 标签信息
表名为tag_info,用来保存从豆瓣爬下来的标签名字,另外,增加多两个字段用来表示进度,一个是当前页数,另一个是完成状态。
2) 书籍信息:
表名为book_info,保存了每本书的基本信息,包括书名、作者、出版社、评分、评分人数等。为了去重,唯一id采用了豆瓣网中书籍的id。
3. 爬虫框架及流程分析
在这个爬虫中使用的模块有 requests,BeautifulSoup,re,logging和MySQLdb,主要流程如下图所示。
1) 用requests模块向豆瓣网发起GET请求,获得网页返回的信息;
2) 把上一步返回的信息用BeautifulSoup模块进行分析,如果还需要进一步匹配过滤,传给re模块进一步加工,否则直接传给MySQLdb模块;
3) re模块对BeautifulSoup传过来的信息进行匹配处理,最后传给MySQLdb;
4) 用MySQLdb连接mysql数据库,将获得的书籍信息持久化到mysql中;
5) 用logging模块负责系统日志的输出和维护。
4. 应对豆瓣的反爬虫
实际上这次爬取数据,比计划多花了一倍时间,大部分时间在于应对豆瓣的反爬虫机制。
刚开始requests去请求数据的时候,准备了若干个header,然后每次请求都换一个。没过多久就开始返回403了,于是减低了爬取的频率,还是继续403。
查了半天资料,首次请求保存cookie,以后每次都修改cookiebid去请求,过一段时间还是被豆瓣检测出来了,有的页面直接返回空的或者定向到别的页面。
最后想到了代理,写了一个动态获取免费代理并验证的函数,不过免费的ip代理不仅慢而且不稳定,又不想买收费的代理服务。
后面查到了ADSL拨号服务器代理的相关文章,发现自己正是用ADSL上网,于是折腾了一番,写了一个断开路由器连接的函数,每当爬虫被豆瓣封杀的时候,就断开路由器连接重新获取ip,由此解决了爬虫正常运行的问题。当然,我这次爬取的数据量比较少,所以用这种方式还是能解决问题,如果是需要在短时间获取大量数据的,还是需要用代理的方式。
花了几天时间,最后终于完成了所有标签的爬取工作,爬到的数据去重后有6万条左右。因为各个标签之间肯定有重叠的部分,所以符合原来的预期。
二、使用sqoop将数据从mysql导入hive
1. 导入hive:
sqoop import --connect jdbc:mysql://localhost:3306/test --username root -P --split-by id --table book_info --target-dir /tmp/douban/book_info --hive-import --create-hive-table --hive-table douban.book_info --direct
2. 查看hive管理表结构
desc formatted book_info;
col_name data_type comment#col_name data_type comment
id int
book_name string
author string
publisher string
translator string
publish_date string
page_num int
isbn string
score double
rating_num int
…(后面省略)
三、通过hive cli分析数据
1. 计算所有书籍的平均分
HiveQL语句:
SELECT AVG(score) AS avg_score FROM book_info WHERE score > 0 AND rating_num > 100;
为了准确,过滤掉没有评分和评分人数不足的,结果:
OK
avg_score8.057803307115979
平均分在8分左右,估计一般用户都是看完一本觉得不错的书才上豆瓣进行评分。
2. 计算清华大学出版社书籍的平均分
HiveQL语句:
SELECT AVG(score) AS avg_score FROM book_info WHERE publisher ='清华大学出版社' AND score > 0 AND rating_num > 100;
结果:
OK
avg_score8.167039106145252
结果显示清华大学出版社出版的平均分比总体的稍高,但是也没有很突出。
3. 计算平均分排名前十的出版社
HiveQL语句:
SELECT publisher, AVG(score) as avg_score, COUNT(id) AS book_num
FROM book_info
WHERE score> 0 AND rating_num > 100GROUP BY publisher
HAVING COUNT(id)> 10ORDER BY avg_score
DESC
LIMIT10;
结果:
publisher avg_score book_num
茜新社9.157894736842104 19山西古籍出版社9.027272727272727 11太田出版8.933333333333334 15浙江人民美术出版社8.930769230769231 13東立出版社有限公司8.910526315789474 19少年儿童出版社8.898484848484848 66上海辞书出版社8.887500000000001 16上海科学技术出版社8.86875 16白泉社8.857692307692309 26岳麓书社8.845833333333331 24
可以看出排名前十的出版社平均分都在8.8以上,最高的平均分达9.16分。
4. 计算清华大学出版社的排名
HiveQL语句:
FROM (
SELECT publisher, count(id) as book_num, AVG(score) as avg_score, row_number() over(ORDER BY avg_score DESC) as rank_num
FROM book_info
WHERE score> 0 AND rating_num > 100GROUP BY publisher
HAVING count(id)> 10LIMIT200) t1
SELECT t1.*WHERE t1.publisher= '清华大学出版社';
结果:
t1.publisher t1.book_num t1.avg_score t1.rank_num
清华大学出版社179 8.167039106145252 146
数据显示清华大学出版社的排名100名之内都排不进,而且如果把每个出版社出版书籍数量放宽一点来处理的话,结果会更难看一点。
四、小结
实际上只要找到合适的数据源,就能够通过这些数据挖掘出自己需要的东西。从数据采集到最后产出分析结果,整个过程相对来说还比较粗糙,sqoop和hive部分由于数据量不大,只是作为学习目的来检索,暂时未涉及到分区和分桶的操作,因为数据量小,查询也没作并行优化,等后面有时间再进行深入。
(完)
python爬虫和数据分析的书籍_豆瓣书籍数据爬取与分析相关推荐
- Python爬虫系列之多多买菜小程序数据爬取
Python爬虫系列之多多买菜小程序数据爬取 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发> 点击这里联系我们 < 微信请扫描下方二维码 代码仅供学习交流, ...
- Python爬虫系列之MeiTuan网页美食版块商家数据爬取
Python爬虫系列之MeiTuan网页美食版块商家数据爬取 小程序爬虫接单.app爬虫接单.网页爬虫接单.接口定制.网站开发.小程序开发> 点击这里联系我们 < 微信请扫描下方二维码 代 ...
- qt爬取网页信息_豆瓣TOP250数据爬取
一.问题描述 用python爬取网页数据是现在流行的一种快速获取数据的方法,简单快捷.最近小编通过教程学习完成了豆瓣TOP250数据的爬取.下面就简单介绍一下如何用python程序实现豆瓣网页信息的爬 ...
- 【Python爬虫】5行代码破解验证码+网页数据爬取全步骤详细记录
文章目录 前言 一.抓包分析 二.编写模块代码 1.引入库 2.获取验证码图片 3.识别验证码 4.爬取列表页 5.爬取详情页 6.完整代码 总结 1.TIPS 2.如需交流,可在代码头找到我,或者用 ...
- Python爬虫入门教程 15-100 石家庄政民互动数据爬取
写在前面 今天,咱抓取一个网站,这个网站呢,涉及的内容就是 网友留言和回复,特别简单,但是网站是gov的.网址为 http://www.sjz.gov.cn/col/1490066682000/ind ...
- 【python爬虫专项(19)】blibli弹幕数据爬取(以全站搜索蔡徐坤的视频为例)
blibli任意搜索关键字,相关视频的弹幕数据采集 参考网址:B站蔡徐坤 爬虫逻辑:[分页url采集]-[视频页面url采集]-[视频页面数据采集 / cid信息 / 弹幕xml数据采集] 弹幕xml ...
- Python爬虫新手入门教学(十八):爬取yy全站小视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
- Python爬虫新手入门教学(二十):爬取A站m3u8视频格式视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. 前文内容 Python爬虫新手入门教学(一):爬取豆瓣电影排行信息 Python爬虫新手入门 ...
- Python 大数据分析疫情:如何实现实时数据爬取及 Matplotlib 可视化?
作者 | 杨秀璋 来源 | CSDN博客专家Eastmount 责编 | 夕颜 思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图 ...
- Python爬虫新手入门教学(十六):爬取好看视频小视频
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...
最新文章
- python栈溢出_Python栈溢出【新手必学】
- python文件读取输出-Python 读写文件中数据
- 【EventBus】事件通信框架 ( 订阅方法注册 | 注册 事件类型 - 订阅类 + 订阅方法 到指定集合 | 取消注册 数据准备 )
- 【转】内存耗用:VSS/RSS/PSS/USS
- Bochs调试加载符号文件的问题
- Android数据存储五种方式总结
- VS 2017 安装测试
- python秒转换成小时分钟秒_新闻联播66分钟,康辉口播22分38秒,零失误
- Flask笔记-使用Cookie及简单加密判断是否为登录用户
- 我发现了25个影响力达20多年的 Windows 0day,微软刚修完11个
- Android中的文字占位符
- mac版锐捷显示无法连接到服务器,MAC升级10.9后校园网(锐捷)客户端无法连接怎么办?...
- linux localhost发邮件失败,测试邮件系统:telnet localhost 25时的问题~
- transmac装黑苹果_黑苹果安装教程
- 阿里云 搭建flink 后 web界面可以访问 但是没有task manager节点存活
- 啊~北京~~啊~首都~
- linux连接交换机命令,Linux连接路由器交换机防火墙Console接口的5个实用命令
- win10创建新的计算机用户名和密码,win10如何新建一个账号用户
- 浙江大学的计算机考研难度,浙江大学部分专业考研难度分析
- 日本SUPER DELIVERY电商使用虚拟信用卡海淘购物攻略