微博热搜榜单采集,微博热搜榜单爬虫,微博热搜榜单解析,完整代码(话题榜+热搜榜+文娱榜和要闻榜)

news2025/1/13 11:00:19

文章目录

    • 代码
      • 1. 话题榜
      • 2. 热搜榜
      • 3. 文娱榜和要闻榜
    • 过程
      • 1. 话题榜
      • 2. 热搜榜
      • 3. 文娱榜和要闻榜

代码

1. 话题榜

import requests  
import pandas as pd  
import urllib  
from urllib import parse  
  
headers = {  
    'authority': 'weibo.com',  
    'accept': 'application/json, text/plain, */*',  
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  
    'client-version': 'v2.44.64',  
    'referer': 'https://weibo.com/newlogin?tabtype=topic&gid=&openLoginLayer=0&url=',  
    'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',  
    'sec-ch-ua-mobile': '?0',  
    'sec-ch-ua-platform': '"Windows"',  
    'sec-fetch-dest': 'empty',  
    'sec-fetch-mode': 'cors',  
    'sec-fetch-site': 'same-origin',  
    'server-version': 'v2024.02.19.1',  
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',  
    'x-requested-with': 'XMLHttpRequest',  
    'x-xsrf-token': 'HOU1s1Hak41bvvQjYsR86Oar',  
}  
  
  
def get_page_resp(num):  
    params = {  
        'sid': 'v_weibopro',  
        'category': 'all',  
        'page': f'{num}',  
        'count': '10',  
    }  
    response = requests.get('https://weibo.com/ajax/statuses/topic_band', params=params, headers=headers)  
    return response  
  
  
def process_resp(response):  
    statuses = response.json()['data']['statuses']  
    if statuses:  
        _df = pd.DataFrame([[statuse['topic'], statuse['summary'], statuse['read'], statuse['mention'], f"https://s.weibo.com/weibo?q=%23{urllib.parse.quote(statuse['topic'])}%23"] for statuse in statuses], columns=['topic', 'summary', 'read', 'mention', 'href'])  
        return _df  
    else:  
        return  
  
  
if __name__ == '__main__':  
    df_list = []  
    num = 1  
    while num:  
        resp = get_page_resp(num)  
        _df = process_resp(resp)  
        if isinstance(_df, pd.DataFrame):  
            df_list.append(_df)  
            num += 1  
        else:  
            num = 0  
    df = pd.concat(df_list).reset_index(drop=True)  
    print(df)  
    df.to_csv('话题榜.csv')

2. 热搜榜

import requests  
import urllib  
import pandas as pd  
import numpy as np  
  
  
def get_hot():  
    headers = {  
        'authority': 'weibo.com',  
        'accept': 'application/json, text/plain, */*',  
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  
        'client-version': 'v2.44.64',  
        'referer': 'https://weibo.com/newlogin?tabtype=search&gid=&openLoginLayer=0&url=',  
        'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',  
        'sec-ch-ua-mobile': '?0',  
        'sec-ch-ua-platform': '"Windows"',  
        'sec-fetch-dest': 'empty',  
        'sec-fetch-mode': 'cors',  
        'sec-fetch-site': 'same-origin',  
        'server-version': 'v2024.02.19.1',  
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',  
        'x-requested-with': 'XMLHttpRequest',  
        'x-xsrf-token': 'HOU1s1Hak41bvvQjYsR86Oar',  
    }  
  
    response = requests.get('https://weibo.com/ajax/side/hotSearch', headers=headers)  
  
    df = pd.DataFrame(response.json()['data']['realtime'])  
    df['url'] = df['word'].map(lambda x: 'https://s.weibo.com/weibo?q=' + urllib.parse.quote(x))  
    df['onboard_time'] = pd.to_datetime(df['onboard_time'], unit='s')  
    gov_name = response.json()['data']['hotgov']['name']  
    gov_url = response.json()['data']['hotgov']['url']  
    df = df[['word_scheme', 'word', 'star_name', 'realpos', 'label_name', 'onboard_time', 'url', 'raw_hot']]  
    gov_info = [gov_name, gov_name[1:-1], {}, 0, '顶', np.nan, gov_url, np.nan]  
    df = pd.DataFrame(np.insert(df.values, 0, gov_info, axis=0), columns=df.columns)  
    return df  
  
  
