当前位置: 首页 > 后端技术 > Python

【Python开发微信小助手】02热搜查询功能

时间:2023-03-26 01:27:01 Python

简介:疫情好转很多,我已经可以看到湖北的曙光了!在【微信个人助理Python开发】系列第一期中,我们初步实现了一个完善的自动回复功能。这一阶段我们会写一个自动查询百度、微博热搜的功能。需求背景在日常生活中,我应该是一个比较宅的人,不太关注国内外的大事。但是在工作中,我发现同事之间聊天,除了工作,就是在聊这些新的热点问题,所以我有时候也会关注这些,以免跟不上节奏。一般热点问题可通过微博、百度查看实时热搜或实时热点查询。那么问题来了。想看微博热搜,得先打开微博,然后切换到对应的菜单栏,然后??找到大家搜索,点击全部,才能看到完整的榜单;百度的实时热点与此类似。就像下面微博上的图:一个小需求,需要三个操作才能实现。如前所述,我是微信的重度用户。基本上,我打开手机的时候,肯定是在微信界面。那我能不能让我的微信小助手帮我找到热点话题发给我呢?当然!实现效果如下(想体验的朋友可以后台发送“微信个人助理体验”获取小助手的微信号,注意“微信个人助理体验”是自动传过去的,目前有天气查询、实时热搜查询、翻译、在线点歌功能):获取热搜信息实现这个功能的第一步自然是获取我们想要的热搜信息。由于原理相同,这里以微博热搜为例。下面是微博热搜的网址:https://s.weibo.com/top/summary?cate=realtimehot那么如何提取这些关键词呢?下面介绍爬虫的相关知识。这篇公众号的原文章中有两篇相关的文章,有兴趣的可以再看一遍。在Chrome地址栏输入以上网址,打开开发者工具回车:发现没有专门的API生成热搜信息,所以这里采取直接解析网页源码的方式获取热搜信息。用Python获取网页源码非常简单,两句话就可以搞定:importrequestspage=requests.get('https://s.weibo.com/top/summary?cate=realtimehot')page_source=page.text这里引用requests包是一个Python库,支持HTTP连接保留和连接池、使用cookie的会话保留、文件上传、自动响应内容编码以及国际化URL和POST数据的自动编码。总而言之,最好记住这是一个用于处理URL资源的特别方便的库。通过上面两行代码,我们得到如下信息(内容太多,这里删除了部分,格式已经整理):微博搜索-热搜榜

序列号关键词全球抗疫中国风往复运动1张文宏表示今年夏天疫情基本不可能结束48550012北京小汤山医院所有医疗设备2153854【本文来自微信公众号Titus小宇宙,ID为TitusCosmos,转载请注明!】【为了防止网络上各种爬虫的爬取,特意删除了原作者信息,所以在文章中间加上了作者信息,希望各位读者谅解】每一个热搜你都能看的一清二楚话题和相应的流行度。这里注意观察,每个热搜话题及其对应的热度分别在class属性为td-02的td标签下的a标签和span标签中。发现这个之后,是不是每次都需要对网页源代码进行格式化,然后通过某种方式过滤掉呢?当然不是,我们有一个更简单的工具:fromlxmlimportetreetree=etree.HTML(page_source)这里指的是lxml包中的etree类,它可以自动将html源代码转换成类似xml的树结构。根据前面的分析,这里可以很方便的通过xpath获取到对应位置的信息,但是需要注意的是,热搜话题中的第一项是手动置顶话题,这里需要去掉:news=tree.xpath('//td[@class="td-02"]/a/text()')[1:]news_hot_index=tree.xpath('//td[@class="td-02"]/span/text()')得到的内容如下:前期准备都做好了,接下来要做的就是根据要显示的数量来组织这些内容:#limit是默认的或者设置数量为为范围内的索引显示(限制):topic=format.format(str(index+1),news_hot_index[index],news[index])topics.append(topic)result='\n************************\n'.join(topics)返回结果这样,获取热搜话题的后台代码就做好了。微信交互后台的功能就完成了,剩下的就是前台和微信交互的部分了。我们会根据用户的要求收集微博或百度平台的热搜信息,两者均默认提供50条热搜信息。因此,这部分需要用户提供两条信息:热搜来源和显示条数。通过设置默认热搜平台和显示条数,用户可以只发“热搜”获取信息。同时,您还可以通过“开启/关闭热搜”选择开启或关闭热搜查询功能。和之前的“自动回复”一文一样,用户的自定义设置是通过全局变量实现的(请注意,这只是演示,部分代码没有严格限制):#对外定义默认值is_open_hotspot=Truecustom_platform='Weibo'custom_limit=5#在函数开头声明这个为全局变量@itchat.msg_register([TEXT,MAP,CARD,NOTE,SHARING])deftext_reply(msg):globalis_open_hotspot,custom_platform,custom_limitsender=msg['User']['UserName']if'UserName'inmsg['User']else'filehelper'nickname=msg['User']['NickName']if'NickName'inmsg['User']else'filehelper'content=msg['Content']ifnickname=='filehelper'ornickname=='Admin/Name/To/Fill/In':cmd=content.lstrip().rstrip()ifcmd=='Openhotsearch':is_open_hotspot=Trueitchat.send_msg('热搜功能已开启!',sender)elifcmd=='关闭热点':is_open_hotspot=Falseitchat.send_msg('热搜功能已关闭!',sender)elifcmd.startswith('设置热搜,'):custom_content=content.replace('设置热搜,','')custom_platform=custom_content.split('')[0]custom_limit=custom_content.split('')[1]itchat.send_msg('热点默认值设置成功!',sender)elifcmd=='hotspot':result=get_hotspot(custom_platform,custom_limit)itchat.send_msg(result,sender)elifcmd.startswith('热搜,'):custom_content=content.replace('设置热点,','')result=get_hotspot(custom_content.split('')[0],custom_content.split('')[1])itchat.send_msg(result,sender)else:pass到这里,一个完整的热搜查询功能就正式完成了程序员的世界不允许冗余操作,每一个冗余操作都是在浪费生命。后记不管写什么,都希望能和更多的人交流。如果您有任何问题或需求,欢迎随时交流。我所有的项目源码都会放在下面的github仓库,有需要的可以参考,有问题请指正,谢谢!https://github.com/TitusWongCN/以下是我的公众号,里面有一些记录,有兴趣可以扫一扫: