我分析了虎嗅网5万篇文章,发现这些秘密

56 篇文章 1 订阅
订阅专栏
本文转自:https://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=2653558174&idx=1&sn=4f4c1b389a92bf43c4142736f908fddc&chksm=806e3b23b719b2358c1bc3cd59fde58276173605806354e4ad8c6e324721f6a8a15e9e2063ad&mpshare=1&scene=1&srcid=1204zKy587C8qNjEW5OgCfGU#rd


1. 分析背景

1.1. 为什么选择「虎嗅」

在众多新媒体网站中,「虎嗅」网的文章内容和质量还算不错。在「新榜」科技类公众号排名中,它位居榜单第 3 名,还是比较受欢迎的。所以选择爬取该网站的文章信息,顺便从中了解一下这几年科技互联网都出现了哪些热点信息。
在这里插入图片描述

「关于虎嗅」
虎嗅网创办于 2012 年 5 月,是一个聚合优质创新信息与人群的新媒体平台。该平台专注于贡献原创、深度、犀利优质的商业资讯,围绕创新创业的观点进行剖析与交流。虎嗅网的核心,是关注互联网及传统产业的融合、明星公司的起落轨迹、产业潮汐的动力与趋势。

1.2. 分析内容

分析虎嗅网 5 万篇文章的基本情况,包括收藏数、评论数等

发掘最受欢迎和最不受欢迎的文章及作者

分析文章标题形式(长度、句式)与受欢迎程度之间的关系

展现近些年科技互联网行业的热门词汇


1.3. 分析工具

Python 3.6

pyspider

MongoDB

Matplotlib

WordCloud

Jieba



2. 数据抓取

使用 pyspider 抓取了虎嗅网的主页文章,文章抓取时期为 2012 年建站至 2018 年 11 月 1 日,共计约 5 万篇文章。抓取 了 7 个字段信息:文章标题、作者、发文时间、评论数、收藏数、摘要和文章链接。

2.1. 目标网站分析

这是要爬取的 网页界面,可以看到是通过 AJAX 加载的。
在这里插入图片描述
在这里插入图片描述
右键打开开发者工具查看翻页规律,可以看到 URL 请求是 POST 类型,下拉到底部查看 Form Data,表单需提交参数只有 3 项。经尝试, 只提交 page 参数就能成功获取页面的信息,其他两项参数无关紧要,所以构造分页爬取非常简单。

huxiu_hash_code: 39bcd9c3fe9bc69a6b682343ee3f024a
page: 4
last_dateline: 1541123160

接着,切换选项卡到 Preview 和 Response 查看网页内容,可以看到数据都位于 data 字段里。total_page 为 2004,表示一共有 2004 页的文章内容,每一页有 25 篇文章,总共约 5 万篇,也就是我们要爬取的数量。
在这里插入图片描述
以上,我们就找到了所需内容,接下来可以开始构造爬虫,整个爬取思路比较简单。

2.2. pyspider 介绍

和之前文章不同的是,这里我们使用一种新的工具来进行爬取,叫做:pyspider 框架。由国人 binux 大神开发,GitHub Star 数超过 12 K,足以证明它的知名度。可以说,学习爬虫不能不会使用这个框架。

网上关于这个框架的介绍和实操案例非常多,这里仅简单介绍一下。

我们之前的爬虫都是在 Sublime 、PyCharm 这种 IDE 窗口中执行的,整个爬取过程可以说是处在黑箱中,内部运行的些细节并不太清楚。而 pyspider 一大亮点就在于提供了一个可视化的 WebUI 界面,能够清楚地查看爬虫的运行情况。
在这里插入图片描述
pyspider 的架构主要分为 Scheduler(调度器)、Fetcher(抓取器)、Processer(处理器)三个部分。Monitor(监控器)对整个爬取过程进行监控,Result Worker(结果处理器)处理最后抓取的结果。
在这里插入图片描述
该框架比较容易上手,网页右边是代码区,先定义类(Class)然后在里面添加爬虫的各种方法(也可以称为函数),运行的过程会在左上方显示,左下方则是输出结果的区域。

官方主页: http://docs.pyspider.org/en/latest/

安装好该框架并大概了解用法后,下面我们可以就开始爬取了。

2.3. 抓取数据

CMD 命令窗口执行:pyspider all 命令,然后浏览器输入: http://localhost:5000/ 就可以启动 pyspider 。

点击 Create 新建一个项目,Project Name 命名为:huxiu,因为要爬取的 URL 是 POST 类型,所以这里可以先不填写,之后可以在代码中添加,再次点击 Creat 便完成了该项目的新建。
在这里插入图片描述
新项目建立好后会自动生成一部分模板代码,我们只需在此基础上进行修改和完善,然后就可以运行爬虫项目了。现在,简单梳理下代码编写步骤。
在这里插入图片描述

from pyspider.libs.base_handler import *
class Handler(BaseHandler):
    crawl_config:{
        "headers":{
            'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',
            'X-Requested-With': 'XMLHttpRequest'
            }
    }
    def on_start(self):
        for page in range(2,3): # 先循环1页
            print('正在爬取第 %s 页' % page)
            self.crawl('https://www.huxiu.com/v2_action/article_list',method='POST',data={'page':page}, callback=self.index_page)

