微信標題不會取,爬取虎嗅5萬篇文章告訴你

不少時候,一篇文章能否得到廣泛的傳播,除了文章本身實打?qū)嵉馁|(zhì)量以外,一個好的標題也至關(guān)重要。本文爬取了虎嗅網(wǎng)建站至今共 5 萬條新聞標題內(nèi)容,助你找到起文章標題的技巧與靈感。同時,分享一些值得關(guān)注的文章和作者。

數(shù)據(jù)抓取、清洗、分析一條龍,感受科技互連網(wǎng)世界的千變?nèi)f化。

摘要: 不少時候,一篇文章能否得到廣泛的傳播,除了文章本身實打?qū)嵉馁|(zhì)量以外,一個好的標題也至關(guān)重要。本文爬取了虎嗅網(wǎng)建站至今共 5 萬條新聞標題內(nèi)容,助你找到起文章標題的技巧與靈感。同時,分享一些值得關(guān)注的文章和作者。

1. 分析背景

1.1. 為什么選擇虎嗅

在眾多新媒體網(wǎng)站中,「虎嗅」網(wǎng)的文章內(nèi)容和質(zhì)量還算不錯。在「新榜」科技類公眾號排名中,它位居榜單第 3 名,還是比較受歡迎的。所以選擇爬取該網(wǎng)站的文章信息,順便從中了解一下這幾年科技互聯(lián)網(wǎng)都出現(xiàn)了哪些熱點信息。

「關(guān)于虎嗅」

虎嗅網(wǎng)創(chuàng)辦于 2012 年 5 月,是一個聚合優(yōu)質(zhì)創(chuàng)新信息與人群的新媒體平臺。該平臺專注于貢獻原創(chuàng)、深度、犀利優(yōu)質(zhì)的商業(yè)資訊,圍繞創(chuàng)新創(chuàng)業(yè)的觀點進行剖析與交流?;⑿峋W(wǎng)的核心,是關(guān)注互聯(lián)網(wǎng)及傳統(tǒng)產(chǎn)業(yè)的融合、明星公司的起落軌跡、產(chǎn)業(yè)潮汐的動力與趨勢。

1.2. 分析內(nèi)容

  • 分析虎嗅網(wǎng) 5 萬篇文章的基本情況,包括收藏數(shù)、評論數(shù)等

  • 發(fā)掘最受歡迎和最不受歡迎的文章及作者

  • 分析文章標題形式(長度、句式)與受歡迎程度之間的關(guān)系

  • 展現(xiàn)近些年科技互聯(lián)網(wǎng)行業(yè)的熱門詞匯

1.3. 分析工具

  • Python

  • pyspider

  • MongoDB

  • Matplotlib

  • WordCloud

  • Jieba

2. 數(shù)據(jù)抓取

使用 pyspider 抓取了虎嗅網(wǎng)的主頁文章,文章抓取時期為 2012 年建站至 2018 年 11 月 1 日,共計約 5 萬篇文章。抓取 了 7 個字段信息:文章標題、作者、發(fā)文時間、評論數(shù)、收藏數(shù)、摘要和文章鏈接。

2.1. 目標網(wǎng)站分析

這是要爬取的 網(wǎng)頁界面,可以看到是通過 AJAX 加載的。

右鍵打開開發(fā)者工具查看翻頁規(guī)律,可以看到 URL 請求是 POST 類型,下拉到底部查看 Form Data,表單需提交參數(shù)只有 3 項。經(jīng)嘗試, 只提交 page 參數(shù)就能成功獲取頁面的信息,其他兩項參數(shù)無關(guān)緊要,所以構(gòu)造分頁爬取非常簡單。

1
2
3
huxiu_hash_code: 39bcd9c3fe9bc69a6b682343ee3f024a
page: 4
last_dateline: 1541123160

接著,切換選項卡到 Preview 和 Response 查看網(wǎng)頁內(nèi)容,可以看到數(shù)據(jù)都位于 data 字段里。total_page 為 2004,表示一共有 2004 頁的文章內(nèi)容,每一頁有 25 篇文章,總共約 5 萬篇,也就是我們要爬取的數(shù)量。

以上,我們就找到了所需內(nèi)容,接下來可以開始構(gòu)造爬蟲,整個爬取思路比較簡單。之前我們也練習過這一類 Ajax 文章的爬取,可以參考:

抓取澎湃網(wǎng)建站至今 1500 期信息圖欄目圖片

2.2. pyspider 介紹

和之前文章不同的是,這里我們使用一種新的工具來進行爬取,叫做:pyspider 框架。由國人 binux 大神開發(fā),GitHub Star 數(shù)超過 12 K,足以證明它的知名度??梢哉f,學習爬蟲不能不會使用這個框架。

網(wǎng)上關(guān)于這個框架的介紹和實操案例非常多,這里僅簡單介紹一下。

