爬取微博热搜榜单内容

(1)导入后续用到的库

from datetime import datetime
from urllib.parse import quote #对中文转码
import requests
import os
import warnings #过滤警告
warnings.filterwarnings("ignore")

(2)定义获取json文件的方法

def hot_search():
    url = 'https://weibo.com/ajax/side/hotSearch'
    response = requests.get(url)
    # 状态码200通常被称为"成功"状态码,它表示服务器已经成功地处理了客户端的请求,并且返回了一个响应。
    if response.status_code != 200: 
        return None
    return response.json()['data']

(3)定义解析json文件的方法

def main(num):
    data = hot_search()  # 调用hot_search()函数获取数据源
    if not data:
        print('获取微博热搜榜失败')
        return
    print(f"置顶:{data['hotgov']['word'].strip('#')}")  # 设置正能量推荐位(热搜置顶),加大对正向内容的宣推力度。
    pq_time = datetime.now().strftime('20%y/%m/%d %H:%M:%S')
    # montage = "标题,热度,类型,主题标签,分类,链接,日期"  # 用来保存爬取到的数据

    montage = f"{data['hotgov']['word'].strip('#')}"+',,置顶,,,,'+pq_time

    for i, rs in enumerate(data['realtime'][0:num]):
        j = i + 1
        title = rs['word']
        # 点击链接后,发现url的规律,其url组合为:https://s.weibo.com/weibo?q=+热搜标题+&Refer=top等后缀
        # 由于url并不能为中文,因此在链接中会呈现为类似8%8C%85%E这样的编码。
        # 如果我们要实现对url的组合,首先应该对中文字符串进行转码。
        # 为此需要使用urllib.parse库quote方法,对中文转码,代码如下:
        link = (f"https://s.weibo.com/weibo?q={quote(title)}&t=31&band_rank={j}&Refer=top")

        try:
            label = rs['label_name'] #标题
        except:  # 对异常进行捕获并处理,比如广告,就没有label_name键
            label = ''

        try:
            hot = rs['raw_hot']  #热度
        except:
            hot = ''

        try:
            subject_label = rs['subject_label']  #主题标签
        except:
            subject_label = ''

        try:
            category = rs['category'].replace(',', '、')  #类别
        except:
            category = ''


        if hot != '':
            montage = montage + '\n' + title + "," + str(hot) + "," + label + "," + subject_label + "," + category + "," + link + "," + pq_time


    # 写入txt文件

    dir_path = '热搜榜单数据/' + datetime.now().strftime('20%y年%m月%d日')
    try:
        os.mkdir(dir_path)
    except FileExistsError:
        print(dir_path + "目录已存在")

    now = datetime.now().strftime('20%y年%m月%d日%H-%M-%S')
    file_name =  dir_path + '/' + now + '.txt'

    if not os.path.exists(file_name):
        f = open(file_name, "w", encoding='UTF-8')
        f.write(montage)
        f.close()
    else:
        f = open(file_name, "w", encoding='UTF-8')
        f.write(montage)
        f.close()
    print(datetime.now().strftime('微博热搜榜 20%y年%m月%d日 %H:%M'))
    print("导出文件名:", file_name)  #文件第一行是表头,第二行是置顶的内容

(4)调用方法

if __name__ == '__main__':
    print(datetime.now().strftime('微博热搜榜 20%y年%m月%d日 %H:%M'))
    num = 55 #获取热搜的数量
    main(num)

(5)运行结果展示

 官网热搜榜单

注:可能会有些许区别 因为热搜榜单更新频率较快!

最后,小伙伴们有什么问题可以评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值