这里,首先定义了一个 Handler 主类,整个爬虫项目都主要在该类下完成。 接着,可以将爬虫基本的一些基本配置,比如 Headers、代理等设置写在下面的 crawl_config 属性中。

如果你还没有习惯从函数(def)转换到类(Class)的代码写法,那么需要先了解一下类的相关知识,之后我也会单独用一篇文章介绍一下。

下面的 on_start() 方法是程序的入口,也就是说程序启动后会首先从这里开始运行。首先,我们将要爬取的 URL传入 crawl() 方法,同时将 URL 修改成虎嗅网的: https://www.huxiu.com/v2_action/article_list。

由于 URL 是 POST 请求,所以我们还需要增加两个参数:method 和 data。method 表示 HTTP 请求方式,默认是 GET,这里我们需要设置为 POST;data 是 POST 请求表单参数,只需要添加一个 page 参数即可。

接着,通过 callback 参数定义一个 index_page() 方法,用来解析 crawl() 方法爬取 URL 成功后返回的 Response 响应。在后面的 index_page() 方法中,可以使用 PyQuery 提取响应中的所需内容。具体提取方法如下:

import json
from pyquery import PyQuery as pq
def index_page(self, response):
        content = response.json['data']
        # 注意,在sublime中,json后面需要添加(),pyspider 中则不用
        doc = pq(content)
        lis = doc('.mod-art').items()
        data = [{
            'title': item('.msubstr-row2').text(),
            'url':'https://www.huxiu.com'+ str(item('.msubstr-row2').attr('href')),
            'name': item('.author-name').text(),
            'write_time':item('.time').text(),
            'comment':item('.icon-cmt+ em').text(),
            'favorites':item('.icon-fvr+ em').text(),
            'abstract':item('.mob-sub').text()
            } for item in lis ]   # 列表生成式结果返回每页提取出25条字典信息构成的list
        print(data)
        return data

这里,网页返回的 Response 是 json 格式,待提取的信息存放在其中的 data 键值中,由一段 HTML 代码构成。我们可以使用 response.json[‘data’] 获取该 HTML 信息,接着使用 PyQuery 搭配 CSS 语法提取出文章标题、链接、作者等所需信息。这里使用了列表生成式,能够精简代码并且转换为方便的 list 格式,便于后续存储到 MongoDB 中。

我们输出并查看一下第 2 页的提取结果:

# 由25个 dict 构成的 list
[{'title': '想要长生不老?杀死体内的“僵尸细胞”吧', 'url': 'https://www.huxiu.com/article/270086.html', 'name': '造就Talk', 'write_time': '19小时前', 'comment': '4', 'favorites': '28', 'abstract': '如果有了最终疗法,也不应该是每天都需要接受治疗'}, 
 {'title': '日本步入下流社会,我们还在买买买', 'url': 'https://www.huxiu.com/article/270112.html', 'name': '腾讯《大家》©', 'write_time': '20小时前', 'comment': '13', 'favorites': '142', 'abstract': '我买,故我在'}
...
]

可以看到,成功得到所需数据,然后就可以保存了,可以选择输出为 CSV、MySQL、MongoDB 等方式,这里我们选择保存到 MongoDB 中。

import pandas as pd
import pymongo
import time
import numpy as np
5client = pymongo.MongoClient('localhost',27017)
db = client.Huxiu
mongo_collection = db.huxiu_news

def on_result(self,result):
        if result:
            self.save_to_mongo(result)  
def save_to_mongo(self,result):
    df = pd.DataFrame(result)
    #print(df)
    content = json.loads(df.T.to_json()).values()
    if mongo_collection.insert_many(content):
        print('存储到 mongondb 成功')
        # 随机暂停
        sleep = np.random.randint(1,5)
        time.sleep(sleep)

上面,定义了一个 on_result() 方法,该方法专门用来获取 return 的结果数据。这里用来接收上面 index_page() 返回的 data 数据,在该方法里再定义一个存储到 MongoDB 的方法就可以保存到 MongoDB 中。

下面,我们来测试一下整个爬取和存储过程。点击左上角的 run 就可以顺利运行单个网页的抓取、解析和存储,结果如下:

在这里插入图片描述

上面完成了单页面的爬取,接下来,我们需要爬取全部 2000 余页内容。

需要修改两个地方,首先在 on_start() 方法中将 for 循环页数 3 改为 2002。改好以后,如果我们直接点击 run ,会发现还是只能爬取第 2 页的结果。

这是因为,pyspider 以 URL的 MD5 值作为 唯一 ID 编号,ID 编号相同的话就视为同一个任务,便不会再重复爬取。由于 GET 请求的 分页URL 通常是有差异的,所以 ID 编号会不同,也就自然能够爬取多页。但这里 POST 请求的分页 URL 是相同的,所以爬完第 2 页,后面的页数便不会再爬取。

那有没有解决办法呢? 当然是有的,我们需要重新写下 ID 编号的生成方式,方法很简单,在 on_start() 方法前面添加下面 2 行代码即可:

def get_taskid(self,task):
    return md5string(task['url']+json.dumps(task['fetch'].get('data','')))

这样,我们再点击 run 就能够顺利爬取 2000 页的结果了,我这里一共抓取了 49,996 条结果,耗时 2 小时左右完成。
在这里插入图片描述
以上,就完成了数据的获取。有了数据我们就可以着手分析,不过这之前还需简单地进行一下数据的清洗、处理。

3. 数据清洗处理

首先,我们需要从 MongoDB 中读取数据,并转换为 DataFram

client = pymongo.MongoClient(host='localhost', port=27017)
db = client['Huxiu']
collection = db['huxiu_news']
# 将数据库数据转为DataFrame
data = pd.DataFrame(list(collection.find()))

下面我们看一下数据的总体情况,可以看到数据的维度是 49996 行 × 8 列。发现多了一列无用的 _id 需删除,同时 name 列有一些特殊符号,比如© 需删除。另外,数据格式全部为 Object 字符串格式,需要将 comment 和 favorites 两列更改为数值格式、 write_time 列更改为日期格式。

print(data.shape)  # 查看行数和列数
print(data.info()) # 查看总体情况
print(data.head()) # 输出前5行

# 结果:
(49996, 8)
Data columns (total 8 columns):
_id           49996 non-null object
abstract      49996 non-null object
comment       49996 non-null object
favorites     49996 non-null object
name          49996 non-null object
title         49996 non-null object
url           49996 non-null object
write_time    49996 non-null object
dtypes: object(8)

    _id abstract    comment favorites   name    title   url write_time
0    5bdc2   “在你们看到… 22  50  普象工业设计小站©   看了苹果屌   https://    10小时前
1    5bdc2   中国”绿卡”号称“世界最难拿” 9   16  经济观察报©  递交材料厚   https://    10小时前
2    5bdc2   鲜衣怒马少年时 2   13  小马宋 金庸小说陪   https://    11小时前
3    5bdc2   预告还是预警? 3   10  Cuba Libre  阿里即将发   https://    11小时前
4    5bdc2   库克:咋回事? 2   3   Cuba Libre  【虎嗅早报   https://    11小时前

代码实现如下:

# 删除无用_id列
data.drop(['_id'],axis=1,inplace=True)
# 替换掉特殊字符©
data['name'].replace('©','',inplace=True,regex=True)
# 字符更改为数值
data = data.apply(pd.to_numeric,errors='ignore')
# 更该日期格式
data['write_time'] = data['write_time'].replace('.*前','2018-10-31',regex=True) 
# 为了方便,将write_time列,包含几小时前和几天前的行,都替换为10月31日最后1天。
data['write_time'] = pd.to_datetime(data['write_time'])

下面,我们看一下数据是否有重复,如果有,那么需要删除。

# 判断整行是否有重复值
print(any(data.duplicated()))
# 显示True,表明有重复值,进一步提取出重复值数量
data_duplicated = data.duplicated().value_counts()
print(data_duplicated) # 显示2 True ,表明有2个重复值
# 删除重复值
data = data.drop_duplicates(keep='first')
# 删除部分行后,index中断,需重新设置index
data = data.reset_index(drop=True)
#结果:
True 
False    49994
True         2

然后,我们再增加两列数据,一列是文章标题长度列,一列是年份列,便于后面进行分析。

data['title_length'] = data['title'].apply(len)
data['year'] = data['write_time'].dt.year
Data columns (total 9 columns):
abstract        49994 non-null object
comment         49994 non-null int64
favorites       49994 non-null int64
name            49994 non-null object
title           49994 non-null object
url             49994 non-null object
write_time      49994 non-null datetime64[ns]
title_length    49994 non-null int64
year            49994 non-null int64

以上,就完成了基本的数据清洗处理过程,针对这 9 列数据可以开始进行分析了。

4. 描述性数据分析

通常,数据分析主要分为四类: 「描述型分析」、「诊断型分析」「预测型分析」「规范型分析」。「描述型分析」是用来概括、表述事物整体状况以及事物间关联、类属关系的统计方法,是这四类中最为常见的数据分析类型。通过统计处理可以简洁地用几个统计值来表示一组数据地集中性(如平均值、中位数和众数等)和离散型(反映数据的波动性大小,如方差、标准差等)。

这里,我们主要进行描述性分析,数据主要为数值型数据(包括离散型变量和连续型变量)和文本数据。

4.1. 总体情况

先来看一下总体情况。

print(data.describe())
             comment     favorites  title_length 
count  49994.000000  49994.000000  49994.000000  
mean      10.860203     34.081810     22.775333  
std       24.085969     48.276213      9.540142  
min        0.000000      0.000000      1.000000  
25%        3.000000      9.000000     17.000000  
50%        6.000000     19.000000     22.000000  
75%       12.000000     40.000000     28.000000  
max     2376.000000   1113.000000    224.000000  

这里,使用了 data.describe() 方法对数值型变量进行统计分析。从上面可以简要得出以下几个结论:

  1. 读者的评论和收藏热情都不算太高。大部分文章(75 %)的评论数量为十几条,收藏数量不过几十个。这和一些微信大 V 公众号动辄百万级阅读、数万级评论和收藏量相比,虎嗅网的确相对小众一些。不过也正是因为小众,也才深得部分人的喜欢。

  2. 评论数最多的文章有 2376 条,收藏数最多的文章有 1113 个收藏量,说明还是有一些潜在的比较火或者质量比较好的文章。

  3. 最长的文章标题长达 224 个字,大部分文章标题长度在 20 来个字左右,所以 标题最好不要太长或过短。