我們之前的爬蟲都是在 Sublime 、PyCharm 這種 IDE 窗口中執(zhí)行的,整個爬取過程可以說是處在黑箱中,內(nèi)部運行的些細節(jié)并不太清楚。而 pyspider 一大亮點就在于提供了一個可視化的 WebUI 界面,能夠清楚地查看爬蟲的運行情況。

pyspider 的架構(gòu)主要分為 Scheduler(調(diào)度器)、Fetcher(抓取器)、Processer(處理器)三個部分。Monitor(監(jiān)控器)對整個爬取過程進行監(jiān)控,Result Worker(結(jié)果處理器)處理最后抓取的結(jié)果。

我們看看該框架的運行流程大致是怎么樣的:

  • 一個 pyppider 爬蟲項目對應(yīng)一個 Python 腳本,腳本里定義了一個 Handler 主類。爬取時首先調(diào)用 on_start() 方法生成最初的抓取任務(wù),然后發(fā)送給 Scheduler。

  • Scheduler 將抓取任務(wù)分發(fā)給 Fetcher 進行抓取,F(xiàn)etcher 執(zhí)行然后得到 Response、隨后將 Response 發(fā)送給 Processer。

  • Processer 處理響應(yīng)并提取出新的 URL 然后生成新的抓取任務(wù),然后通過消息隊列的方式通知 Scheduler 當前抓取任務(wù)執(zhí)行情況,并將新生成的抓取任務(wù)發(fā)送給 Scheduler。如果生成了新的提取結(jié)果,則將其發(fā)送到結(jié)果隊列等待 Result Worker 處理。

  • Scheduler 接收到新的抓取任務(wù),然后查詢數(shù)據(jù)庫,判斷其如果是新的抓取任務(wù)或者是需要重試的任務(wù)就繼續(xù)進行調(diào)度,然后將其發(fā)送回 Fetcher 進行抓取。

  • 不斷重復(fù)以上工作、直到所有的任務(wù)都執(zhí)行完畢,抓取結(jié)束。

  • 抓取結(jié)束后、程序會回調(diào) on_finished() 方法,這里可以定義后處理過程。

該框架比較容易上手,網(wǎng)頁右邊是代碼區(qū),先定義類(Class)然后在里面添加爬蟲的各種方法(也可以稱為函數(shù)),運行的過程會在左上方顯示,左下方則是輸出結(jié)果的區(qū)域。

這里,分享幾個不錯的教程以供參考:

GitHub 項目地址:https://github.com/binux/pyspider

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

pyspider 中文網(wǎng):http://www.pyspider.cn/page/1.html

pyspider 爬蟲原理剖析:http://python.jobbole.com/81109/

pyspider 爬淘寶圖案例實操:https://cuiqingcai.com/2652.html

安裝好該框架后,下面我們可以就開始爬取了。

2.3. 抓取數(shù)據(jù)

CMD 命令窗口執(zhí)行:pyspider all 命令,然后瀏覽器輸入:http://localhost:5000/ 就可以啟動 pyspider 。

點擊 Create 新建一個項目,Project Name 命名為:huxiu,因為要爬取的 URL 是 POST 類型,所以這里可以先不填寫,之后可以在代碼中添加,再次點擊 Creat 便完成了該項目的新建。

新項目建立好后會自動生成一部分模板代碼,我們只需在此基礎(chǔ)上進行修改和完善,然后就可以運行爬蟲項目了。現(xiàn)在,簡單梳理下代碼編寫步驟。

1
2
3
4
5
6
7
8
9
10
11
12
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): # 先循環(huán)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、代理等設(shè)置寫在下面的 crawl_config 屬性中。(如果你還沒有習慣從函數(shù)(def)轉(zhuǎn)換到類(Class)的代碼寫法,那么需要先了解一下類的相關(guān)知識,之后我也會單獨用一篇文章介紹一下。)

下面的 on_start() 方法是程序的入口,也就是說程序啟動后會首先從這里開始運行。首先,我們將要爬取的 URL傳入 crawl() 方法,同時將 URL 修改成虎嗅網(wǎng)的:https://www.huxiu.com/v2_action/article_list。由于 URL 是 POST 請求,所以我們還需要增加兩個參數(shù):method 和 data。method 表示 HTTP 請求方式,默認是 GET,這里我們需要設(shè)置為 POST;data 是 POST 請求表單參數(shù),只需要添加一個 page 參數(shù)即可。

接著,通過 callback 參數(shù)定義一個 index_page() 方法,用來解析 crawl() 方法爬取 URL 成功后返回的 Response 響應(yīng)。在后面的 index_page() 方法中,可以使用 PyQuery 提取響應(yīng)中的所需內(nèi)容。具體提取方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 ]   # 列表生成式結(jié)果返回每頁提取出25條字典信息構(gòu)成的list
       print(data)
       return data

這里,網(wǎng)頁返回的 Response 是 json 格式,待提取的信息存放在其中的 data 鍵值中,由一段 HTML 代碼構(gòu)成。我們可以使用 response.json[‘data’] 獲取該 HTML 信息,接著使用 PyQuery 搭配 CSS 語法提取出文章標題、鏈接、作者等所需信息。這里使用了列表生成式,能夠精簡代碼并且轉(zhuǎn)換為方便的 list 格式,便于后續(xù)存儲到 MongoDB 中。我們輸出并查看一下第 2 頁的提取結(jié)果:

1
2
3
4
5
# 由25個 dict 構(gòu)成的 list
[{'title': '想要長生不老?殺死體內(nèi)的“僵尸細胞”吧', 'url': 'https://www.huxiu.com/article/270086.html', 'name': '造就Talk', 'write_time': '19小時前', 'comment': '4', 'favorites': '28', 'abstract': '如果有了最終療法,也不應(yīng)該是每天都需要接受治療'},
{'title': '日本步入下流社會,我們還在買買買', 'url': 'https://www.huxiu.com/article/270112.html', 'name': '騰訊《大家》?', 'write_time': '20小時前', 'comment': '13', 'favorites': '142', 'abstract': '我買,故我在'}
...
]

可以看到,成功得到所需數(shù)據(jù),然后就可以保存了,可以選擇輸出為 CSV、MySQL、MongoDB 等方式,這里我們選擇保存到 MongoDB 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pandas as pd
import pymongo
import time
import numpy as np
client = 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 的結(jié)果數(shù)據(jù)。這里用來接收上面 index_page() 返回的 data 數(shù)據(jù),在該方法里再定義一個存儲到 MongoDB 的方法就可以保存到 MongoDB 中。關(guān)于數(shù)據(jù)如何存儲到 MongoDB 中,我們在之前的 一篇文章 中有過介紹,如果忘記了可以回顧一下。

下面,我們來測試一下整個爬取和存儲過程。點擊左上角的 run 就可以順利運行單個網(wǎng)頁的抓取、解析和存儲,結(jié)果如下:

上面完成了單頁面的爬取,接下來,我們需要爬取全部 2000 余頁內(nèi)容。

需要修改兩個地方,首先在 on_start() 方法中將 for 循環(huán)頁數(shù) 3 改為 2002。改好以后,如果我們直接點擊 run ,會發(fā)現(xiàn)還是只能爬取第 2 頁的結(jié)果。這是因為,pyspider 以 URL的 MD5 值作為 唯一 ID 編號,ID 編號相同的話就視為同一個任務(wù),便不會再重復(fù)爬取。由于 GET 請求的 分頁URL 通常是有差異的,所以 ID 編號會不同,也就自然能夠爬取多頁。但這里 POST 請求的分頁 URL 是相同的,所以爬完第 2 頁,后面的頁數(shù)便不會再爬取。

那有沒有解決辦法呢? 當然是有的,我們需要重新寫下 ID 編號的生成方式,方法很簡單,在 on_start() 方法前面添加下面 2 行代碼即可:

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

這樣,我們再點擊 run 就能夠順利爬取 2000 頁的結(jié)果了,我這里一共抓取了 49,996 條結(jié)果,耗時 2 小時左右完成。

以上,就完成了數(shù)據(jù)的獲取。有了數(shù)據(jù)我們就可以著手分析,不過這之前還需簡單地進行一下數(shù)據(jù)的清洗、處理。

3. 數(shù)據(jù)清洗處理

首先,我們需要從 MongoDB 中讀取數(shù)據(jù),并轉(zhuǎn)換為 DataFrame。

1
2
3
4
5
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['Huxiu']
collection = db['huxiu_news']
# 將數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)為DataFrame
data = pd.DataFrame(list(collection.find()))

下面我們看一下數(shù)據(jù)的總體情況,可以看到數(shù)據(jù)的維度是 49996 行 × 8 列。發(fā)現(xiàn)多了一列無用的 _id 需刪除,同時 name 列有一些特殊符號,比如? 需刪除。另外,數(shù)據(jù)格式全部為 Object 字符串格式,需要將 comment 和 favorites 兩列更改為數(shù)值格式、 write_time 列更改為日期格式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
print(data.shape)  # 查看行數(shù)和列數(shù)
print(data.info()) # 查看總體情況
print(data.head()) # 輸出前5行

# 結(jié)果:
(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
05bdc2 “在你們看到… 2250 普象工業(yè)設(shè)計小站? 看了蘋果屌 https:// 10小時前
15bdc2 中國”綠卡”號稱“世界最難拿” 916 經(jīng)濟觀察報? 遞交材料厚 https:// 10小時前
25bdc2 鮮衣怒馬少年時 213 小馬宋 金庸小說陪 https:// 11小時前
35bdc2 預(yù)告還是預(yù)警? 310 Cuba Libre 阿里即將發(fā) https:// 11小時前
45bdc2 庫克:咋回事? 23 Cuba Libre 【虎嗅早報 https:// 11小時前

代碼實現(xiàn)如下:

1
2
3
4
5
6
7
8
9
10
# 刪除無用_id列
data.drop(['_id'],axis=1,inplace=True)
# 替換掉特殊字符?
data['name'].replace('?','',inplace=True,regex=True)
# 字符更改為數(shù)值
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'])

下面,我們看一下數(shù)據(jù)是否有重復(fù),如果有,那么需要刪除。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 判斷整行是否有重復(fù)值
print(any(data.duplicated()))
# 顯示True,表明有重復(fù)值,進一步提取出重復(fù)值數(shù)量
data_duplicated = data.duplicated().value_counts()
print(data_duplicated) # 顯示2 True ,表明有2個重復(fù)值
# 刪除重復(fù)值
data = data.drop_duplicates(keep='first')
# 刪除部分行后,index中斷,需重新設(shè)置index
data = data.reset_index(drop=True)
#結(jié)果:
True
False    49994
True         2

然后,我們再增加兩列數(shù)據(jù),一列是文章標題長度列,一列是年份列,便于后面進行分析。

1
2
3
4
5
6
7
8
9
10
11
12
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

以上,就完成了基本的數(shù)據(jù)清洗處理過程,針對這 9 列數(shù)據(jù)可以開始進行分析了。

4. 描述性數(shù)據(jù)分析

通常,數(shù)據(jù)分析主要分為四類: 「描述型分析」、「診斷型分析」「預(yù)測型分析」「規(guī)范型分析」。「描述型分析」是用來概括、表述事物整體狀況以及事物間關(guān)聯(lián)、類屬關(guān)系的統(tǒng)計方法,是這四類中最為常見的數(shù)據(jù)分析類型。通過統(tǒng)計處理可以簡潔地用幾個統(tǒng)計值來表示一組數(shù)據(jù)地集中性(如平均值、中位數(shù)和眾數(shù)等)和離散型(反映數(shù)據(jù)的波動性大小,如方差、標準差等)。

這里,我們主要進行描述性分析,數(shù)據(jù)主要為數(shù)值型數(shù)據(jù)(包括離散型變量和連續(xù)型變量)和文本數(shù)據(jù)。

4.1. 總體情況

先來看一下總體情況。

1
2
3
4
5
6
7
8
9
10
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() 方法對數(shù)值型變量進行統(tǒng)計分析。從上面可以簡要得出以下幾個結(jié)論:

  • 讀者的評論和收藏熱情都不算太高,大部分文章(75 %)的評論數(shù)量為十幾條,收藏數(shù)量不過幾十個。這和一些微信大 V 公眾號動輒百萬級閱讀、數(shù)萬級評論和收藏量相比,虎嗅網(wǎng)的確相對小眾一些。不過也正是因為小眾,也才深得部分人的喜歡。

  • 評論數(shù)最多的文章有 2376 條,收藏數(shù)最多的文章有 1113 個收藏量,說明還是有一些潛在的比較火或者質(zhì)量比較好的文章。

  • 最長的文章標題長達 224 個字,大部分文章標題長度在 20 來個字左右,所以標題最好不要太長或過短。

對于非數(shù)值型變量(name、write_time),使用 describe() 方法會產(chǎn)生另外一種匯總統(tǒng)計。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
print(data['name'].describe())
print(data['write_time'].describe())
# 結(jié)果:
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 表示唯一值數(shù)量,top 表示出現(xiàn)次數(shù)最多的變量,freq 表示該變量出現(xiàn)的次數(shù),所以可以簡單得出以下幾個結(jié)論:

  • 在文章來源方面,3162 個作者貢獻了這 5 萬篇文章,其中自家官網(wǎng)「虎嗅」寫的數(shù)量最多,超過了 1 萬篇,這也很自然。

  • 在文章發(fā)表時間方面,最早的一篇文章來自于 2012年 4 月 3 日。 6 年多時間,發(fā)文數(shù)最多的 1 天 是 2014 年 7 月 10 日,一共發(fā)了 274 篇文章。

4.2. 不同時期文章發(fā)布的數(shù)量變化

可以看到 ,以季度為時間尺度的6 年間,前幾年發(fā)文數(shù)量比較穩(wěn)定,大概在1750 篇左右,個別季度數(shù)量激增到 2000 篇以上。2016 年之后文章開始增加到 2000 篇以上,可能跟網(wǎng)站知名度提升有關(guān)。首尾兩個季度日期不全,所以數(shù)量比較少。

具體代碼實現(xiàn)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
def analysis1(data):
# # 匯總統(tǒng)計
# 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')
# 創(chuàng)建x,y軸標簽
   x = np.arange(0,len(data),1)
   ax1.plot(x,data.values, #x、y坐標
       color = color_line , #折線圖顏色為紅色
       marker = 'o',markersize = 4 #標記形狀、大小設(shè)置
       )
   ax1.set_xticks(x) # 設(shè)置x軸標簽為自然數(shù)序列
   ax1.set_xticklabels(data.index) # 更改x軸標簽值為年份
   plt.xticks(rotation=90) # 旋轉(zhuǎn)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 設(shè)置標簽格式不帶小數(shù)
# 設(shè)置標題及橫縱坐標軸標題
   plt.title('虎嗅網(wǎng)文章數(shù)量發(fā)布變化(2012-2018)',color = colors,fontsize=fontsize_title)
   plt.xlabel('時期')
   plt.ylabel('文章(篇)')
   plt.tight_layout()  # 自動控制空白邊緣
   plt.savefig('虎嗅網(wǎng)文章數(shù)量發(fā)布變化.png',dpi=200)
   plt.show()

4.3. 文章收藏量 TOP 10

接下來,到了我們比較關(guān)心的問題:幾萬篇文章里,到底哪些文章寫得比較好或者比較火?

序號titlefavoritescomment
1讀完這10本書,你就能站在智商鄙視鏈的頂端了111313
2京東打臉央視:你所謂的翻新iPhone均為正品,我們保留向警方報案的權(quán)利86710
3離職創(chuàng)業(yè)?先讀完這22本書再說8609
4貨幣如水,覆水難收78439
5自殺經(jīng)濟學778119
62016年已經(jīng)起飛的5只黑天鵝,都在羅振宇這份跨年演講全文里77439
7真正強大的商業(yè)分析能力是怎樣煉成的?74618
8騰訊沒有夢想70532
9段永平連答53問,核心是“不為清單”70327
10王健林的滑鐵盧70192

此處選取了「favorites」(收藏數(shù)量)作為衡量標準。畢竟,一般好的文章,我們都會有收藏的習慣。

第一名「讀完這10本書,你就能站在智商鄙視鏈的頂端了 」以 1113 次收藏位居第一,并且遙遙領(lǐng)先于后者,看來大家都懷有「想早日攀上人生巔峰,一覽眾人小」的想法啊。打開這篇文章的鏈接,文中提到了這幾本書:《思考,快與慢》、《思考的技術(shù)》、《麥肯錫入職第一課:讓職場新人一生受用的邏輯思考力》等。一本都沒看過,看來這輩子是很難登上人生巔峰了。

發(fā)現(xiàn)兩個有意思的地方。

第一,文章標題都比較短小精煉。

第二,文章收藏量雖然比較高,但評論數(shù)都不多,猜測這是因為 大家都喜歡做伸手黨

4.4. 歷年文章收藏量 TOP3

在了解文章的總體排名之后,我們來看看歷年的文章排名是怎樣的。這里,每年選取了收藏量最多的 3 篇文章。

yeartitlefavorites
2012產(chǎn)品的思路——來自騰訊張小龍的分享(全版)187

Fab CEO:創(chuàng)辦四家公司教給我的90件事163

張小龍:微信背后的產(chǎn)品觀162
2013創(chuàng)業(yè)者手記:我所犯的那些入門錯誤473

馬化騰三小時講話實錄:千億美金這個線,其實很恐怖391

雕爺親身談:白手起家的我如何在30歲之前賺到1000萬。讀《MBA教不了的創(chuàng)富課》354
201485后,突變的一代528

雕爺自述:什么是我做餐飲時琢磨、而大部分“外人”無法涉獵的思考?521

據(jù)說這40張PPT是螞蟻金服的內(nèi)部培訓資料……485
2015讀完這10本書,你就能站在智商鄙視鏈的頂端了1113

京東打臉央視:你所謂的翻新iPhone均為正品,我們保留向警方報案的權(quán)利867

離職創(chuàng)業(yè)?先讀完這22本書再說860
2016蝗蟲般的刷客大軍:手握千萬手機號,分秒間薅干一家平臺554

準CEO必讀的這20本書,你讀過幾本?548

運營簡史:一文讀懂互聯(lián)網(wǎng)運營的20年發(fā)展與演變503
20172016年已經(jīng)起飛的5只黑天鵝,都在羅振宇這份跨年演講全文里774

真正強大的商業(yè)分析能力是怎樣煉成的?746

王健林的滑鐵盧701
2018貨幣如水,覆水難收784

自殺經(jīng)濟學778

騰訊沒有夢想705

可以看到,文章收藏量基本是逐年遞增的,但 2015 年的 3 篇文章的收藏量卻是最高的,包攬了總排名的前 3 名,不知道這一年的文章有什么特別之處。

以上只羅列了一小部分文章的標題,可以看到標題起地都蠻有水準的。關(guān)于標題的重要性,有這樣通俗的說法:「一篇好文章,標題占一半」,一個好的標題可以大大增強文章的傳播力和吸引力。文章標題雖只有短短數(shù)十字,但要想起好,里面也是很有很多技巧的。

好在,這里提供了 5 萬個標題可以參考。如需,可以在公眾號后臺回復(fù)「虎嗅」得到這份 CSV 文件。

代碼實現(xiàn)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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']  # 設(shè)置不同的顏色
# title='虎嗅網(wǎng)歷年收藏數(shù)最多的3篇文章'
       )
   plt.xlabel('Year')
   plt.ylabel('文章收藏數(shù)量')
   plt.title('歷年 TOP3 文章收藏量比較',color = colors,fontsize=fontsize_title)
   plt.tight_layout()  # 自動控制空白邊緣,以全部顯示x軸名稱
# plt.savefig('歷年 Top3 文章收藏量比較.png',dpi=200)
   plt.show()

4.4.1. 最高產(chǎn)作者 TOP20

上面,我們從收藏量指標進行了分析,下面,我們關(guān)注一下發(fā)布文章的作者(個人/媒體)。前面提到發(fā)文最多的是虎嗅官方,有一萬多篇文章,這里我們篩除官媒,看看還有哪些比較高產(chǎn)的作者。

可以看到,前 20 名作者的發(fā)文量差距都不太大。發(fā)文比較多的有「娛樂資本論」、「Eastland」、「發(fā)條橙子」這類媒體號;也有虎嗅官網(wǎng)團隊的作者:發(fā)條橙子、周超臣、張博文等;還有部分獨立作者:假裝FBI、孫永杰等??梢試L試關(guān)注一下這些高產(chǎn)作者。

代碼實現(xiàn)如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
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('文章數(shù)量')
   plt.ylabel('作者')
   plt.title('發(fā)文數(shù)量最多的 TOP20 作者',color = colors,fontsize=fontsize_title)
   plt.tight_layout()
   plt.savefig('發(fā)文數(shù)量最多的TOP20作者.png',dpi=200)
   plt.show()

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

我們關(guān)注一個作者除了是因為文章高產(chǎn)以外,可能更看重的是其文章水準。這里我們選擇「文章平均收藏量」(總收藏量/文章數(shù))這個指標,來看看文章水準比較高的作者是哪些人。

這里,為了避免出現(xiàn)「某作者只寫了一篇高收藏率的文章」這種不能代表其真實水準的情況,我們將篩選范圍定在至少發(fā)布過 5 篇文章的作者們。

nametotal_favoritesariticls_numavg_favorites
重讀19476324
樓臺23028287
彭縈24879276
曹山石11875237
飯統(tǒng)戴老板787036218
筆記俠15868198
辯手李慕陽1198962193
李錄237013182
高曉松8895177
寧南山282716176

可以看到,前 10 名作者包括:遙遙領(lǐng)先的 重讀、兩位高產(chǎn)又有質(zhì)量的 辯手李慕陽 和 飯統(tǒng)戴老板 ,還有大眾比較熟悉的 高曉松、寧南山 等。

如果你將這份名單和上面那份高產(chǎn)作者名單進行對比,會發(fā)現(xiàn)他們沒有出現(xiàn)在這個名單中。相比于數(shù)量,質(zhì)量可能更重要吧。

下面,我們就來看看排名第一的 重讀 都寫了哪些高收藏量文章。

ordertitlefavoriteswrite_time
1我采訪出200多萬字素材,還原了阿里系崛起前傳2312018/10/31
2阿里史上最強人事地震回顧:中供鐵軍何以被生生解體4942018/4/9
3馬云“斬”衛(wèi)哲:復(fù)原阿里史上最震撼的人事地震5782018/3/15
4重讀一場馬云發(fā)起、針對衛(wèi)哲的批斗會2692017/8/31
5阿里“中供系”前世今生:馬云麾下最神秘的子弟兵2032017/5/10
6揭秘馬云麾下最神秘的子弟兵:阿里“中供系”的前世今生1722017/4/26

居然寫的都是清一色關(guān)于馬老板家的文章。

了解了前十名作者之后,我們順便也看看那些處于最后十名的都是哪些作者。

nametotal_favoritesariticls_numavg_favorites
于斌25112
朝克圖33231
東風日產(chǎn)24131
董曉常1481
蔡鈺31161
馬繼華12111
angeljie751
薛開元661
pookylee15240
Yang Yemeng070

一對比,就能看到他們的文章收藏量就比較寒磣了。尤其好奇最后一位作者 Yang Yemeng ,他寫了 7 篇文章,竟然一個收藏都沒有。

