python热搜排行功能_摸鱼神器——使用Python自制微博热搜榜

呀呀呀呀呀~今天的小分享貌似只通过新浪微博涉猎热点...于是我就在想,如果大家上班摸鱼[先声明,我从不摸鱼!],又不方便打开新浪那么大的logo界面八卦,就可以通过命令行一键实时观察我们的热搜榜。嘻嘻嘻,我可真skr小机灵鬼呢!效果如下:

思考

这个功能在脑壳里萌芽~就得思考如何实现,其实大概思路非常简单

获取实时热搜榜数据将实时数据在图形界面中显示出来

但是,具体的实现逻辑以及细节处理在编程中仍然是值得思考的东西~于是,我们就开始叭!

爬爬爬

要紧之事,就是来爬数据。跟着我左手右手一起打开微博,查看完整的微博热搜榜,链接如下:https://s.weibo.com/top/summary

需求如下:获取 热搜序号,热搜关键字,热搜点击量

解析页面

明确需求之后不要捉急,我们需要解析页面

通过F12打开开发者工具select选中热搜榜

解析结果:整个热搜榜数据就是一个table结构,每一条热搜都是table下的一条的tr

但是目前,我们只看到了大体的框架,还需进一步确认数据是否在 tr 中,以 李佳奇的牙 这条为例。没毛病,就在这。

但是仍然不要膨胀奥,记得确认数据是否在该url的network或者preview中。

奥拉~大家发现这个数据也没涉及到啥反爬~所以今天为了让大家有额外的收获,我们使用类来实现该过程[也是为了后面~的骚操作]。

撸阿撸代码

import requests # 使用 requests 进行请求数据from lxml import etree # 使用 lxml 进行解析数据# 定义 WbHot 类class WbHot(object):# 定义构造方法,初始化 url 以及 headers def __init__(self): self.url = "https://s.weibo.com/top/summary?cate=realtimehot" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"} # 定义 获取html文本数据 方法 def get_hot_html(self): # 发送请求 hot_response = requests.get(url=self.url, headers=self.headers) # 接收文本数据 hot_html = hot_response.text # 将数据返回 return hot_html # 解析 html 页面 def parse_html(self): # 获取 html文本 数据 hot_html = self.get_hot_html() # 将 html文本 转为可解析的html对象 hot_html = etree.HTML(hot_html) # 通过xpath定位到 tr对象列表(里面每个元素都为一个热搜对象) pos_tr = hot_html.xpath('//div[@id="pl_top_realtimehot"]/table/tbody/tr') # 定义关键词列表 hot_title_li = [] # 定义点击量列表 hot_click_li = [] # 定义序号列表 hot_order_li = [] # 遍历tr对象列表,注意:去除第一个tr对象,因为其是箭头往上走的。 for per_tr in pos_tr[1::]: # 获取每条热搜关键字 且为[] hot_title = per_tr.xpath('./td[@class="td-02"]/a/text()') # 但是不想 hot_title_li 变为 [[],[]]..所以使用extend进行扩展 hot_title_li.extend(hot_title) # 获取每条热搜点击量 hot_click = per_tr.xpath('./td[@class="td-02"]/span/text()') hot_click_li.extend(hot_click) # 获取每条热搜序号 hot_order = per_tr.xpath('./td[@class="td-01 ranktop"]/text()') hot_order_li.extend(hot_order) # 将3个列表返回 return hot_title_li,hot_click_li,hot_order_liwb_hot = WbHot()wb_hot.parse_html()

OK,代码在此处打住,我们来看下三个列表是啥玩意儿

我们发现,三个列表中一一对应的数据实际上就是每条热搜的数据。比如:["李佳奇...","5008...","1"]

如果只要这样子表示,我们通过zip()就可以实现。但是,事实并没有我们想象的那么简单,如果需要在图形界面中显示出来,我们需要将每条热搜的数据以字符串表示出来,比如:"李佳奇...5008...1"

代码实现如下:

def cope_data(self): # 接收三个列表的数据 title_li,click_li,order_li = self.parse_html() # 将其打包每一条数据 all_data = list(zip(title_li,click_li,order_li)) # 将列表中的数据拼接为字符串 c_data = [" ".join(list(data)) for data in all_data] # 将字符串列表返回 return c_datawb_hot = WbHot()wb_hot.cope_data()

爬虫部分就完成啦~但是注意,在这里不要使用主程序入口,否则在打造页面时没法访问到爬虫数据。

打造界面

现在我们新建一个 xlwb_test.py 文件来实现图形界面的绘制。在 python 中,有 PyQt5 或者 Tkinter 等库实现图形界面,也就是在桌面弹出一个窗口,跟你打开的app类似~

在今天,我们使用PyQt5 来实现,代码如下:

import sysfrom PyQt5.QtGui import QIconfrom PyQt5.QtWidgets import (QWidget, QToolTip,QPushButton, QApplication)from PyQt5.QtGui import QFontfrom weibo import WbHotclass Example(QWidget): def __init__(self): super().__init__() self.initUI() # 界面绘制交给InitUi方法 def initUI(self): # 调用wb,接收处理好的字符串列表 wb_hot = WbHot() h_data = wb_hot.cope_data() # 这种静态的方法设置一个用于显示工具提示的字体。我们使用10px滑体字体。 QToolTip.setFont(QFont('SansSerif', 10)) # 初始化count,来控制移动窗口的位置 count = 0 # 循环遍历前30条热搜 for data in h_data[:30]: # 创建一个PushButton并为他设置一个tooltip btn = QPushButton(f'{data}', self) # btn.sizeHint()显示默认尺寸 btn.resize(btn.sizeHint()) # 移动窗口的位置 btn.move(0, 20+count) count+=20 # 设置窗口的位置和大小 self.setGeometry(300, 70, 400, 600) # 设置窗口的标题 self.setWindowTitle('今日热搜榜') # 设置窗口的图标,引用当前目录下的web.png图片 self.setWindowIcon(QIcon('wb.png')) # 显示窗口 self.show()if __name__ == '__main__': # 创建应用程序和对象 app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())

又快迎来小长假~思绪已经开始起飞,希望自己在国庆可以读两本可以读懂并有收获的书,还在涉猎中。当然别忘emmm点赞~康桑思密达

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值