对于非数值型变量(name、write_time),使用 describe() 方法会产生另外一种汇总统计。

print(data['name'].describe())
print(data['write_time'].describe())
# 结果:
count     49994
unique     3162
top          虎嗅
freq      10513
Name: name, dtype: object
count                   49994
unique                   2397
top       2014-07-10 00:00:00
freq                      274
first     2012-04-03 00:00:00
last      2018-10-31 00:00:00

unique 表示唯一值数量,top 表示出现次数最多的变量,freq 表示该变量出现的次数,所以可以简单得出以下几个结论:

  1. 在文章来源方面,3162 个作者贡献了这 5 万篇文章,其中自家官网「虎嗅」写的数量最多,超过了 1 万篇,这也很自然。

  2. 在文章发表时间方面,最早的一篇文章来自于 2012年 4 月 3 日。 6 年多时间,发文数最多的 1 天 是 2014 年 7 月 10 日,一共发了 274 篇文章。

4.2. 不同时期文章发布的数量变化

在这里插入图片描述
可以看到 ,以季度为时间尺度的 6 年间,前几年发文数量比较稳定,大概在1750 篇左右,个别季度数量激增到 2000 篇以上。2016 年之后文章开始增加到 2000 篇以上,可能跟网站知名度提升有关。首尾两个季度日期不全,所以数量比较少。

具体代码实现如下:

def analysis1(data):
    # # 汇总统计
    # print(data.describe())
    # print(data['name'].describe())
    # print(data['write_time'].describe())

    data.set_index(data['write_time'],inplace=True)
    data = data.resample('Q').count()['name']  # 以季度汇总
    data = data.to_period('Q')
    # 创建x,y轴标签
    x = np.arange(0,len(data),1)
    ax1.plot(x,data.values, #x、y坐标
        color = color_line , #折线图颜色为红色
        marker = 'o',markersize = 4 #标记形状、大小设置
        )
    ax1.set_xticks(x) # 设置x轴标签为自然数序列
    ax1.set_xticklabels(data.index) # 更改x轴标签值为年份
    plt.xticks(rotation=90) # 旋转90度,不至太拥挤

    for x,y in zip(x,data.values):
        plt.text(x,y + 10,'%.0f' %y,ha = 'center',color = colors,fontsize=fontsize_text )
        # '%.0f' %y 设置标签格式不带小数
    # 设置标题及横纵坐标轴标题
    plt.title('虎嗅网文章数量发布变化(2012-2018)',color = colors,fontsize=fontsize_title)
    plt.xlabel('时期')
    plt.ylabel('文章(篇)')
    plt.tight_layout()  # 自动控制空白边缘
    plt.savefig('虎嗅网文章数量发布变化.png',dpi=200)
    plt.show()

4.3. 文章收藏量 TOP10

接下来,到了我们比较关心的问题:几万篇文章里,到底哪些文章写得比较好或者比较火?
在这里插入图片描述
此处选取了「favorites」(收藏数量)作为衡量标准。毕竟,一般好的文章,我们都会有收藏的习惯。

第一名「读完这10本书,你就能站在智商鄙视链的顶端了 」以 1113 次收藏位居第一,并且遥遥领先于后者,看来大家都怀有「想早日攀上人生巅峰,一览众人小」的想法啊。打开这篇文章的链接,文中提到了这几本书:《思考,快与慢》、《思考的技术》、《麦肯锡入职第一课:让职场新人一生受用的逻辑思考力》等。一本都没看过,看来这辈子是很难登上人生巅峰了。

发现两个有意思的地方:
第一,文章标题都比较短小精炼。
第二,文章收藏量虽然比较高,但评论数都不多,猜测这是因为 大家都喜欢做伸手党?

4.4. 历年文章收藏量 TOP3

在了解文章的总体排名之后,我们来看看历年的文章排名是怎样的。这里,每年选取了收藏量最多的 3 篇文章。
在这里插入图片描述
在这里插入图片描述
可以看到,文章收藏量基本是逐年递增的,但 2015 年的 3 篇文章的收藏量却是最高的,包揽了总排名的前 3 名,不知道这一年的文章有什么特别之处。

以上只罗列了一小部分文章的标题,可以看到标题起地都蛮有水准的。关于标题的重要性,有这样通俗的说法:「一篇好文章,标题占一半」,一个好的标题可以大大增强文章的传播力和吸引力。文章标题虽只有短短数十字,但要想起好,里面也是很有很多技巧的。

好在,这里提供了 5 万个标题可供参考。如需,可以在公众号后台回复「虎嗅」得到这份 CSV 文件。

代码实现如下:

def analysis2(data):
    # # 总收藏排名
    # top = data.sort_values(['favorites'],ascending = False)
    # # 收藏前10
    # top.index = (range(1,len(top.index)+1)) # 重置index,并从1开始编号
    # print(top[:10][['title','favorites','comment']])

    # 按年份排名
    # # 增加一列年份列
    # data['year'] = data['write_time'].dt.year
    def topn(data):
        top = data.sort_values('favorites',ascending=False)
        return top[:3]
    data = data.groupby(by=['year']).apply(topn)
    print(data[['title','favorites']])
    # 增加每年top123列,列依次值为1、2、3
    data['add'] = 1 # 辅助
    data['top'] = data.groupby(by='year')['add'].cumsum()
    data_reshape = data.pivot_table(index='year',columns='top',values='favorites').reset_index()
    # print(data_reshape)  # ok
    data_reshape.plot(
        # x='year',
        y=[1,2,3],
        kind='bar',
        width=0.3,
        color=['#1362A3','#3297EA','#8EC6F5']  # 设置不同的颜色
        # title='虎嗅网历年收藏数最多的3篇文章'
        )
    plt.xlabel('Year')
    plt.ylabel('文章收藏数量')
    plt.title('历年 TOP3 文章收藏量比较',color = colors,fontsize=fontsize_title)
    plt.tight_layout()  # 自动控制空白边缘,以全部显示x轴名称
    # plt.savefig('历年 Top3 文章收藏量比较.png',dpi=200)
    plt.show()

4.4.1. 最高产作者 TOP20

上面,我们从收藏量指标进行了分析,下面,我们关注一下发布文章的作者(个人/媒体)。前面提到发文最多的是虎嗅官方,有一万多篇文章,这里我们筛除官媒,看看还有哪些比较高产的作者。
在这里插入图片描述
可以看到,前 20 名作者的发文量差距都不太大。发文比较多的有「娱乐资本论」、「Eastland」、「发条橙子」这类媒体号;也有虎嗅官网团队的作者:发条橙子、周超臣、张博文等;还有部分独立作者:假装FBI、孙永杰等。可以尝试关注一下这些高产作者。

代码实现如下:

def analysis3(data):
    data = data.groupby(data['name'])['title'].count()
    data = data.sort_values(ascending=False)
    # pandas 直接绘制,.invert_yaxis()颠倒顺序
    data[1:21].plot(kind='barh',color=color_line).invert_yaxis()
    for y,x in enumerate(list(data[1:21].values)):
        plt.text(x+12,y+0.2,'%s' %round(x,1),ha='center',color=colors)
    plt.xlabel('文章数量')
    plt.ylabel('作者')
    plt.title('发文数量最多的 TOP20 作者',color = colors,fontsize=fontsize_title)
    plt.tight_layout()
    plt.savefig('发文数量最多的TOP20作者.png',dpi=200)
    plt.show()

4.4.2. 平均文章收藏量最多作者 TOP 10

我们关注一个作者除了是因为文章高产以外,可能更看重的是其文章水准。这里我们选择「文章平均收藏量」(总收藏量/文章数)这个指标,来看看文章水准比较高的作者是哪些人。

这里,为了避免出现「某作者只写了一篇高收藏率的文章」这种不能代表其真实水准的情况,我们将筛选范围定在至少发布过 5 篇文章的作者们。
在这里插入图片描述
可以看到,前 10 名作者包括:遥遥领先的 重读、两位高产又有质量的 辩手李慕阳 和 饭统戴老板 ,还有大众比较熟悉的 高晓松、宁南山等。

如果你将这份名单和上面那份高产作者名单进行对比,会发现他们没有出现在这个名单中。相比于数量,质量可能更重要吧。

下面,我们就来看看排名第一的 重读 都写了哪些高收藏量文章。
在这里插入图片描述
居然写的都是清一色关于马老板家的文章。

了解了前十名作者之后,我们顺便也看看那些处于最后十名的都是哪些作者。
在这里插入图片描述
一对比,就能看到他们的文章收藏量就比较寒碜了。尤其好奇最后一位作者 Yang Yemeng ,他写了 7 篇文章,竟然一个收藏都没有。

来看看他究竟写了些什么文章。
在这里插入图片描述
原来写的全都是英文文章,看来大家并不太钟意阅读英文类的文章啊。

具体实现代码:

def analysis4(data):
    data = pd.pivot_table(data,values=['favorites'],index='name',aggfunc=[np.sum,np.size])
    data['avg'] = data[('sum','favorites')]/data[('size','favorites')]
    # 平均收藏数取整
    # data['avg'] = data['avg'].round(decimals=1)
    data['avg'] = data['avg'].astype('int')
    # flatten 平铺列
    data.columns = data.columns.get_level_values(0)
    data.columns = ['total_favorites','ariticls_num','avg_favorites']
    # 筛选出文章数至少5篇的
    data=data.query('ariticls_num > 4')
    data = data.sort_values(by=['avg_favorites'],ascending=False)
    # # 查看平均收藏率第一名详情
    # data = data.query('name == "重读"')
    # # 查看平均收藏率倒数第一名详情
    # data = data.query('name == "Yang Yemeng"')
    # print(data[['title','favorites','write_time']])
    print(data[:10])     # 前10名
    print(data[-10:])    # 后10名

4.5. 文章评论数最多 TOP10

说完了收藏量。下面,我们再来看看评论数量最多的文章是哪些。
在这里插入图片描述
基本上都是和 三星 有关的文章,这些文章大多来自 2014 年,那几年 三星 好像是挺火的,不过这两年国内基本上都见不到三星的影子了,世界变化真快。

发现了两个有意思的现象。

第一,上面关于 三星 和前面 阿里 的这些批量文章,它们「霸占」了评论和收藏榜,结合知乎上曾经的一篇关于介绍虎嗅这个网站的文章:虎嗅网其实是这样的 ,貌似能发现些微妙的事情。

第二,这些文章评论数和收藏数两个指标几乎呈极端趋势,评论量多的文章收藏量却很少,评论量少的文章收藏量却很多。