來看看他究竟寫了些什么文章。

原來寫的全都是英文文章,看來大家并不太鐘意閱讀英文類的文章啊。

具體實現(xiàn)代碼:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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')]
# 平均收藏數(shù)取整
# 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']
# 篩選出文章數(shù)至少5篇的
   data=data.query('ariticls_num > 4')
   data = data.sort_values(by=['avg_favorites'],ascending=False)
# # 查看平均收藏率第一名詳情
# data = data.query('name == "重讀"')
# # 查看平均收藏率倒數(shù)第一名詳情
# data = data.query('name == "Yang Yemeng"')
# print(data[['title','favorites','write_time']])
   print(data[:10]) # 前10名
   print(data[-10:]) # 后10名

4.5. 文章評論數(shù)最多 TOP10

說完了收藏量。下面,我們再來看看評論數(shù)量最多的文章是哪些。

ordertitlecommentfavorites
1喜瓜2.0—明星社交應(yīng)用的中國式引進與創(chuàng)新23763
2百度,請給“兒子們”好好起個名字12979
3三星S5為什么對鳳凰新聞客戶端下注?11571
4三星Tab S:馬是什么樣的馬?鞍又是什么樣的鞍?9510
5三星,正在重塑你的營銷觀9141
6馬化騰,你就把微信賣給運營商得了!74320
7【文字直播】羅永浩 VS 王自如 網(wǎng)絡(luò)公開辯論71133
8看三星Hub如何推動數(shù)字內(nèi)容消費變革6841
9三星要重新定義軟件與內(nèi)容商店新模式,SO?6700
10三星Hub——數(shù)字內(nèi)容交互新模式6110

基本上都是和 三星 有關(guān)的文章,這些文章大多來自 2014 年,那幾年 三星 好像是挺火的,不過這兩年國內(nèi)基本上都見不到三星的影子了,世界變化真快。

發(fā)現(xiàn)了兩個有意思的現(xiàn)象。

第一,上面關(guān)于 三星 和前面 阿里 的這些批量文章,它們「霸占」了評論和收藏榜,結(jié)合知乎上曾經(jīng)的一篇關(guān)于介紹虎嗅這個網(wǎng)站的文章:虎嗅網(wǎng)其實是這樣的 ,貌似能發(fā)現(xiàn)些微妙的事情。

第二,這些文章評論數(shù)和收藏數(shù)兩個指標幾乎呈極端趨勢,評論量多的文章收藏量卻很少,評論量少的文章收藏量卻很多。

我們進一步觀察下這兩個參數(shù)的關(guān)系。

可以看到,大多數(shù)點都位于左下角,意味著這些文章收藏量和評論數(shù)都比較低。但也存在少部分位于上方和右側(cè)的異常值,表明這些文章呈現(xiàn) 「多評論、少收藏」或者「少評論、多收藏」的特點。

4.6. 文章標題長度

下面,我們再來看看文章標題的長度和收藏量之間有沒有什么關(guān)系。

大致可以看出兩點現(xiàn)象:

第一,收藏量高的文章,他們的標題都比較短(右側(cè)的部分散點)。

第二,標題很長的文章,它們的收藏量都非常低(左邊形成了一條垂直線)。

看來,文章起標題時最好不要起太長的。

實現(xiàn)代碼如下:

1
2
3
4
5
6
7
8
9
10
11
def analysis5(data):
   plt.scatter(
       x=data['favorites'],
       y =data['comment'],
       s=data['title_length']/2,
       )
   plt.xlabel('文章收藏量')
   plt.ylabel('文章評論數(shù)')
   plt.title('文章標題長度與收藏量和評論數(shù)之間的關(guān)系',color = colors,fontsize=fontsize_title)
   plt.tight_layout()
   plt.show()

文章標題形式

下面,我們看看作者在起文章標題的時候,在標點符號方面有沒有什么偏好。

可以看到,五萬篇文章中,大多數(shù)文章的標題是陳述性標題。三分之一(34.8%) 的文章標題使用了問號「?」,而僅有 5% 的文章用了嘆號「!」。通常,問號會讓人們產(chǎn)生好奇,從而想去點開文章;而嘆號則會帶來一種緊張或者壓迫感,使人不太想去點開。所以,可以嘗試多用問號而少用嘆號。

4.7. 文本分析

最后,我們從這 5 萬篇文章中的標題和摘要中,來看看虎嗅網(wǎng)的文章主要關(guān)注的都是哪些主題領(lǐng)域。

這里首先運用了 jieba 分詞包對標題進行了分詞,然后用 WordCloud 做成了詞云圖,因虎嗅網(wǎng)含有「虎」字,故選取了一張老虎頭像。(關(guān)于 jieba 和 WordCloud 兩個包,之后再詳細介紹)

