基于PHP爬虫的微博热搜实时监控平台

  • 背景
  • 一、整体思路
  • 二、数据爬取
    • 1.获取HTML
    • 2.提取数据
    • 3.返回数据
  • 三、数据可视化
    • 1.画柱状图
    • 2.ajax请求数据
  • 四、效果展示
  • 写在最后

背景

在学习、“脱发”之余,便是去微博看看有没有发生什么有趣的事情,或是了解一下正在发生着哪些“大事”,亦或是某些让我久久不能平复的事…
Whatever~ 因为重点并不是这个
重点是,当我去搜微博热搜的时候,是这样的:

界面需要一直手动刷新,而且我简单搜了一下,似乎是没有相关的实时统计图的,于是我尝试着自己写一个。
(ps.要是有哪位大佬知道有现成的欢迎留言哦,定将感激涕零~)

一、整体思路

一个简单的想法在我婶婶的脑海里浮现了出来:首先搜集数据,然后通过一个web页面来进行统计展示。
对于搜集数据当然是写个爬虫就好了,首先脑里闪过的是用python,但是人总是喜欢尝试下新东西,于是我选择试试用PHP来写爬虫。所以,大体框架便出来了:

具体相关的技术大家可参考:

  • PHP爬虫编写 、PHP爬虫的三种方式
  • echarts使用指南
  • HTML5

二、数据爬取

1.获取HTML

PHP爬取微博热搜页面,得到HTML源码:

function getUrlContent($url){//通过url获取html内容$ch = curl_init();curl_setopt($ch,CURLOPT_URL,$url);curl_setopt($ch,CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1 )");curl_setopt($ch,CURLOPT_HEADER,1);curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);$output = curl_exec($ch);curl_close($ch);return $output;}

当然,也可以直接用file_get_contents等方法。

2.提取数据

通过正则等方式,将HTML中的table标签提取出来,并转换为Array类型:

function getTable($html) {preg_match_all("/<table>[\s\S]*?<\/table>/i",$html,$table);$table = $table[0][0];$table = preg_replace("'<table[^>]*?>'si","",$table);$table = preg_replace("'<tr[^>]*?>'si","",$table);$table = preg_replace("'<td[^>]*?>'si","",$table);$table = str_replace("</tr>","{tr}",$table);$table = str_replace("</td>","{td}",$table);//去掉 HTML 标记$table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table);//去掉空白字符$table = preg_replace("'([rn])[s]+'","",$table);$table = str_replace(" ","",$table);$table = str_replace(" ","",$table);$table = explode('{tr}', $table);array_pop($table);foreach ($table as $key=>$tr) {// 自己可添加对应的替换$tr = str_replace("\n\n","",$tr);$td = explode('{td}', $tr);array_pop($td);$td_array[] = $td;}return $td_array;
}

3.返回数据

爬取整理数据并返回以便前端调用:

$html = getUrlContent("https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6");
$table = getTable($html);
$table = array_slice($table,2); # 把前面多余部分截掉
echo json_encode($table);

至此,可将以上代码整合为一个php文件,设名为“weibo.php”,以待前端通过ajax的方式调用。

三、数据可视化

实不相瞒:前端咱不行,但四处搬砖、东拼西凑还是比较拿手的~ 现学了echarts.js,再看看网上前辈大佬们的演示,最终还是“凑”了出来。

1.画柱状图

利用echarts.js在画布上画出统计的柱状图:

function CreateBar(keywords,value){//初始化echarts实例var myChart = echarts.init(document.getElementById('chartmain'));myChart.on('click',function(param){window.open('#');});//指定图标的配置和数据var option = {title:{text:''},tooltip:{},grid:{top:"15%",left:"16%",bottom:"5%"},legend:{data:['热搜词']},xAxis:{},yAxis:{data:keywords},series:[{name:'搜索量',type:'bar',itemStyle: {normal: {color: '#ff9406'}},data:value}]};myChart.setOption(option);
}

这里需要两个参数(两个Array),即热搜词和搜索量,而它们得通过ajax的方式向后端发送请求获取。

2.ajax请求数据

通过ajax的方式向后端发起请求(即之前提到的weibo.php),以获得数据:

function GetData(){$.ajax({type: "post",        //数据提交方式(post/get)url: "weibo.php",    //提交到的urldataType: "json",    //返回的数据类型格式success: function(msg){//返回成功的回调函数if(msg!=''){var data = eval(msg); //将返回的json数据进行解析,并赋给datavar keywords = [];var value = [];for(var i=0; i < 20; i++){ // 取TOP20keywords.push(data[i][1].split('\n')[0]);value.push(Number(data[i][1].split('\n')[1]));}CreateBar(keywords.reverse(),value.reverse());setInterval("GetData()",10000); // 间隔10S}},error:function(msg){//返回失败的回调函数console.log(msg);setInterval("GetData()",30000); // 间隔30S}});
}

注:这里用了**setInterval()**的方法来实现定时发送异步请求,以实现实时监控。

四、效果展示

经过不懈的尝试和修改,最后达到了一个还算比较满意的效果,大概就是这个样子啦:

写在最后

实现这个目标,还有一种思路:先用脚本(如python)获取数据并存入数据库,然后再通过读取数据库来进行数据展示,这样也许更加灵活而且在搜集到一定量的数据后还能尝试更多有趣的统计分析。

文中如有不足,还望大家批评指正!
最后,感谢各位大大的耐心阅读~

基于PHP爬虫的微博热搜实时监控平台相关推荐

  1. 【Python】爬虫获取微博热搜数据,response中文显示“\u7814\u7a76\u8bc1\u5b9e\u”

    问题描述 在爬虫获取微博热搜数据的时候,response中文出现了不便于理解的字段,截取如下: ......[{"title_sub":"\u7814\u7a76\u8b ...

  2. python爬虫微博24小时热搜_Python爬虫之微博热搜

    最近自学了Python爬虫,手痒痒,想爬点东西,所以就有了这篇文章.由于目前本人技术有限,如有纰漏,欢迎批评指正:如有良策,也欢迎赐教. 思路 1.首先,当然是打开微博热搜,F12观察下网页结构.令人 ...

  3. Python爬虫分析微博热搜关键词(代码已过时,仅供参考)

    1,使用到的第三方库 requests BeautifulSoup 美味汤 worldcloud 词云 jieba 中文分词 matplotlib 绘图 2,代码实现部分 import request ...

  4. 【闲来无事】微博热搜实时数据图表

    @Hadi 初来乍到 多多点赞 文章目录 @Hadi 前言 一.目标需求分析 1. 对目标网页的分析 2. 整体需求分析 二.效果展示 1. 网址 2.刷不出来的看图吧 三.来人把代码端上来 2.前端 ...

  5. android开发微博搜索,一款帮助用户自动提取微博热搜、知乎热榜、百度实时热点条目中与特定领域...

    HotDetector(全网热门探测仪) 全网热门探测仪一款帮助用户自动提取微博热搜.知乎热榜.百度实时热点条目中与特定领域(科技.娱乐.体育.自定义)有关内容的实用App. 它使用Java SE 8 ...

  6. 基于python的微博热搜爬取及数据分析

    刚学python爬虫,用爬虫爬取新浪微博热搜,看看效果如何,也是对这段时间学习python的总结. 一.目的: 抓取新浪微博2020年1月3日星期五的热搜榜,将抓取到的数据进行动态展示,并生成当天的微 ...

  7. 爬虫—爬取微博热搜榜

    1. 引言 利用scrapy框架爬取微博热搜榜网站前50条热搜. 爬取信息:热搜排名.热搜新闻名.热搜新闻热搜量. 数据存储:存储为.csv文件. 2.爬取流程 新建scrapy爬虫项目: 在终端输入 ...

  8. 微博热搜榜爬虫2.0

    微博热搜榜爬虫2.0 6月份出了一个微博热搜爬虫,在我电脑上设置了自动化12点爬取,结果到了9月份,执行不了. 一直没时间弄,今天来更新一下: 解决了两个问题, 1 >之前的话请求头比较单一,只 ...

  9. python 爬虫热搜_Python网络爬虫之爬取微博热搜

    微博热搜的爬取较为简单,我只是用了lxml和requests两个库 1.分析网页的源代码:右键--查看网页源代码. 从网页代码中可以获取到信息 (1)热搜的名字都在 的子节点里 (2)热搜的排名都在 ...

最新文章

  1. bupt summer training for 16 #2 ——计算几何
  2. centos php5.3 yum 安装 php53-mcrypt
  3. 常识:佛前三炷香是什么意思
  4. zcmu- 聪明的美食家 最长不连续上升子序列(nlogn)
  5. 前端利用JS导出数据到Excel表 数字是文本类型 无法计算
  6. Effective C++学习第二天
  7. IDEA解决Maven项目编译后classes文件中没有.xml或.properties问题
  8. VB版双语对照制作助手
  9. 创建react项目并启动出现的报错及解决
  10. 第三章:学生管理模块
  11. oracle语法_PG数据库sql语法总结,与Oracle有什么不同?
  12. matlab引擎 多线程,使用Matlab进行多线程处理
  13. HDU 2063:过山车(匈牙利算法模板题)
  14. nginx系列11:负载均衡哈希算法ip_hash与hash模块
  15. 吾不是爱管闲事,实在是忍无可忍
  16. 天翼网关 ddns设置_19,微服务网关之Zuul
  17. 深度学习中的优化算法如何理解--SGD
  18. GSM网络结构及主要接口标注(附中英翻译)
  19. 阿尔伯塔计算机硕士录取,阿尔伯塔大学计算机工程专业硕士.pdf
  20. 校验、加密、压缩、哈希值的区别,我老是弄混,现在总结一下

热门文章

  1. MySQL表连接查询
  2. $(this) 自己、兄弟姐妹、长辈、长辈的兄弟姐妹增加/删除class
  3. 计算机操作评分系统,使用Excel设计竞赛评分系统
  4. python 入门到实践期末考试常出现的考试内容_零基础Python入门及实践应用_章节测验,期末考试,慕课答案查询公众号...
  5. osmosis抽取PBF矢量数据,导出xml格式数据
  6. 却话文心一言(Chatgpt们),存算一体真能突破AI算力“存储墙”|“能耗墙”|“编译墙”?
  7. 老农移石故事的启示分享
  8. 2022.12.9 英语背诵
  9. java ftp输出流_java输出流实现文件下载
  10. Access端口和Trunk端口