我们进一步观察下这两个参数的关系。
在这里插入图片描述
可以看到,大多数点都位于左下角,意味着这些文章收藏量和评论数都比较低。但也存在少部分位于上方和右侧的异常值,表明这些文章呈现 「多评论、少收藏」或者「少评论、多收藏」的特点。

4.6. 文章标题长度

下面,我们再来看看文章标题的长度和收藏量之间有没有什么关系。
在这里插入图片描述
大致可以看出两点现象:

第一,收藏量高的文章,他们的标题都比较短(右侧的部分散点)。
第二,标题很长的文章,它们的收藏量都非常低(左边形成了一条垂直线)。

看来,文章起标题时最好不要起太长的。

实现代码如下:

def analysis5(data):
    plt.scatter(
        x=data['favorites'],
        y =data['comment'],
        s=data['title_length']/2,
        )
    plt.xlabel('文章收藏量')
    plt.ylabel('文章评论数')
    plt.title('文章标题长度与收藏量和评论数之间的关系',color = colors,fontsize=fontsize_title)
    plt.tight_layout() 
    plt.show()

4.7. 标题形式

下面,我们看看作者在起文章标题的时候,在标点符号方面有没有什么偏好。
在这里插入图片描述
可以看到,五万篇文章中,大多数文章的标题是陈述性标题。三分之一(34.8%) 的文章标题使用了问号「?」,而仅有 5% 的文章用了叹号「!」。通常,问号会让人们产生好奇,从而想去点开文章;而叹号则会带来一种紧张或者压迫感,使人不太想去点开。所以,可以尝试多用问号而少用叹号。

4.8. 文本分析

最后,我们从这 5 万篇文章中的标题和摘要中,来看看虎嗅网的文章主要关注的都是哪些主题领域。

这里首先运用了 jieba 分词包对标题进行了分词,然后用 WordCloud 做成了词云图,因虎嗅网含有「虎」字,故选取了一张老虎头像。(关于 jieba 和 WordCloud 两个包,之后再详细介绍)
在这里插入图片描述
可以看到文章的主题内容侧重于:互联网、知名公司、电商、投资这些领域。这和网站本身对外宣传的核心内容,即「关注互联网与移动互联网一系列明星公司的起落轨迹、产业潮汐的动力与趋势,以及互联网与移动互联网如何改造传统产业」大致相符合。

实现代码如下:

