精华内容
下载资源
问答
  • 本文讲的是唐福林:新浪微博的Redis大数据之路,2012年4月15日消息,由IT168(ITPUB、IXPUB、ChinaUnix)主办的2012中国数据库技术大会(DTCC)进入第三天的议程。大会针对大数据架构设计、数据库安全、分布式数据库、...
    本文讲的是 唐福林:新浪微博的Redis大数据之路, 2012年4月15日消息,由IT168(ITPUB、IXPUB、ChinaUnix)主办的2012中国数据库技术大会(DTCC)进入第三天的议程。大会针对大数据架构设计、数据库安全、分布式数据库、商业智能、NoSQL、Hadoop等多个重点话题进行深入探讨。此次大会得到了全国数据库技术高手们的高度关注与支持,是当前象征最高技术水平的数据库工程师盛会。

      在今天下午进行的“NoSQL数据库创新专场”中,新浪微博开放平台资深工程师唐福林发表主题演讲《新浪微博:Redis的大数据之路》,介绍了NoSQL数据库Redis在新浪微博的使用场景及经验教训。

    唐福林:新浪微博的Redis大数据之路
    ▲新浪微博开放平台资深工程师唐福林

      唐福林首先分享了他对大数据的理解。他认为大数据有两种截然不同的概念,一种是线下大数据,即在持久化的介质中存储的、用于数据挖掘的、结构化的数据;另一种是线上大数据,即在在内存中存储的、用于在线服务的、结构化或半结构化或混合结构的数据。如果数据处理要求比单台机器能力高一个数量级的话,这样的数据就被称为大数据。

      Redis是一个基于内存的Key-Value存储的NoSQL引擎。与其他Key-Value引擎不同,Redis的Value可以支持多种数据结构,如哈希、List、Set等。但是一直以来,Redis的持久化方案并非完美。从rdb到aof,再到已经夭折的vm,Redis的持久化之路一直走的很坎坷。由于持久化的不完美,以及全部在内存中处理数据的特性,使得Redis在面对数据量持续增长的时候,总体拥有成本(TCO)也随之线性增长。

      唐福林表示,新浪微博从2010年底开始使用Redis,各项业务指标在经历了2011年全年的疯狂增长之后,他们发现在很多场合Redis已经不再适用。唐福林认为,Redis适用于数据量不太大的存储,以及数据量大的缓存。在选择数据存储介质的时候要分清数据量的大小和数据的冷热。小而热的数据适合使用内存,大而冷的数据适合使用磁盘,大而热的数据是否适合使用SSD,仍待探讨。

    唐福林:新浪微博的Redis大数据之路
    ▲新浪微博使用Redis的经验教训:100G以上的数据可以用作缓存

      演讲嘉宾介绍:唐福林,新浪微博开放平台资深工程师,目前负责新浪微博开放平台底层性能优化,曾负责t.cn短链,微博用户关系,计数器等底层服务。曾负责过包括新浪邮箱全文搜索在内的多个基于Lucene的垂直搜索引擎开发,以及新浪爱问和新浪播客的运维。对承载大数据量、高并发的互联网基础设施建设有丰富的经验。

      新浪微博技术团队简介:新浪微博开放平台,平台研发团队,负责微博底层功能实现及性能优化。 这里有亿万的用户,这里有方舟子和韩寒,这里有一切热点事件和争论。围观改变中国,这里是新浪微博。这里有@timyang大牛掌舵,这里有海量数据,这里有变态的并发,这里有技术Geek们需要的一切。


    作者:王玉圆

    来源: IT168

    原文标题:唐福林:新浪微博的Redis大数据之路

    展开全文
  • “We are leaving the age of information and entering the age of recommendation” — Chris Anderson in The Long Tail。... 在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推...

    “We are leaving the age of information and entering the age of recommendation” — Chris Anderson in The Long Tail。

    我们正在远离信息,而进入推荐时代。——克里斯·安德森

      在介绍微博推荐算法之前,我们先聊一聊推荐系统和推荐算法。有这样一些问题:推荐系统适用哪些场景?用来解决什么问题、具有怎样的价值?效果如何衡量?

      推荐系统诞生很早,但真正被大家所重视,缘起于以”facebook”为代表的社会化网络的兴起和以“淘宝“为代表的电商的繁荣,”选择“的时代已经来临,信息和物品的极大丰富,让用户如浩瀚宇宙中的小点,无所适从。推荐系统迎来爆发的机会,变得离用户更近:

    • 快速更新的信息,使用户需要借助群体的智慧,了解当前热点。
    • 信息极度膨胀,带来了高昂的个性化信息获取成本,过滤获取有用信息的效率低下。
    • 很多情况下,用户的个性化需求很难明确表达,比如“今天晚上需要在附近找一个性价比高、又符合我口味的餐馆“。

      推荐系统的适用场景还有很多,不再一一列举;其主要解决的问题是为用户找到合适的 item(连接和排序),并找到一个合理的理由来解释推荐结果。而问题的解决,就是系统的价值,即建立关联、促进流动和传播、加速优胜劣汰。

      推荐算法是实现推荐系统目标的方法和手段。算法与产品相结合,搭载在高效稳定的架构上,才能发挥它的最大功效。

      接下来我们说一下微博推荐,微博本身的产品设计,使得即使没有推荐系统,仍然会形成一个大的用户关系网络,实现信息快速传播;而衡量一个事物的价值,一个简单的方法是对比看看保留它和去掉它时的差别。微博需要健康的用户关系网络,保障用户 feed 流的质量,且需要优质信息快速流动,通过传播淘汰低质信息。微博推荐的作用在于加速这一过程,并在特定的情况下控制信息的流向,所以微博推荐的角色是一个加速器和控制器。

      最后回到微博推荐算法中来,上面扯了那么多,只是为了让大家能对微博推荐算法有更好的理解。我们的工作,是将微博推荐的目标和需要解决的问题,抽样为一系列的数学问题,然后运用多种数据工具进行求解。

      接下来首先用一个图梳理下我们用到的方法和技术,然后再逐一介绍。  

    微博推荐

      基础及关联算法

      这一层算法的主要作用是为微博推荐挖掘必要的基础资源、解决推荐时的通用技术问题、完成必要的数据分析为推荐业务提供指导。

      这一部分中常用的算法和技术如下:

      分词技术与核心词提取

      是微博内容推荐的基础,用于将微博内容转化为结构化向量,包括词语切分、词语信息标注、内容核心词/实体词提取、语义依存分析等。

      分类与 anti-spam

      用于微博内容推荐候选的分析,包含微博内容分类和营销广告/色情类微博识别;

      内容分类采用决策树分类模型实现,共 3 级分类体系,148 个类别;营销广告/色情类微博的识别,采用贝叶斯与最大熵的混合模型。

      聚类技术

      主要用于热点话题挖掘,以及为内容相关推荐提供关联资源。属于微博自主研发的聚类技术 WVT 算法(word vector topic),依据微博内容特点和传播规律设计。

      传播模型与用户影响力分析

      开展微博传播模型研究和用户网络影响力分析(包含深度影响力、广度影响力和领域内影响力)。

      主要推荐算法

      1. Graph-based 推荐算法

      微博具有这样的特点:用户贡献内容,社会化途径传播,带来信息的爆炸式传播。之所以称作 graph-based 推荐算法,而不是业界通用的 memory-based 算法,主要原因在于:

    • 我们的推荐算法设计是建立在社交网络之上,核心点在于从社交网络出发,融入信息传播模型,综合利用各类数据,为用户提供最佳的推荐结果;比如很多时候,我们只是信息传播的关键环节,加入必要的推荐调控,改变信息传播通路,后续的传播沿着原来的网络自然的传播。
    • Feed 流推荐(我们称作趋势),是我们最重要的产品,而结果必须包含用户关系。

      从 graph 的宏观角度看,我们的目标是建立一个具有更高价值的用户关系网络,促进优质信息的快速传播,提升 feed 流质量;其中的重要工作是关键节点挖掘、面向关键节点的内容推荐、用户推荐。

      对这部分的算法做相应的梳理,如下面的表格:

    36 大数据

      这里的困难点在于 graph 的“边”怎样量化与取舍,依据多个“边”与“节点”的综合评分计算,以及与网络挖掘分析结果的融合。

      这部分的算法研发中,产出了如下的数据附产品:

    36 大数据

      2. Content-based 推荐算法

      Content-based 是微博推荐中最常用也是最基础的推荐算法,它的主要技术环节在于候选集的内容结构化分析和相关性运算。

      正文页相关推荐是 content-based 应用最广的地方,以它为例,简要的说一下

    36 大数据

      内容分析的很多点已在前面描述过了,这里重点说 2 个地方:

    • 内容质量分析,主要采用微博曝光收益+内容信息量/可读性的方法来综合计算。微博曝光收益是借助用户群体行为,衡量内容优劣;内容信息量计算比较简单,即是微博关键词的 idf 信息迭代;对于内容可读性的衡量,我们做了一个小的分类模型,分别以可读性较好的新闻语料和可读性较差的口语化语料为训练样本,通过提取里面的各类词搭配信息,计算新微博具有良好可读性的概率。
    • 词扩展,content-based 的效果取决于内容分析的深度。微博的内容比较短,可提取的关键信息比较少,做相关运算时容易因为数据稀疏而导致推荐召回率和准确率的难以权衡;我们引入 word2vec 技术,优化了词扩展效果,后面又以此为基础开展词聚类的工作,实现了推荐召回率和准确率的同步提升。

      相关计算的技术点在于向量的量化和距离度量,我们通常使用“tf*idf 权重量化 + 余弦距离”或者“topic 概率 + KLD 距离“的两种方法。

      3. Model-based 推荐算法

      微博作为中国最大的社会化媒体产品,具有海量的用户和信息资源;这就给推荐带来了 2 个挑战:

      来源融合与排序

      候选的极大丰富,意味着我们有更多的选择,于是我们推荐结果的产生包含两层:多种推荐算法的初选与来源融合排序的精选,为了得到更客观准确的排序结果,我们需要引入机器学习模型,来学习隐藏在用户群体行为背后的规律。

      内容动态分类和语义相关

      微博 UGC 的内容生产模式,以及信息快速传播和更新的特点,意味着之前人工标注样本,训练静态分类模型的方法已经过时了,我们需要很好的聚类模型把近期的全量信息聚合成类,然后建立语义相关,完成推荐。

      Model-based 算法就是为了解决上述的问题,下面是我们两块最重要的机器学习工作:

      3. 1 CTR/RPM(每千次推荐关系达成率)预估模型,采用的基本算法为 Logistic regression,下面是我们 CTR 预估模型整体的架构图:

    36 大数据

      这部分工作包含样本选择、数据清洗、特征提取与选择、模型训练、在线预估和排序。值得一提的是,模型训练前的数据清洗和噪音剔除非常重要,数据质量是算法效果的上界,我们之前就在这个地方吃过亏。

      Logisitic regression 是一个 2 分类概率模型

    微博算法

      优化的目标在于最大化“样本正确分类概率的连乘值“;我们借助 yahoo 研发的 vowpal_wabbit 机器学习平台来完成模型特征值求解的最优化过程。

      3. 2 LFM(Latent Factor Model):LDA、矩阵分解(SVD++、SVD Feature)

      LDA 是 2014 年初重点开展的项目,现在已经有了较好的产出,也在推荐线上产品中得到了应用;LDA 本身是一个非常漂亮和严谨的数学模型,下面是我们一个 LDA topic 的例子,仅供参考。

    微博大数据

      至于矩阵分解,2013 年的时候做过相应的尝试,效果不是特别理想,没有继续投入。

      隐语义模型是推荐精度最高的单一模型,其困难在于数据规模大时,计算效率会成为瓶颈;我们在这个地方开展了一些工作,后续会有同学专门介绍这一块。

      混合技术

      三个臭皮匠顶个诸葛亮,每一种方法都有其局限性,将不同的算法取长补短,各自发挥价值,是极为有效的方式。微博推荐算法主要采用了下面的混合技术:

      时序混合:

      即在推荐过程的不同时间段,采用不同的推荐算法;以正文页相关推荐为例,在正文页曝光的前期阶段,采用 content-based + ctr 预估的方法生成推荐结果,待产生的足量可信的用户点击行为后,再采用 user-based 协同过滤的方法得到推荐结果,如下图所示:

    微博大数据

      这样利用 content-based 很好的解决了冷启动的问题,又充分发挥了 user-based CF 的作用,实现1+1>2 的效果。

      分层模型混合:

      很多情况下,一个模型无法很好的得到想要的效果,而分层组合往往会取得比较好的效果,分层模型混合即“将上一层模型的输出作为下层模型的特征值,来综合训练模型,完成推荐任务“。比如我们在做微博首页右侧的 ctr 预估排序时,采用分层逻辑回归模型,解决了不同产品间特征天然缺失与样本量差异、曝光位置带来的效果偏差等问题。

      瀑布型混合:

      这类混合技术思路非常简单,即在推荐候选非常丰富的情况下,采用逐层过滤的方法的得到推荐结果,通常将运算快、区分度低的算法放在前面,完成大量候选集的筛选;将运算慢、区分度高的算法放在后面,精细计算剩下的小规模集合。这类混合在微博推荐中大量使用,我们采用各种轻量算法完成候选集粗选,然后采用 ctr 预估做精细化排序。

      交叉混合:

      各类推荐算法中子技术,可以在另外的推荐算法中综合使用,比如 content-based 在相关性计算中积累的距离计算方法,可以很好的应用在协同过滤的量化计算中。实际的例子,我们将研究 LDA 时积累的向量计算方法成功的应用到用户推荐中。

      Online 与 offline

      微博数据的特点(海量、多样、静态与动态数据混在一起),决定了大部分推荐产品的结果需要同时借助 online 和 offline 的计算来完成。从系统和算法设计的角度,这是一个“重”与“轻”的问题,计算分解和组合是关键,我们需要将对时间不敏感的重型计算放在 offline 端,而将时间敏感性强的轻型快速计算放在 online 端。几种我们常用的方式如下图:

    大数据

      Online 需要简单可靠的算法,快速得到结果;简要说明下上面的图,如下

      半成品有以下的 3 中形式

      1)计算过程拆解的离线部分,如 user-based CF 中的用户相似度,online 通过数据库读取后在线计算完成 user-based 推荐。

      2)离线挖掘的优质候选集,如正文页相关推荐的内容候选集,online 通过索引获取到数据后,再通过相关性和 ctr 预估排序生成推荐结果。

      3)具有较高相似度的推荐结果集,如 offline 计算好粉丝相似高的用户,在线对用户行为做出实时反馈,实时补充推荐与其刚关注用户相似的用户。

    • 静态推荐结果,是指那些与时间关联小的推荐 item,如我们的用户推荐 95% 的结果来自离线计算。
    • 机器学习模型,这是一个计算过程时序性上的拆解;offline 完成模型的训练,在线调用 model 完成 item 排序,当然也可以通过 online-learning 或实时特征值完成模型的实时更新。同时,model 在线计算时,需要注意缺失特征值的补全,保证 offline 与 online 环境的一致性。

      此外,我们也有直接 online 计算完成的推荐结果,如首页右侧话题推荐,由于用户对话题需求的差异非常小,它基本上是一个排行榜的需求,但热门微博也可以有精巧的设计,我们采用了一个曝光动态收益模型,通过上一段时段的(点击收益-曝光成本)来控制下一时段的 item 曝光几率,取得了非常好的效果,ctr 和导流量有 3 倍以上的提升。

      不同类型的推荐结果,要辅以不同的推荐理由,这一点需要前端的多种展示尝试和 offline 的日志分析。

      效果评测

      算法效果的度量方式决定了大家努力的方向,而对于不同类型的推荐,最好根据产品的定位和目标,采用不同的标准体系去衡量工作结果。实际效果的评测分为 3 个层次:用户满意度、产品层指标(如 ctr)、算法层指标,我们的效果评测也会分为人工评测、线上A/B测试、离线算法效果评测 3 种。

      产品指标的制定,应该从产品期望达成的目标出发,体现用户满意度。

      对算法离线评测而言,关键的是找到一套合理的算法评测指标去拟合产品层指标,因为算法离线评测总是在上线前进行,这个对应做的越好,算法的优化成果才能更好的转化为线上的产品指标。

      下图为我们的算法离线效果评测的架构图

    微博大数据

      常用的离线评测指标有:RMSE、召回率、AUC、用户内多样性、用户间多样性、新颖性等。对于不同的产品有不同的组合指标去衡量,比如用户推荐中“用户间多样性”非常重要,而热点话题却可以允许用户间有较大的结果重合度。

    点击查看原文

    展开全文
  • 架构设计 这个是实时监测的,所以采用了SparkStreaming python爬取 爬取逻辑和大数据实战-全网词相类似,只处理微博的即可。 flume转发 flume沉槽到spark有push和poll两种方式,我这里使用的是较为简单的push a1....

    架构设计

    这个是实时监测的,所以采用了SparkStreaming
    在这里插入图片描述

    python爬取

    爬取逻辑和大数据实战-全网热词相类似,只处理微博的即可。

    flume转发

    flume沉槽到spark有push和poll两种方式,我这里使用的是较为简单的push

    a1.sources = r1
    a1.sinks = k1
    a1.channels = c1
    
    #source
    a1.sources.r1.type = syslogudp
    a1.sources.r1.bind = node102
    a1.sources.r1.port = 7777
    
    #channel
    a1.channels.c1.type = memory
    a1.channels.c1.capacity = 10000
    a1.channels.c1.transactionCapacity = 1000
    
    
    #sink
    a1.sinks.k1.type = avro
    a1.sinks.k1.hostname = 192.168.128.1
    a1.sinks.k1.port = 8888
    
    #相互关联 source--channel, sink--channel
    a1.sources.r1.channels = c1
    a1.sinks.k1.channel = c1
    
    

    spark计算

    import org.apache.spark.SparkConf
    import org.apache.spark.sql.{SaveMode, SparkSession}
    import org.apache.spark.streaming.flume.FlumeUtils
    import org.apache.spark.streaming.{Seconds, StreamingContext}
    
    case class WordDelta(word:String, delta:Int)
    object HotWordsPredict {
      def main(args: Array[String]): Unit = {
        //必须有一个接收器在常驻,另一个线程执行
        val sparkConf = new SparkConf().setMaster("local[*]").setAppName("Hello Streaming")
        //    val sparkContext = new SparkContext(sparkConf)
        val streamingContext = new StreamingContext(sparkConf,Seconds(300))
    
        //5s处理为一个批次
        val flumeDStream = FlumeUtils.createStream(streamingContext, "192.168.128.1", 8888)
        val sparkSession = SparkSession.builder().config(sparkConf).getOrCreate()
        import sparkSession.implicits._
    
        flumeDStream.map(line => new String(line.event.getBody.array()).trim)
          .map(line=>
            {
              val strs = line.split("\t")
              (strs(2), (strs(3), strs(4)))
            })
          .groupByKey()
          .map{case (k, v)=>
            (k, v.maxBy(_._2)._1.toInt - v.minBy(_._2)._1.toInt)}
          .foreachRDD(rdd=>
          if(!rdd.isEmpty()){
            rdd.map{case (k,v)=>WordDelta(k,v)}
              .toDS().write
              .format("jdbc")
              .option("url", "jdbc:mysql://node103:3306/db_hotwords")
              .option("dbtable", "tb_word_delta")
              .option("user", "root")
              .option("password", "root")
              .mode(SaveMode.Overwrite)
              .save()
          })
        streamingContext.start()
        streamingContext.awaitTermination()
      }
    }
    
    
    $ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
        --master yarn \
        --deploy-mode cluster \
        --driver-memory 4g \
        --executor-memory 2g \
        --executor-cores 1 \
        lib/spark-examples*.jar \
        10
    

    mysql存储

    CREATE TABLE `tb_word_delta` (  
      `word` text,  
      `delta` int(11) DEFAULT NULL  
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;  
    

    flask展示

    import pymysql
    from flask import Flask
    from jinja2 import Markup, Environment, FileSystemLoader
    from pyecharts.globals import CurrentConfig, SymbolType
    
    # 关于 CurrentConfig,可参考 [基本使用-全局变量]
    CurrentConfig.GLOBAL_ENV = Environment(loader=FileSystemLoader("./templates"))
    
    from pyecharts import options as opts
    from pyecharts.charts import Bar, WordCloud
    
    app = Flask(__name__, static_folder="templates")
    
    @app.route("/")
    def index():
        return """<!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>jiajunbernoulli的展示</title>
    </head>
    <body>
       <div id="page1">
            <iframe  width="100%" height="400" src="wordcloud"  frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
       </div>
       <div id="page2">
            <iframe align="center" width="100%" height="400" src="worddelta"  frameborder="no" border="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
       </div>
    </body>
    </html>
        """
    
    
    @app.route("/worddelta")
    def worddelta():
        # 打开数据库连接
        db = pymysql.connect("localhost", "root", "root", "db_hotwords", charset='utf8')
        cursor = db.cursor()
        cursor.execute("SELECT word,delta FROM tb_word_delta ORDER BY delta LIMIT 5")
        low5 = cursor.fetchall()
        cursor.execute("SELECT word,delta FROM tb_word_delta ORDER BY delta DESC LIMIT 5")
        up5 = cursor.fetchall()
        db.close()
        d = dict(low5 + up5)
        lst = sorted(d.items(), key=lambda x: abs(x[1]), reverse=True)
        keys = []
        values = []
        for item in lst:
            keys.append(item[0])
            if item[1] >= 0:
                values.append(item[1])
            else:
                values.append({"value": item[1], "label": "labelRight"})
        return """
        <!DOCTYPE html>
    <html>
    
    	<head>
    		<meta charset="utf-8">
    		<title>ECharts</title>
    		<!-- 引入 echarts.js -->
    		<script src="https://cdn.staticfile.org/echarts/4.3.0/echarts.min.js"></script>
    	</head>
    
    	<body>
    		<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
    		<div id="main" style="width: 600px;height:400px;"></div>
    		<script type="text/javascript">
    			// 基于准备好的dom,初始化echarts实例
    			var myChart = echarts.init(document.getElementById('main'));
    			var option;
    
    			var labelRight = {
    				normal: {
    					position: 'right'
    				}
    			};
    			option = {
    				title: {
    					text: '微博热搜增长top5-下跌top5',
    					subtext: '数据来源:微博热搜指数',
    					sublink: 'http://e.weibo.com/1341556070/AjwF2AgQm'
    				},
    				tooltip: {
    					trigger: 'axis',
    					axisPointer: { // 坐标轴指示器,坐标轴触发有效
    						type: 'shadow' // 默认为直线,可选为:'line' | 'shadow'
    					}
    				},
    				grid: {
    					top: 80,
    					bottom: 30
    				},
    				xAxis: {
    					type: 'value',
    					position: 'top',
    					splitLine: {
    						lineStyle: {
    							type: 'dashed'
    						}
    					},
    				},
    				yAxis: {
    					type: 'category',
    					axisLine: {
    						show: false
    					},
    					axisLabel: {
    						show: false
    					},
    					axisTick: {
    						show: false
    					},
    					splitLine: {
    						show: false
    					},
    					data: """+str(keys)+"""
    				},
    				series: [{
    					name: '变化量',
    					type: 'bar',
    					stack: '总量',
    					label: {
    						normal: {
    							show: true,
    							formatter: '{b}'
    						}
    					},
    					data: """+str(values)+"""
    				}]
    			};
    
    			myChart.setOption(option);
    		</script>
    	</body>
    
    </html>
    """
    
    if __name__ == "__main__":
        app.run(host="0.0.0.0")
    

    在这里插入图片描述

    展开全文
  • python爬取微博热搜

    2021-03-02 16:06:53
    今天给大家分享的时用python爬取微博热搜,下面是相关信息。 源码及注释: #-- coding=UTF-8 --#!usr/bin/env pythonimport osimport timeimport requestsfrom lxml import etree url = ...

    今天给大家分享的时用python爬取微博热搜,下面是相关信息。

    在这里插入图片描述
    源码及注释:
    #-- coding=UTF-8 --#!usr/bin/env pythonimport osimport timeimport requestsfrom lxml import etree

    url = "https://s.weibo.com/top/summary?cate=realtimehot"headers={‘Host’: ‘s.weibo.com’,‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3’,‘Accept-Encoding’: ‘gzip, deflate, br’,‘Accept-Language’: ‘zh-CN,zh;q=0.9’,‘Connection’: ‘keep-alive’,‘Referer’: ‘https://weibo.com/’,‘User-Agent’: ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36’}r = requests.get(url,headers=headers)print(r.status_code)html_xpath = etree.HTML(r.text)data = html_xpath.xpath(’//[@id=“pl_top_realtimehot”]/table/tbody/tr/td[2]’)num = -1# # 解决存储路径# time_path = time.strftime(’%Y{y}%m{m}%d{d}’,time.localtime()).format(y=‘年’, m=‘月’, d=‘日’)# time_name = time.strftime(’%Y{y}%m{m}%d{d}%H{h}’,time.localtime()).format(y=‘年’, m=‘月’, d=‘日’,h=‘点’)# root = “./” + time_path + “/”# path = root + time_name + ‘.md’# if not os.path.exists(root):# os.mkdir(root)# 解决存储路径time_path = time.strftime(’%Y{y}%m{m}%d{d}’,time.localtime()).format(y=‘年’, m=‘月’, d=‘日’)time_name = time.strftime(’%Y{y}%m{m}%d{d}%H{h}’,time.localtime()).format(y=‘年’, m=‘月’, d=‘日’,h=‘点’)year_path = time.strftime(’%Y{y}’,time.localtime()).format(y=‘年’)month_path = time.strftime(’%m{m}’,time.localtime()).format(m=‘月’)day_month = time.strftime(’%d{d}’,time.localtime()).format(d=‘日’)all_path = “./” + year_path + ‘/’+ month_path + ‘/’ + day_monthif not os.path.exists(all_path):# 创建多层路径os.makedirs(all_path)# 最终文件存储位置root = all_path + "/"path = root + time_name + ‘.md’print(path)# 文件头部信息with open(path,‘a’) as f:f.write(’{} {}\n\n’.format(’# ‘,time_name+‘数据’))f.close()for tr in (data):title = tr.xpath(’./a/text()’)hot_score = tr.xpath(’./span/text()’)
    num += 1# 过滤第 0 条if num == 0:passelse:with open(path,‘a’) as f:f.write(’{} {}、{}\n\n’.format(’###’,num,title[0]))f.write(’{} {}\n\n’.format(‘微博当时热度为:’,hot_score[0]))
    f.close()print(num,title[0],‘微博此时的热度为:’,hot_score[0])
    运行:
    运行结束后会在当前文件夹下生成以时间命名的文件夹,并且会生成以具体小时为单位的具体时间命名的 Markdown 文件,如下:
    在这里插入图片描述
    在这里插入图片描述
    文章部分内容源于网络,联系侵删

    展开全文
  • 百度、微博等热门搜索排行榜功能你用过吗?你知道这个功能是如何实现的吗? 实际上,它的实现并不复杂。搜索引擎每天会接收大量的用户搜索请求,它会把这些用户输入的搜索关键词记录下来,然后再离线地统计分析,...
  • 微博热搜的爬取需要用到lxml和requests两个库 url=https://s.weibo.com/top/summary?Refer=top_hot&topnav=1&wvr=6 1.分析网页的源代码:右键–查看网页源代码,从网页代码中可以获取到信息有: (1)热搜的...
  • python数据分析之禅今天教大家如何用pyecharts制作微博热搜榜动态展示视频,先上视频看看效果: 教程主要有2部分: 一是python爬取微博热搜内容 二是用pyecharts制作动态视频 下面给大家详细介绍一下 一...
  • 同为高并发,微博热搜、天猫秒杀、12306 抢票有什么不同呢?那接下来我们就来分别聊聊他们有什么特性~1、微博热搜微博热搜」是一个典型的读多写少场景,读今日的热点新闻,写自己的微博评论。...
  • 通过akshare API获取微博热搜词汇统计,并将数据可视化用于分析 实践准备 开始前需要安装akshare,有关akshare的安装与使用参考《akshare文档》 需要使用到的库: pylab #用于可视化 pandas #用于数据处理 项目实施...
  • 但是不可否认的是,微博热搜的确成为很多人了解明星的最大流量入口。 我们对10位明星进行了简单的的分析,数据如下: 肖战:136条 周深:100条 华晨宇:49条 郑爽:153条 鹿晗:131条 杨幂:159条 刘昊然:...
  • 2020年全年在新浪微博产生大约78490条热搜(包含重复热搜),平均每天产生218条。 下面以表格形式,展示明星所占的热搜条数(以条数为颗粒度,排名不分先后)。 明星姓名 上榜条数 郑爽 152 胡歌 16 ...
  • 2.爬取每条热搜的相关微博。 3.爬取每条相关微博的评论,评论用户的各种详细信息。 4.实现了自动翻译,理论上来说,是可以拿下与热搜相关的任何细节,但数据量比较大,推荐使用数据库对这个爬虫程序进行优化(因为...
  • conn = pymysql.connect(**config) cursor = conn.cursor() # 获取热搜源码 weiboHotFile = requests.get('http://s.weibo.com/top/summary') weiboHotHtml = weiboHotFile.text # 正则表达式匹配URL,找到title ...
  • 6.5.1.1.sql INSERT INTO target_db.target_table SELECT max(timestamp) AS timestamp, 热搜_top50_json(热搜词条_name, cnt) AS data -- 外层 udaf 将所有数据进行 merge FROM ( SELECT 热搜词条_name,...
  • (行情数据来自OKEx平台交易,对应北京时间7月28日00:00-9:00) 新闻快讯 【行业】“比特币牛市”登上微博热搜榜排名11位 7月28日早间,比特币行情大涨,“比特币牛市”登上微博热搜榜,现排名第11位。 【行业】...
  • 如果每次询问前 K 大数据,我们都基于当前的数据重新计算的话,那时间复杂度就是 O(nlogK),n 表示当前的数据的大小。实际上,我们可以一直都维护一个 K 大小的小顶堆,当有数据被添加到集合中时,我们就拿它与堆顶...
  • 二、项目介绍 项目步骤 ① 实时爬取微博热搜前十标题 ② 把爬取到的数据保存在数据库中,同时加上爬取时间(年 - 月- 日 - 时:分) ③ 在本地创建一个Excel表格 ④ 把爬取到的数据保存在所创建的Excel表格当中,...
  • 27日,网信办约谈新浪微博引发热议, 网页相关舆情信息数量较多 艾媒大数据舆情监控系统数据显示,自1月27日...艾媒大数据舆情监控系统数据显示,截至1月30日,对新浪微博被约谈下架“热搜榜”事件的讨论主要集中在网
  • 日前,《中国好声音》第三季刚刚落下帷幕,在“巅峰之夜”终极PK中,张碧晨凭借出色表现,荣获第三季冠军;...统计数据显示,《中国好声音》一跃成为决赛当天最话题,占据了搜狗微信搜索10大热词榜首的位...
  • 众人苦大数据杀熟久矣!01美团会员有个叫做漂移神父的网友,眼看着到年底了准备犒劳一下自己,多点一点外卖少做一点饭,为了能省点小钱于是就在美团上买了会员。按照我们正常人的理解,买了会员点...
  • 来自:DBAplus社群本文根据彭冬老师在〖2019 DAMS中国数据智能管理峰会〗现场演讲内容整理而成。讲师介绍彭冬,微博广告大数据团队负责人、技术专家。目前负责微博广告智能运维系统、...
  • 前两天看到有人后台留言说想了解大数据,这不今天又在催啦,不是没看到留言,一直有偷偷地关注你们的,总得给大家整理呀!理解万岁哈,其实这段时间我也一直在研究大数据相关的东西,就先给大家介绍一下大数据吧,...
  • 1.新闻词折线统计图 在新闻标题及正文中,词前20名平均提及4.9次。“大数据”一词出现了47次,是出现17次“金融”的近3倍,当之无愧的c位。 2.行业词频柱状统计图 从结果中可以看出大数据与金融、人工...
  • 因为百度开发者大会的召开,以及围绕W3C是否是标准话题的讨论,这两天的微博有些热闹。...\在百度开发者大会上,百度技术副总裁王劲正式公布百度云战略:开放百度云计算、大数据等核心技术能力和...
  • 黑马视频号大数据和人工智能技术在为社会发展和居民生活带来便捷的同时,也滋生了一些不利影响,「大数据杀熟」便是其中之一。何谓「大数据杀熟」,狭义上理解是同样的商品或服务,老客户看到的价格...
  • 前两天看到有人后台留言说想了解大数据,这不今天又在催啦,不是没看到留言,...在2006 年,个人用户才刚刚迈进TB时代,全球一共新产生了约180EB的数据,但互联网(社交、搜索、电商)、移动互联网(微博)、物联网...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,282
精华内容 1,312
关键字:

微博热搜大数据