if __name__ == '__main__':  
    df = get_hot()  
    df.to_csv('热搜榜.csv')

3. 文娱榜和要闻榜

这里需要更换cookies

import requests  
import pandas as pd  
import urllib  
  
# 跟换为自己的cookies  
def get_entertainment_and_news():  
    headers = {  
        'authority': 'weibo.com',  
        'accept': 'application/json, text/plain, */*',  
        'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',  
        'client-version': 'v2.44.75',  
        # 跟换为自己的cookies  
        'cookie': 'SINAGLOBAL=1278126679099.0298.1694199077980; UOR=,,localhost:8888; _s_tentry=localhost:8888; Apache=6414703468275.693.1710132397752; XSRF-TOKEN=4A9SIIBq9XqCDDTlkpxBLz76; ULV=1710132397782:20:1:1:6414703468275.693.1710132397752:1708482016120; login_sid_t=b637e1846742b4dd85dfe4d86c2c9413; cross_origin_proto=SSL; wb_view_log=1920*10801; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9WFARU4r6-VQ2BMDorVsYLdC5JpX5o275NHD95Qce0eX1KefehMXWs4DqcjMi--NiK.Xi-2Ri--ciKnRi-zNSoe0Sh.0SK5NS5tt; ALF=1712724726; SSOLoginState=1710132727; SCF=ApDYB6ZQHU_wHU8ItPHSso29Xu0ZRSkOOiFTBeXETNm74LTwE3TL5gaw4A4raSthpN-_7ynDOKXDUkiKc1jk720.; SUB=_2A25I6v2nDeRhGeBN6FYY8yvMzDiIHXVrhn9vrDV8PUNbktAGLXb1kW9NRGsSAV5UnWQYNJKU-WfqLNcAf0YTSxtn; WBPSESS=LZz_sqga1OZFrPjFnk-WNlnL5lU4G2v_-YZmcP-p0RFdJenqKjvGkmGWkRfJEjOjxH0yfYfrC4xwEi4ExzfXLO84Lg-HDSQgWx5p8cnO_TnE_Gna1RnTgtIpZu7xWJpq8fJ35LrwI2KAkj4nnVzB_A==',  
        'referer': 'https://weibo.com/hot/entertainment',  
        'sec-ch-ua': '"Chromium";v="116", "Not)A;Brand";v="24", "Microsoft Edge";v="116"',  
        'sec-ch-ua-mobile': '?0',  
        'sec-ch-ua-platform': '"Windows"',  
        'sec-fetch-dest': 'empty',  
        'sec-fetch-mode': 'cors',  
        'sec-fetch-site': 'same-origin',  
        'server-version': 'v2024.03.06.1',  
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36 Edg/116.0.1938.69',  
        'x-requested-with': 'XMLHttpRequest',  
        'x-xsrf-token': '4A9SIIBq9XqCDDTlkpxBLz76',  
    }  
  
    response_entertainment = requests.get('https://weibo.com/ajax/statuses/entertainment', headers=headers)  
    response_news = requests.get('https://weibo.com/ajax/statuses/news', headers=headers)  
  
    df_entertainment = pd.DataFrame(response_entertainment.json()['data']['band_list'])  
    df_entertainment['url'] = df_entertainment['word'].map(  
        lambda x: 'https://s.weibo.com/weibo?q=' + '%23' + urllib.parse.quote(x) + '%23')  
    df_news = pd.DataFrame(response_news.json()['data']['band_list'])  
    df_news['url'] = df_news['topic'].map(  
        lambda x: 'https://s.weibo.com/weibo?q=' + '%23' + urllib.parse.quote(x) + '%23')  
    return df_entertainment, df_news  
  
  
if __name__ == '__main__':  
    df_entertainment, df_news = get_entertainment_and_news()  
    df_entertainment.to_csv('文娱榜.csv')  
    df_news.to_csv('要闻榜.csv')

过程

1. 话题榜