可以看到文章的主題內(nèi)容側(cè)重于:互聯(lián)網(wǎng)、知名公司、電商、投資這些領(lǐng)域。這和網(wǎng)站本身對外宣傳的核心內(nèi)容,即「關(guān)注互聯(lián)網(wǎng)與移動互聯(lián)網(wǎng)一系列明星公司的起落軌跡、產(chǎn)業(yè)潮汐的動力與趨勢,以及互聯(lián)網(wǎng)與移動互聯(lián)網(wǎng)如何改造傳統(tǒng)產(chǎn)業(yè)」大致相符合。

實現(xiàn)代碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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:\Windows\Fonts\SourceHanSansCN-Regular.otf'  # 思源黑字體

# 添加stopswords
   stopwords = set()
# 先運行對text進行詞頻統(tǒng)計再排序,再選擇要增加的停用詞
   stopwords.update(['如何','怎么','一個','什么','為什么','還是','我們','為何','可能','不是','沒有','哪些','成為','可以','背后','到底','就是','這么','不要','怎樣','為了','能否','你們','還有','這樣','這個','真的','那些'])
   wc = WordCloud(
       background_color = 'black',
       font_path = font_path,
       mask = background_Image,
       stopwords = stopwords,
       max_words = 2000,
       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()

上面的關(guān)鍵詞是這幾年總體的概況,而科技互聯(lián)網(wǎng)行業(yè)每年的發(fā)展都是不同的,所以,我們再來看看歷年的一些關(guān)鍵詞,透過這些關(guān)鍵詞看看這幾年互聯(lián)網(wǎng)行業(yè)、科技熱點、知名公司都有些什么不同變化。

可以看到每年的關(guān)鍵詞都有一些相同之處,但也不同的地方:

  • 中國互聯(lián)網(wǎng)、公司、蘋果、騰訊、阿里等這些熱門關(guān)鍵詞一直都是熱門,這幾家公司真是穩(wěn)地一批啊。

  • 每年會有新熱點涌現(xiàn):比如 2013 年的微信(剛開始火)、2016 年的直播(各大直播平臺如雨后春筍般出現(xiàn))、2017年的 iPhone(上市十周年)、2018年的小米(上市)。

  • 不斷有新的熱門技術(shù)出現(xiàn):2013 - 2015 年的 O2O、2016 年的 VR、2017 年的 AI 、2018 年的「區(qū)塊鏈」。這些科技前沿技術(shù)也是這幾年大家口耳相傳的熱門詞匯。

通過這一幅圖,就看出了這幾年科技互聯(lián)網(wǎng)行業(yè)、明星公司、熱點信息的風云變化。

5. 小結(jié)

  • 本文簡要分析了虎嗅網(wǎng) 5 萬篇文章信息,大致了解了近些年科技互聯(lián)網(wǎng)的千變?nèi)f化。

  • 發(fā)掘了那些優(yōu)秀的文章和作者,能夠節(jié)省寶貴的時間成本。

  • 一篇文章要想傳播廣泛,文章本身的質(zhì)量和標題各占一半,文中的5 萬個標題相信能夠帶來一些靈感。

  • 本文尚未做深入的文本挖掘,而文本挖掘可能比數(shù)據(jù)挖掘涵蓋的信息量更大,更有價值。進行這些分析需要機器學習和深度學習的知識,待后期學習后再來補充。



END



想要了解更多關(guān)于用戶運營的干貨知識,請繼續(xù)關(guān)注135編輯器


文章申明:本文章轉(zhuǎn)載自互聯(lián)網(wǎng)公開渠道,如有侵權(quán)請聯(lián)系我們刪除
文章評價
登錄后可以評論
立即登錄
比格設(shè)計
熱門工具
135編輯器
領(lǐng)先的在線圖文編輯平臺原創(chuàng)樣式素材,一鍵套用
筆格設(shè)計
受歡迎的在線作圖網(wǎng)站,新媒體配圖、手機海報應(yīng)有盡有
筆格PPT
輸入主題,AI一鍵生成PPT;上傳本地文件秒變PPT
管小助
企業(yè)營銷、私域流量運營——站式營銷管理平臺
推薦文章
用戶運營平臺產(chǎn)品設(shè)計指南
淺談用戶運營中的用戶分層
內(nèi)容運營:戴上寫作的六頂思考帽
5000字方法論:4個細節(jié),決定私域能不能賺錢
一個案例說明白用戶分析怎么用
22條視頻,漲粉12.6萬,一個女孩子在抖音靠洗車也能月入過萬!
高價值社群的5大核心關(guān)鍵
抖音賬號內(nèi)容自檢清單!
決定離職后,3天拿到offer的總結(jié)與反思!
【135早資訊】:教育部將徹查教材插圖問題;抖音6月1日起將對本地生活商家收取服務(wù)費
熱門素材樣式
運營導航
運營工具
分享到