def analysis6(data):
    text=''
    for i in data['title'].values:
        symbol_to_replace = '[!"#$%&'()*+,-./:;<=>?@,。?★、…【】《》?“”‘’![\]^_`{|}~]+'
        i = re.sub(symbol_to_replace,'',i)
        text+=' '.join(jieba.cut(i,cut_all=False))
    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()

    background_Image = np.array(Image.open(path.join(d, "tiger.png")))
    font_path = 'C:WindowsFontsSourceHanSansCN-Regular.otf'  # 思源黑字体

    # 添加stopswords
    stopwords = set()
    # 先运行对text进行词频统计再排序,再选择要增加的停用词
    stopwords.update(['如何','怎么','一个','什么','为什么','还是','我们','为何','可能','不是','没有','哪些','成为','可以','背后','到底','就是','这么','不要','怎样','为了','能否','你们','还有','这样','这个','真的','那些'])
    wc = WordCloud(
        background_color = 'black',
        font_path = font_path,
        mask = background_Image,
        stopwords = stopwords,
        max_words = 200,
        margin =2,
        max_font_size = 100,
        random_state = 42,
        scale = 2,
    )
    wc.generate_from_text(text)
    process_word = WordCloud.process_text(wc, text)
    # 下面是字典排序
    sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True) # sort为list
    print(sort[:50])  # 输出前词频最高的前50个,然后筛选出不需要的stopwords,添加到前面的stopwords.update()方法中
    img_colors = ImageColorGenerator(background_Image)
    wc.recolor(color_func=img_colors)  # 颜色跟随图片颜色
    plt.imshow(wc,interpolation='bilinear')
    plt.axis('off')
    plt.tight_layout()  # 自动控制空白边缘
    plt.savefig('huxiu20.png',dpi=200)
    plt.show()

上面的关键词是这几年总体的概况,而科技互联网行业每年的发展都是不同的,所以,我们再来看看历年的一些关键词,透过这些关键词看看这几年互联网行业、科技热点、知名公司都有些什么不同变化。
在这里插入图片描述
可以看到每年的关键词都有一些相同之处,但也不同的地方:

  1. 中国互联网、公司、苹果、腾讯、阿里等这些热门关键词一直都是热门,这几家公司真是稳地一批啊。

  2. 每年会有新热点涌现:比如 2013 年的微信(刚开始火)、2016 年的直播(各大直播平台如雨后春笋般出现)、2017年的 iPhone(上市十周年)、2018年的小米(上市)。

  3. 不断有新的热门技术出现:2013 - 2015 年的 O2O、2016 年的 VR、2017 年的 AI 、2018 年的「区块链」。这些科技前沿技术也是这几年大家口耳相传的热门词汇。

通过这一幅图,就看出了这几年科技互联网行业、明星公司、热点信息的风云变化。

5. 小结

本文简要分析了虎嗅网 5 万篇文章信息,大致了解了近些年科技互联网的千变万化。

发掘了那些优秀的文章和作者,能够节省宝贵的时间成本。

一篇文章要想传播广泛,文章本身的质量和标题各占一半,文中的5 万个标题相信能够带来一些灵感。

本文尚未做深入的文本挖掘,而文本挖掘可能比数据挖掘涵盖的信息量更大,更有价值。进行这些分析需要机器学习和深度学习的知识,待后期学习后再来补充。

更多案例请关注“思享会Club”公众号或者关注思享会博客:http://gkhelp.cn/

在这里插入图片描述

10.3---Python入门之嗅网站信息爬取-所有的新闻url地址
qingtingwhk的博客
05-17 417
""" """ import urllib.request from bs4 import BeautifulSoup ''' 定义: 爬取 指定网页中,所有的新闻url地址 ''' ############################################# ## 直接操作 # ## 定义需要爬取的网站URL # url = "https://www.huxiu.com" # # ## 获取嗅网站首页的内容 # index_page = urllib.request..
JAVA爬取嗅网截图_java爬虫爬取网站使用多线程(嗅网站)
weixin_42178688的博客
03-02 231
java爬虫爬取网站使用多线程(嗅网站)java爬虫爬取网站使用多线程(嗅网站)图解爬虫优化方案pom 如下:org.apache.httpcomponentshttpclient4.5.3org.jsoupjsoup1.10.3org.springframeworkspring-jdbc4.2.6.RELEASEmysqlmysql-connector-java5.1.41c3p0c3p...
python爬取网页数据 ajax_python 爬取嗅网-post方法抓取ajax动态页面(上)
weixin_39541693的博客
11-29 140
一、分析背景:1,为什么要选择「关于嗅网创办于 2012 年 5 月,是一个聚合优质创新信息与人群的新媒体平台。2,分析内容分析嗅网 5 篇文章的基本情况,包括收藏数、评论数等;发掘最受欢迎和最不受欢迎的文章及作者;分析文章标题形式(长度、句式)与受欢迎程度之间的关系;展现近些年科技互联网行业的热门词汇3,分析工具:python3.6scrapyMongoDBMatplotlibW...
requests爬
weixin_33722405的博客
05-28 125
2019独角兽企业重金招聘Python工程师标准>>> ...
文章主要内容提取软件[基于NLP技术]
神经网络爱好者
07-26 2637
自动创建摘要的步骤如下(1)单击【工具】菜单中的【自动编写摘要】菜单项。Word就会开始自动编写摘要,要取消正在执行的摘要,可按下Esc键。命令完成后会出现如图6-41所示的【自动编写摘要】对话框。(2)在【摘要类型】下面选择文档的显示方案。(3)在【相当于原长的百分比】框中键入或选择摘要的详细程度。(4)如果要更新文档的统计信息,请选中【更新文档统计信息】复选框。自动生成目录步骤一篇文章的内容可以是纯文本格式的,但在网络盛行的当今,更多是HTML格式的。先复制要提取的区域,...
豆瓣5条影评数据集
07-04
本宝宝采集的豆瓣5条影评原始数据集,希望大家积极下载,尊重宝宝的劳动成果,后期有时间我还为大家提供数据集哈。 机器学习,nlp,深度学习的宝宝赶快看过来,看过来哈。 数据集格式: title##star##comment 电影...
基于QT5开发漂亮的串口调试助手源码+详细注释+波形分析
12-17
基于QT Creator开发的兼容QT 5.6版本的(语言C++)串口调试助手源码,界面超级漂亮、功能齐全,接收区和来显示串口消息,在调试时,可指定串口、波特率、校验位、数据位、停止位,关闭串口和清空接收区、以十六进制...
全国1:5地形地质图接图表-kml格式
03-12
全国1:5地形地质图接图表-kml格式,带有图幅号及名称。
HTML5(webSocket)版五子棋网络对战游戏
06-12
一个完全用HTML5实现的网络对战的网页游戏,通信部分采用WebSocket实现,供大家参考。(注:该程序在火狐10.0、11.0版本、谷歌15.0、17.0版本的浏览器上测试过了,其他较老版本的浏览器可能不支持WebSocket,IE内核...
华强北悦耳机开启弹窗动画nvr刷机包
最新发布
04-03
华强北悦耳机开启弹窗动画nvr刷机包
嗅网文章爬虫
05-07
嗅网文章爬虫,爬去嗅网首页的文章,并存储到mysql中。
pythonscrapy爬取嗅网文章
08-10
python scrapy爬取嗅网文章
WordPress仿嗅网
09-08
WordPress仿嗅网
wordpress主题高仿百度百家模板科技资讯自媒体网站源码
05-13
安装方法: 1、到网站下载wordpress程序。 2、解压程序压缩包得到一个wordpress命名的文件。 3、用FTP链接网站空间,并且打开根目录。 4、把wordpress文件夹里面的内容全部传输到空间根目录里面去。 5、访问域名,登录管理员账户进入后台选择外观进行安装。
主题猫仿WordPress
01-11
主题猫仿WordPress主题猫仿WordPress主题猫仿WordPress
Pyspider 使用带认证redis集群作为消息队列
08-08 350
最近使用pyspider作为调度部署一个项目,因为客户方提供需要使用redis集群作为消息队列。所以在网上搜索了好多,都说不支持redis集群。静下心来一想,这么常规的需求不应该不支持呀。本着一切都在源码中的宗旨,打开了pyspider的源码,果然让我发现了其实是支持redis集群的。但是如果redis集群需要认证的话,就不支持了。因此,需要对pyspider的代码做一个改造,让它支持redis集群带认证的方式。......
PySpider爬虫框架折腾体验
热门推荐
dabpop139的博客
04-16 1万+
PySpider爬虫框架折腾体验@(进阶)[PySpider,PySpider使用,PySpider体验]最近在看爬虫类的Python文章,了解到了PySpider这个强大的爬虫框架,就想也体验一番,这次折腾的过程可以说极其曲折、峰回路转,感觉还是有必要写下来和大家分享,同时也表示对我在折腾过程中看到的精彩文章表示感谢。过程中我了解到了PySpider爬虫框架是位牛叉的国人开发的(好吧好多人也不太关
10.4---Python入门之-爬虫-嗅网站内容解析及,及结果保存MySQL表
qingtingwhk的博客
05-18 260
""" """ import urllib.request import MySQLdb from bs4 import BeautifulSoup """ 自定义: 爬取 指定网页中,所有的新闻url地址 方法 """ def parse_index_page(url): ## 获取嗅网站首页的内容 index_page = urllib.request.urlopen(url).read().decode("utf-8") ## 解析内容 # 创建一.
python 爬虫实战(三)使用pyspider爬取新闻
JonPia的博客
03-12 1472
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-03-02 23:14:26 # Project: huxiu from pyspider.libs.base_handler import * class Handler(BaseHandler): crawl_config = { } ...
帮我找几篇GCN的文章
02-22
我可以为您推荐几篇关于GCN的文章:1.《空间关系学习:图卷积网络的演进》;2.《图卷积网络:一种新型的卷积神经网络》;3.《图卷积网络:从节点到图》;4.《图卷积网络:从场景理解到可解释AI》;5.《图卷积神经...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 马尔可夫决策过程 5309
  • 目标跟踪算法 2712
  • 爬取手机app 2583
  • Python数据可视化:2018年电影分析 2215
  • 利用层次聚类算法进行基于基站定位数据的商圈分析 1513

分类专栏

  • 转载 56篇

最新评论

  • 深入浅出ML之Tree-Based家族

    HiSecret: 文章条理很清晰,学到了

  • Python数据可视化:2018年电影分析

    PPPannnn: 可视化源代码有嘛

  • 数据挖掘领域十大经典算法之—SVM算法

    cc_want: 喔,太感谢了

  • 从最大似然到EM算法浅解

    cc_want: 喔,太感谢了

  • 决策树之ID3算法

    梦想橡皮擦: 好文章!!!!

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 卷积神经网络在物联网场景中的应用初探
  • 深度学习:卷积神经网络(CNN)简介
  • 常见的七种回归技术介绍
2019年3篇
2018年55篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

两个鬼故事国庆出生的女孩起名环保墙纸斯大林格勒战役电影双胞胎起名缺木起名用歆字有寓意吗茶叶注册商标注册起名电脑主机启动不了免费网站模板顾轻舟中文名起中英文名王盛德风暴突击队吴帝聪孩子起名字大全免费刘远吕智cctv12熊猫纪念币前度电影李姓男孩起名鸡年爱的厘米电视剧剧情介绍小说区都市校园古典偷拍office2010破解版excel分页错别字繁体字7画的字起名给男孩起宝宝小名乳名大全大全孩子起名 与五行梦见拔牙重庆猛女affect3d少年生前被连续抽血16次?多部门介入两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”淀粉肠小王子日销售额涨超10倍高中生被打伤下体休学 邯郸通报单亲妈妈陷入热恋 14岁儿子报警何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言张家界的山上“长”满了韩国人?男孩8年未见母亲被告知被遗忘中国拥有亿元资产的家庭达13.3万户19岁小伙救下5人后溺亡 多方发声315晚会后胖东来又人满为患了张立群任西安交通大学校长“重生之我在北大当嫡校长”男子被猫抓伤后确诊“猫抓病”测试车高速逃费 小米:已补缴周杰伦一审败诉网易网友洛杉矶偶遇贾玲今日春分倪萍分享减重40斤方法七年后宇文玥被薅头发捞上岸许家印被限制高消费萧美琴窜访捷克 外交部回应联合利华开始重组专访95后高颜值猪保姆胖东来员工每周单休无小长假男子被流浪猫绊倒 投喂者赔24万小米汽车超级工厂正式揭幕黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发当地回应沈阳致3死车祸车主疑毒驾恒大被罚41.75亿到底怎么缴妈妈回应孩子在校撞护栏坠楼外国人感慨凌晨的中国很安全杨倩无缘巴黎奥运校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变王树国卸任西安交大校长 师生送别手机成瘾是影响睡眠质量重要因素国产伟哥去年销售近13亿阿根廷将发行1万与2万面值的纸币兔狲“狲大娘”因病死亡遭遇山火的松茸之乡“开封王婆”爆火:促成四五十对奥巴马现身唐宁街 黑色着装引猜测考生莫言也上北大硕士复试名单了德国打算提及普京时仅用姓名天水麻辣烫把捣辣椒大爷累坏了

两个鬼故事 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化