查看原文
其他

粉丝让我爬取热搜话题,结果做成了实时热搜『跑马灯』可视化

李运辰 Python研究者 2022-07-01

大家好,我是阿辰。


PS:(这里跟读者说一下,以后本公众号推文更新时间段13:00~14:00,默认是13:00


之前有粉丝让我爬取网上热搜话题,根据粉丝的这个提议,我想到了爬取不同平台的热搜话题并做成了一个:全网实时热搜话题『跑马灯』可视化


特点:实时可视化浏览


这里的热搜数据来源主要是:微博知乎,选择这两个平台的目的:1.用户流量大、2.直接的热搜数据Api接口。


先看一下效果:


动图版:



1

获取数据

1.采集微博数据

微博的热搜数据Api接口如下:

https://s.weibo.com/top/summary/



网页分析


先看一下网页源码




数据列表在id为pl_top_realtimehot中,接着往下找tbody,tr是热点数据的列表,每一个tr中都有a标签,a标签中有热点标题对应热点链接


url = "https://s.weibo.com/top/summary/"headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:85.0) Gecko/20100101 Firefox/85.0", "Host": "s.weibo.com"}r = requests.get(url, headers=headers)soup = bs(r.text, "lxml")div = soup.find("div", {"id": "pl_top_realtimehot"}).find("tbody")tr_tags = div.find_all("tr")


通过请求并对其进行提取网页源代码中的热搜数据(这里使用了BeautifulSoup库去解析网页源代码)


完整代码

###爬取微博热搜def get_weibo(): url = "https://s.weibo.com/top/summary/" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; rv:85.0) Gecko/20100101 Firefox/85.0", "Host": "s.weibo.com" } r = requests.get(url, headers=headers) soup = bs(r.text, "lxml") div = soup.find("div", {"id": "pl_top_realtimehot"}).find("tbody") tr_tags = div.find_all("tr") # 为数据保存做准备 hot_text = [] hot_link = [] for tr in tr_tags: a = tr.find("a") hot_text.append(a.text) # 获取链接 hot_link.append("https://s.weibo.com" + a.get("href")) return hot_text, hot_link


将爬取微博热搜数据代码封装成函数get_weibo,方便可视化代码进行调用,其中的hot_text是热点标题,hot_link是热点的链接



2.采集知乎数据

知乎热搜api接口如下:

https://api.zhihu.com/topstory/hot-list?limit=10&reverse_order=0



提取数据


这里直接返回的就是json数据,因此不需要进行网页分析,只需要知道json数据中,热搜标题和对应的热搜标题链接的key即可



数据在data里面,每一条数据的热搜标题和链接都在target下,热搜标题是title,热搜标题链接是url


###爬取知乎热搜数据def get_zhihu(): headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0'} url = "https://api.zhihu.com/topstory/hot-list?limit=10&reverse_order=0" text = requests.get(url, headers=headers).json() # 为数据保存做准备 hot_text = [] hot_link = [] for i in text['data']: hot_text.append(i['target']['title']) hot_link.append(i['target']['url'])
return hot_text,hot_link


同样的,将爬取知乎热搜数据代码封装成函数get_zhihu,方便可视化代码进行调用,其中的hot_text是热点标题,hot_link是热点的链接





2

Flask后端


为了将采集和可视化网页结合,这里选择使用Flask框架去搭建网站。


跳转网页

#进入页面@app.route('/')def index(): return render_template('view.html')


制作API接口,方便获取数据并返回Json数据

###获取微博和知乎热搜数据@app.route('/getdata')def alldata(): wb_t, wb_u = get_weibo() zh_t, zh_u = get_zhihu() t = [] u = [] for i in range(0,len(wb_t)): t.append(wb_t[i]) u.append(wb_u[i]) for i in range(0,len(zh_t)): t.append(zh_t[i])        u.append(zh_u[i]) res = {} res['title'] = t    res['url'] = u return Response(json.dumps(res), mimetype='application/json')


为了方便大家直接运行,不需要改ip,这里就使用默认的本机ip(小伙伴拿到源码后直接运行就行),端口是80

if __name__ == "__main__": """初始化,debug=True""" app.run(host='127.0.0.1', port=80,debug=True)




3

跑马灯可视化展示




这里是使用html网页制作的跑马灯滚动效果,核心代码如下:


<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script src="../static/js/jquery-2.1.4.min.js"></script> <title>全网实时热搜话题-李运辰(公众号:Python研究者)</title> <style> a{ text-decoration: none; } .f1{ color:"red"; }</style></head><body><div id="textdata"> </div><!--获取微博和知乎热搜数据--> <script type="text/javascript"> function getdata(){ $.ajax({ type: 'GET', url: "http://127.0.0.1/getdata", dataType: 'json', success: function(data){}           } }); } setInterval("getdata()","15000");//1000表示1秒


这里设置了15秒采集一次数据(实现了实时效果



4

启动


直接运行main.py文件



然后在浏览器访问

http://127.0.0.1

接着等待几秒就出现跑马灯可视化效果



gif动图版:




5

小结


本文也是应粉丝要求,爬取热搜话题,最后我制作出来了实时热搜『跑马灯』可视化效果。


特点:实时可视化浏览


最后说一声:原创不易,求给个赞、在看、评论


如果大家对本文代码源码感兴趣,公众号后台回复:热搜跑马灯获取完整代码!

推荐阅读

有读者让我爬逼乎,是我大意了...

爬虫+可视化|爬取「奔跑吧」全系列嘉宾名单,并进行可视化分析



您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存