从F12中可以得到所有数据在右侧请求中,解析可以得到参数如下:

  • sid: 这个值为 v_weibopro 是固定的
  • category: 这个值为 all 是固定的
  • page: 这个值为页码,每一页10个,从第一页开始计算
  • count: 这个值为 10 是固定的,修改无效

所有的数据存储在['data']['statuses']下,进行解析,代码如下:

statuses = response.json()['data']['statuses']
    if statuses:
        _df = pd.DataFrame([[statuse['topic'], statuse['summary'], statuse['read'], statuse['mention'], f"https://s.weibo.com/weibo?q=%23{urllib.parse.quote(statuse['topic'])}%23"] for statuse in statuses], columns=['topic', 'summary', 'read', 'mention', 'href'])
        return _df
    else:
        return 0

可以获得所有结果:


2. 热搜榜

从F12中发现,这个请求是Get型的请求,什么参数都不需要,估计微博是直接放弃了

直接将得到的数据进行处理,

df = pd.DataFrame(response.json()['data']['realtime'])  
df['url'] = df['word'].map(lambda x: 'https://s.weibo.com/weibo?q=' + urllib.parse.quote(x))  
df['onboard_time'] = pd.to_datetime(df['onboard_time'], unit='s')  
gov_name = response.json()['data']['hotgov']['name']  
gov_url = response.json()['data']['hotgov']['url']  
df = df[['word_scheme', 'word', 'star_name', 'realpos', 'label_name', 'onboard_time', 'url', 'raw_hot']]  
gov_info = [gov_name, gov_name[1:-1], {}, 0, '顶', np.nan, gov_url, np.nan]  
df = pd.DataFrame(np.insert(df.values, 0, gov_info, axis=0), columns=df.columns)

得到:


3. 文娱榜和要闻榜

这里从F12中可以发现,文娱榜和要闻榜 直接一个请求就可以获取,但是在解析的过程中,发现还是需要cookie的,所以这里需要自己获取cookies;

在response中发现数据无需要清理,直接在表格中获取一下自己需要的参数即可,在这里还是把url添加一下,有的人根本不看前文怎么获取的;

	response_entertainment = requests.get('https://weibo.com/ajax/statuses/entertainment',  headers=headers)
    response_news = requests.get('https://weibo.com/ajax/statuses/news',  headers=headers)
    
    df_entertainment = pd.DataFrame(response_entertainment.json()['data']['band_list'])
    df_entertainment['url'] = df_entertainment['word'].map(lambda x: 'https://s.weibo.com/weibo?q=' + '%23' + urllib.parse.quote(x) + '%23')
    
    df_news = pd.DataFrame(response_news.json()['data']['band_list'])
    df_news['url'] = df_news['topic'].map(lambda x: 'https://s.weibo.com/weibo?q=' + '%23' + urllib.parse.quote(x) + '%23')

得到文娱榜如下:

得到要闻榜如下:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1519632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《JAVA与模式》之工厂方法模式

系列文章目录 文章目录 系列文章目录前言一、工厂方法模式二、工厂方法模式的活动序列图三、工厂方法模式和简单工厂模式前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码…

SwiftU的组件 - TabView

