python爬虫+R数据可视化 实例
Python 和 r语言这对黄金搭档,在数据获取,分析和可视化展示方面,各具特色,相互配合,当之无愧成为数据分析领域的两把利剑。该项目分为两个模块:
1,数据准备阶段 采用python网络爬虫,实现所需数据的抓取;
2,数据处理和数据可视化,采用r语言作为分析工具并作可视化展示。
第一,数据准备模块 数据来源选用笔者所在学校的内网(校内俗称OB),采用保存cookie模拟登录,以板块为单位,进行论坛帖子的抓取,并且根据发贴人的连接,再深入到发贴人的主页进行发贴人个人公开信息的抓取,最后以每一条帖子作为一条记录保存到文件,按照此逻辑笔者于2016年5月13日-2016年5月26日设置ubuntu下定时任务,按时抓取并保存获得数据。
以下进行详细分析: 首先需要载入的库:
进行模拟登录并保存cookie 需要有登录界面和论坛首页的url和保存cookie和错误日志文件
post_url = 'http://ourob.cn/bbs/member.php?mod=logging&action=login&loginsubmit=yes&infloat=yes&lssubmit=yes&inajax=1'
url = 'http://ourob.cn/bbs/forum.php'
err_str = '' #保存error详情
filename = 'cookie_ob.txt'
模拟登录和生成cookie文件
cookie = cookielib.MozillaCookieJar(filename)
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
#post请求参数
postdata = urllib.urlencode({
'fastloginfield':'username',
'handlekey':'ls',
'username':'my user name',
'password':'my password',
'quickforward':'yes',
'User-Agent':'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0',
'Connection':'keep-alive'
})
login_url = post_url
opener.open(login_url,postdata)
cookie.save(ignore_discard=True,ignore_expires=True)
尝试用cookie模拟登录论坛首页,并下载源码,提取所需字段信息
login_url = post_url
以下即可采用正则表达式,提取 今日发帖数,会员人数,在线人数 代码如下:
#正则获取列表页 user_num,topic_num,online_num
这种广度搜索爬虫都会涉及到需要补全链接的坑,所以本文采用定义补全链接函数,在需要的部分对该函数进行调用。
接下来,就是深入到各个板块下进行爬取,事先定义好了一个盛放各板块url的.py文件block_list,已经在开始部分导入,还需要增加翻页功能,如下:
后续的部分思路相对比较简单,但是涉及到提取字段,代码部分比较复杂,这里值得提一下的是:有的网站登录一段时间由于某些原因是会失效的(ob就是),但是究竟多久失效,这个没办法知道,所以为了避免因为登录失效而导致爬去失败或者数据丢失,干脆直接采用抓取页面前,均使用cookie重新登录,实现如下(提取字段部分不全):
if tag.em.span.has_attr('class') and tag.em.span.get('class')[0] == 'xi1':
最终得到的数据是这个样子的:
第二,数据处理和数据可视化 主要采用r语言读取数据,进行频数统计和图表展示 简单贴几段代码: 读取剪切板数据 并采用table()函数求频数
data3<-read.table("clipboard",header = T)
柱状图
p <- ggplot(data = tb3, aes(x=b_type,y=freq))
ggplot(data=data1,aes(x=time))+geom_line(aes(y=在线人数,colour="在线人数"))+geom_line(aes(y=今日发帖,colour="今日发帖"))
饼图
p<-ggplot(data=tb3,aes(x="",y=freq,fill=factor(b_type)))+geom_bar(stat="identity",width=1)
很显然,发帖数和在线人数呈现正相关关系,二者在23:30左右的时候急速下降,主要是由于校内这个时候断网,断电,大家也都该洗洗睡了~,一直到早上7:20左右,人数开始回升,从这也可以看出童鞋们起床时间还是很早滴(因为要上课…),在线人数全天除了后半夜基本保持在500以上,上图:
r语言版
发帖人数统计,呈现波动性很大,通过查询日历,显而易见,发帖数高的日期13,14,21,22均为周末,看来大家周末放松的方式之一还真是逛~O~B,再看16,17,18可想而知童鞋们都胶着在上课,作业中,无暇顾及玩ob了…
从板块角度来看,人们对不同板块有不同的热爱,但是结果上,分布很不均匀,基本上大家经常水的就那么几个,有些则是很久页无人问津…
从ob会员上来看,分布依然很不均匀,活跃的就是那么几个(我猜大部分比较活跃的都是版主有木有~~)
这里统计了一下,发帖数排名前十的,会员昵称,能找到你自己么??
那么还有一个问题,大家都是在几点比较容易发帖呢??用数据说话,接着看图…
结果就是发帖时间有两个高峰:一个是上午九点到十点,另一个是晚上七点到十点,也比较符合预期。 辛苦抓取了帖子作者的信息,我们来看一看,都是哪一级的学生经常浪迹ob,说实话,当我看到结果的时候,瞬间觉得我已经在沙滩上了。。。
来一张一目了然的~
喜欢发帖和出生月份有木有关系??,来看看…
当然还要精确到天…
最后,还有血型
难道是说A型血,更倾向于逛ob吗,道理在哪里??? 到此,全部结束
- 【学术】你真的知道什么是随机森林吗?本文是关于随机森林的直观解读
- Spring boot 将 Session 放入 Redis
- 【教程】估算一个最佳学习速率,以更好地训练深度神经网络
- SNS 数据库设计
- CentOS7 下 MySQL 5.7 重置root密码
- 通过简单的线性回归理解机器学习的基本原理
- 消息队列在使用中的注意事项
- 【教程】OpenCV—Node.js教程系列:用Tensorflow和Caffe“做游戏”
- 验证码,再见!利用机器学习在15分钟内破解验证码
- Spring boot with Redis
- SOA 面向服务框架设计与实现
- Java·日期时间处理
- MySQL·身份证校验
- PostgreSQL·国家地区表的设计
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【UI自动化-3】UI自动化元素操作专题
- maven的安装与使用
- 【Java多线程-1】线程概述与线程创建和使用
- 【Java多线程-2】Java线程池详解
- 【Java多线程-3】Future与FutureTask
- 【Java多线程-4】CompletionService详解
- 【Java多线程-5】 CompletableFuture详解
- 【Java多线程-6】synchronized同步锁
- 【Java多线程-7】阅尽Java千般锁
- 【SpringBoot注解-2】AOP相关注解详解
- 【SpringBoot注解-3】Bean注入相关注解
- 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
- 【Linux系列-1】top命令详解
- 【Linux系列-2】iostat命令详解
- 【Mybatis-1】MyBatis注解版详解