SwiftU的组件 - TabView 记录一下SwiftU的组件 - TabView的两种style分别的使用方式 import SwiftUIstruct TabViewBootCamp: View {State var selectedIndex 0var body: some View {NavigationView {TabView(selection: $selectedIndex) {HomeView(selectedIndex: $selected…

【解读】Synopsys发布2024年开源安全和风险分析报告OSSRA

软件供应链管理中,许可证和安全合规性至关重要。开源组件和库可降低风险,但需了解许可证内容。Synopsys 2023年审计发现,超过一半的代码库存在许可证冲突。MIT许可证是最常用的宽松许可证,但也与其他许可证存在不兼容风险。点此获…

重学SpringBoot3-Problemdetails

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-Problemdetails Problem Details的概念ProblemDetails配置类在Spring Boot 3中使用Problem Details未配置Problem Details配置Problem Details自定义异常…

外包就干了2个月,技术退步明显....

先说情况,大专毕业,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

程序员必备开发工具、程序员必备集成开发环境(IDE)

🌟 前言 欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍 &#x…

鸿蒙Next学习-Flex布局

Entry Component struct FlexCase {build() {//需要在构造参数上传Flex({ direction: FlexDirection.Row,justifyContent:FlexAlign.Center }) {//flex布局Row().width(100).height(100).backgroundColor(Color.Red)Row().width(100).height(100).backgroundColor(Color.Yellow…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:NavRouter)

导航组件,默认提供点击响应处理,不需要开发者自定义点击事件逻辑。 说明: 该组件从API Version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 子组件 必须包含两个子组件,其中第二个子组…

HTML基础:超链接的其他 4 种形式

你好,我是云桃桃。上次,我们聊了 HTML href 属性的网页链接,锚点链接,这次我们聊聊 href 其他 4 种常见链接。 1、电子邮件链接(mailto): 通过 mailto: 创建一个链接,点击链接会自…

使用阿里云服务器查看网站备案的方法和注意事项

随着互联网的发展,网站注册已成为在中国建设网站的必要步骤。 在使用阿里云服务器时,我们可以通过以下步骤查看网站注册状态。 备案概述: 在中国,互联网信息服务提供者必须进行登记,以监管互联网内容、规范市场运营和…

Java 输入方法 数组

目录 一、输入方法1.常用方法2.Scanner的使用3.BufferedReader的使用 二、数组1.数组的定义静态初始化数组动态初始化数组多维数组 2.数组赋值机制3.数组拷贝使用循环逐元素拷贝使用 System.arraycopy() 方法使用 Arrays.copyOf() 方法 4.数组排序5.数组合并6.数组翻转7.基于范…

Kotlin编程权威指南学习知识点预览

一、变量、常量和类型: 变量、常量以及 Kotlin 基本数据类型。变量和常量在 应用程序中可用来储值和传递数据。类型则用来描述常量或变量中保存的是什么样的数据。 1、声明变量: // 变量定义关键字 —— 变量名 —— 类型定义 —— 赋值运算符 —— 赋值var na…

【Kafka面试演练】那Kafka消费者手动提交、自动提交有什么区别?

面试官:听说你精通Kafka,那我就考考你吧 面试官:不用慌尽管说,错了也没关系😊。。。 每日分享【大厂面试演练】,本期是《Kafka系列》,感兴趣就关注我吧❤️ 面试官:你先说说Kafka由什…

cuda cudnn安装

安装 cudnn是否安装成功 注意 cudnn对应的cuda的10.0版本无win11版本 下载win10 即可

linux系统关闭防火墙和SELINUX及配置网络

一,关闭防火墙和SELINUX 当我们进入界面后,输入用户名root,以及密码,密码我们是看不见的 然后输入指令cat -n /etc/sysconfig/selinux (注意空格) 输入指令 vi /etc/sysconfig/selinux &#xf…

杂七杂八111

MQ 用处 一、异步。可提高性能和吞吐量 二、解耦 三、削峰 四、可靠。常用消息队列可以保证消息不丢失、不重复消费、消息顺序、消息幂等 选型 一Kafak:吞吐量最大,性能最好,集群高可用。缺点:会丢数据,功能较单一。 二Ra…

第十五届蓝桥杯模拟考试III_物联网设计与开发官方代码分析

目录 前言:显示界面部分: 前言: 这次模拟的效果很不好。85分,4h的限时我花了两天完成,这个时间是远远超出要求的,而且最后还只拿到56分,抛开分数高低不提,就这个用时属实蜗牛一样的速…

2024年【危险化学品经营单位安全管理人员】考试及危险化学品经营单位安全管理人员考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品经营单位安全管理人员考试根据新危险化学品经营单位安全管理人员考试大纲要求,安全生产模拟考试一点通将危险化学品经营单位安全管理人员模拟考试试题进行汇编,组成一套危险化学品经…

安装nginx

Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾…

2024/3/14打卡k倍区间(8届蓝桥杯)——前缀和+优化***

题目 给定一个长度为 N 的数列,A1,A2,…AN,如果其中一段连续的子序列 Ai,Ai1,…Aj 之和是 K 的倍数,我们就称这个区间 [i,j] 是 K 倍区间。 你能求出数列中总共有多少个 K 倍区间吗? 输入格式 第一行包含两个整数 N 和 K。 以下 N…