1. 程式人生 > >科技網際網路都有啥熱點資訊?爬取虎嗅5萬篇文章告訴你

科技網際網路都有啥熱點資訊?爬取虎嗅5萬篇文章告訴你

歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!

對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交流群,資料愛好者們都在這兒。

作者:蘇克1900

公眾號:第2大腦

摘要:不少時候,一篇文章能否得到廣泛的傳播,除了文章本身實打實的質量以外,一個好的標題也至關重要。本文爬取了虎嗅網建站至今共 5 萬條新聞標題內容,助你找到起文章標題的技巧與靈感。同時,分享一些值得關注的文章和作者。

寫在前面:由於文中有一些超連結,無法在公眾號開啟,建議點選底部「閱讀原文」或者複製下面的部落格連結到瀏覽器開啟,體驗更好。

https://www.makcyun.top/

1. 分析背景

1.1. 為什麼選擇「虎嗅」

在眾多新媒體網站中,「虎嗅」網的文章內容和質量還算不錯。在「新榜」科技類公眾號排名中,它位居榜單第 3 名,還是比較受歡迎的。所以選擇爬取該網站的文章資訊,順便從中瞭解一下這幾年科技網際網路都出現了哪些熱點資訊。

3901436-71c0086b401dac1a

「關於虎嗅」

虎嗅網創辦於 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 載入的。

3901436-8a4141af878238cb 3901436-07f96fc9ba771e81

右鍵開啟開發者工具檢視翻頁規律,可以看到 URL 請求是 POST 型別,下拉到底部檢視 Form Data,表單需提交引數只有 3 項。經嘗試, 只提交 page 引數就能成功獲取頁面的資訊,其他兩項引數無關緊要,所以構造分頁爬取非常簡單。

1huxiu_hash_code:39bcd9c3fe9bc69a6b682343ee3f024a

2page:4

3last_dateline:1541123160

接著,切換選項卡到 Preview 和 Response 檢視網頁內容,可以看到資料都位於 data 欄位裡。total_page 為 2004,表示一共有 2004 頁的文章內容,每一頁有 25 篇文章,總共約 5 萬篇,也就是我們要爬取的數量。

3901436-e70a17b0e1fb0464

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

2.2. pyspider 介紹

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

網上關於這個框架的介紹和實操案例非常多,這裡僅簡單介紹一下。

我們之前的爬蟲都是在 Sublime 、PyCharm 這種 IDE 視窗中執行的,整個爬取過程可以說是處在黑箱中,內部執行的些細節並不太清楚。而 pyspider 一大亮點就在於提供了一個視覺化的 WebUI 介面,能夠清楚地檢視爬蟲的執行情況。

3901436-2e62a00a7883a527

pyspider 的架構主要分為 Scheduler(排程器)、Fetcher(抓取器)、Processer(處理器)三個部分。Monitor(監控器)對整個爬取過程進行監控,Result Worker(結果處理器)處理最後抓取的結果。

3901436-10d502f2d209f119

該框架比較容易上手,網頁右邊是程式碼區,先定義類(Class)然後在裡面新增爬蟲的各種方法(也可以稱為函式),執行的過程會在左上方顯示,左下方則是輸出結果的區域。

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

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

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

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

安裝好該框架並大概瞭解用法後,下面我們可以就開始爬取了。

2.3. 抓取資料

CMD 命令視窗執行:pyspider all 命令,然後瀏覽器輸入:http://localhost:5000/ 就可以啟動 pyspider 。

點選 Create 新建一個專案,Project Name 命名為:huxiu,因為要爬取的 URL 是 POST 型別,所以這裡可以先不填寫,之後可以在程式碼中新增,再次點選 Creat 便完成了該專案的新建。

3901436-a3508c2c9fdb1339

新專案建立好後會自動生成一部分模板程式碼,我們只需在此基礎上進行修改和完善,然後就可以執行爬蟲專案了。現在,簡單梳理下程式碼編寫步驟。

3901436-3d761fab22a6c8da

1frompyspider.libs.base_handlerimport*

2classHandler(BaseHandler):

3crawl_config:{

4"headers":{

5'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36',

6'X-Requested-With':'XMLHttpRequest'

7}

8}

9defon_start(self):

10forpageinrange(2,3):# 先迴圈1頁

11print('正在爬取第 %s 頁'% page)

12self.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 提取響應中的所需內容。具體提取方法如下:

1importjson

2frompyqueryimportPyQueryaspq

3defindex_page(self, response):

4content = response.json['data']

5# 注意,在sublime中,json後面需要新增(),pyspider 中則不用

6doc = pq(content)

7lis = doc('.mod-art').items()

8data = [{

9'title': item('.msubstr-row2').text(),

10'url':'https://www.huxiu.com'+ str(item('.msubstr-row2').attr('href')),

11'name': item('.author-name').text(),

12'write_time':item('.time').text(),

13'comment':item('.icon-cmt+ em').text(),

14'favorites':item('.icon-fvr+ em').text(),

15'abstract':item('.mob-sub').text()

16}foriteminlis ]# 列表生成式結果返回每頁提取出25條字典資訊構成的list

17print(data)

18returndata

這裡,網頁返回的 Response 是 json 格式,待提取的資訊存放在其中的 data 鍵值中,由一段 HTML 程式碼構成。我們可以使用 response.json['data'] 獲取該 HTML 資訊,接著使用 PyQuery 搭配 CSS 語法提取出文章標題、連結、作者等所需資訊。這裡使用了列表生成式,能夠精簡程式碼並且轉換為方便的 list 格式,便於後續儲存到 MongoDB 中。

我們輸出並檢視一下第 2 頁的提取結果:

1# 由25個 dict 構成的 list

2[{'title':'想要長生不老?殺死體內的“殭屍細胞”吧','url':'https://www.huxiu.com/article/270086.html','name':'造就Talk','write_time':'19小時前','comment':'4','favorites':'28','abstract':'如果有了最終療法,也不應該是每天都需要接受治療'},

3{'title':'日本步入下流社會,我們還在買買買','url':'https://www.huxiu.com/article/270112.html','name':'騰訊《大家》©','write_time':'20小時前','comment':'13','favorites':'142','abstract':'我買,故我在'}

4...

5]

可以看到,成功得到所需資料,然後就可以儲存了,可以選擇輸出為 CSV、MySQL、MongoDB 等方式,這裡我們選擇儲存到  MongoDB 中。

1importpandasaspd

2importpymongo

3importtime

4importnumpyasnp

5client = pymongo.MongoClient('localhost',27017)

6db = client.Huxiu

7mongo_collection = db.huxiu_news

8

9defon_result(self,result):

10ifresult:

11self.save_to_mongo(result)

12defsave_to_mongo(self,result):

13df = pd.DataFrame(result)

14#print(df)

15content = json.loads(df.T.to_json()).values()

16ifmongo_collection.insert_many(content):

17print('儲存到 mongondb 成功')

18# 隨機暫停

19sleep = np.random.randint(1,5)

20time.sleep(sleep)

上面,定義了一個 on_result() 方法,該方法專門用來獲取 return 的結果資料。這裡用來接收上面 index_page() 返回的 data 資料,在該方法裡再定義一個儲存到 MongoDB 的方法就可以儲存到 MongoDB 中。

關於資料如何儲存到 MongoDB 中,我們在之前的一篇文章中有過介紹,如果忘記了可以回顧一下。

下面,我們來測試一下整個爬取和儲存過程。點選左上角的 run 就可以順利執行單個網頁的抓取、解析和儲存,結果如下:

3901436-f0bb536d4729928a

上面完成了單頁面的爬取,接下來,我們需要爬取全部 2000 餘頁內容。

需要修改兩個地方,首先在 on_start() 方法中將 for 迴圈頁數 3 改為 2002。改好以後,如果我們直接點選 run ,會發現還是隻能爬取第 2 頁的結果。

這是因為,pyspider 以 URL的 MD5 值作為 唯一 ID 編號,ID 編號相同的話就視為同一個任務,便不會再重複爬取。由於 GET 請求的 分頁URL 通常是有差異的,所以 ID 編號會不同,也就自然能夠爬取多頁。但這裡 POST 請求的分頁 URL 是相同的,所以爬完第 2 頁,後面的頁數便不會再爬取。

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

1defget_taskid(self,task):

2returnmd5string(task['url']+json.dumps(task['fetch'].get('data','')))

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

3901436-d21947024704be21

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

3. 資料清洗處理

首先,我們需要從 MongoDB 中讀取資料,並轉換為 DataFrame。

1client = pymongo.MongoClient(host='localhost', port=27017)

2db = client['Huxiu']

3collection = db['huxiu_news']

4# 將資料庫資料轉為DataFrame

5data = pd.DataFrame(list(collection.find()))

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

1print(data.shape)# 檢視行數和列數

2print(data.info())# 檢視總體情況

3print(data.head())# 輸出前5行

4

5# 結果:

6(49996,8)

7Data columns (total8columns):

8_id49996non-null object

9abstract49996non-null object

10comment49996non-null object

11favorites49996non-null object

12name49996non-null object

13title49996non-null object

14url49996non-null object

15write_time49996non-null object

16dtypes: object(8)

17

18_id abstract    comment favorites   name    title   url write_time

1905bdc2   “在你們看到…2250普象工業設計小站©   看了蘋果屌   https://10小時前

2015bdc2   中國”綠卡”號稱“世界最難拿”916經濟觀察報©  遞交材料厚   https://10小時前

2125bdc2   鮮衣怒馬少年時213小馬宋 金庸小說陪   https://11小時前

2235bdc2   預告還是預警?310Cuba Libre  阿里即將發   https://11小時前

2345bdc2   庫克:咋回事?23Cuba Libre  【虎嗅早報   https://11小時前

程式碼實現如下:

1# 刪除無用_id列

2data.drop(['_id'],axis=1,inplace=True)

3# 替換掉特殊字元©

4data['name'].replace('©','',inplace=True,regex=True)

5# 字元更改為數值

6data = data.apply(pd.to_numeric,errors='ignore')

7# 更該日期格式

8data['write_time'] = data['write_time'].replace('.*前','2018-10-31',regex=True)

9# 為了方便,將write_time列,包含幾小時前和幾天前的行,都替換為10月31日最後1天。

10data['write_time'] = pd.to_datetime(data['write_time'])

下面,我們看一下資料是否有重複,如果有,那麼需要刪除。

1# 判斷整行是否有重複值

2print(any(data.duplicated()))

3# 顯示True,表明有重複值,進一步提取出重複值數量

4data_duplicated = data.duplicated().value_counts()

5print(data_duplicated)# 顯示2 True ,表明有2個重複值

6# 刪除重複值

7data = data.drop_duplicates(keep='first')

8# 刪除部分行後,index中斷,需重新設定index

9data = data.reset_index(drop=True)

10#結果:

11True

12False49994

13True2

然後,我們再增加兩列資料,一列是文章標題長度列,一列是年份列,便於後面進行分析。

1data['title_length'] = data['title'].apply(len)

2data['year'] = data['write_time'].dt.year

3Data columns (total9columns):

4abstract49994non-null object

5comment49994non-null int64

6favorites49994non-null int64

7name49994non-null object

8title49994non-null object

9url49994non-null object

10write_time49994non-null datetime64[ns]

11title_length49994non-null int64

12year49994non-null int64

以上,就完成了基本的資料清洗處理過程,針對這 9 列資料可以開始進行分析了。

4. 描述性資料分析

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

這裡,我們主要進行描述性分析,資料主要為數值型資料(包括離散型變數和連續型變數)和文字資料。

4.1. 總體情況

先來看一下總體情況。

1print(data.describe())

2comment     favorites  title_length

3count49994.00000049994.00000049994.000000

4mean10.86020334.08181022.775333

5std24.08596948.2762139.540142

6min0.0000000.0000001.000000

725%3.0000009.00000017.000000

850%6.00000019.00000022.000000

975%12.00000040.00000028.000000

10max2376.0000001113.000000224.000000

這裡,使用了 data.describe() 方法對數值型變數進行統計分析。從上面可以簡要得出以下幾個結論:

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

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

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

對於非數值型變數(name、write_time),使用 describe() 方法會產生另外一種彙總統計。

1print(data['name'].describe())

2print(data['write_time'].describe())

3# 結果:

4count49994

5unique3162

6top          虎嗅

7freq10513

8Name: name, dtype: object

9count49994

10unique2397

11top2014-07-1000:00:00

12freq274

13first2012-04-0300:00:00

14last2018-10-3100:00:00

unique 表示唯一值數量,top 表示出現次數最多的變數,freq 表示該變量出現的次數,所以可以簡單得出以下幾個結論:

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

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

4.2. 不同時期文章釋出的數量變化

3901436-e8eae27909cf385a

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

具體程式碼實現如下:

1defanalysis1(data):

2# # 彙總統計

3# print(data.describe())

4# print(data['name'].describe())

5# print(data['write_time'].describe())

6

7data.set_index(data['write_time'],inplace=True)

8data = data.resample('Q').count()['name']# 以季度彙總

9data = data.to_period('Q')

10# 建立x,y軸標籤

11x = np.arange(0,len(data),1)

12ax1.plot(x,data.values,#x、y座標

13color = color_line ,#折線圖顏色為紅色

14marker ='o',markersize =4#標記形狀、大小設定

15)

16ax1.set_xticks(x)# 設定x軸標籤為自然數序列

17ax1.set_xticklabels(data.index)# 更改x軸標籤值為年份

18plt.xticks(rotation=90)# 旋轉90度,不至太擁擠

19

20forx,yinzip(x,data.values):

21plt.text(x,y +10,'%.0f'%y,ha ='center',color = colors,fontsize=fontsize_text )

22# '%.0f' %y 設定標籤格式不帶小數

23# 設定標題及橫縱座標軸標題

24plt.title('虎嗅網文章數量釋出變化(2012-2018)',color = colors,fontsize=fontsize_title)

25plt.xlabel('時期')

26plt.ylabel('文章(篇)')

27plt.tight_layout()# 自動控制空白邊緣

28plt.savefig('虎嗅網文章數量釋出變化.png',dpi=200)

29plt.show()

4.3. 文章收藏量 TOP10

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

3901436-4d1e3b130d473140

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

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

發現兩個有意思的地方:

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

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

4.4. 歷年文章收藏量 TOP3

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

3901436-1e5ebad47ad6557b 3901436-6fa2f54e3a0fac3c

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

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

好在,這裡提供了 5 萬個標題可供參考。如需,可以在公眾號後臺回覆「虎嗅」得到這份 CSV 檔案。

程式碼實現如下:

1defanalysis2(data):

2# # 總收藏排名

3# top = data.sort_values(['favorites'],ascending = False)

4# # 收藏前10

5# top.index = (range(1,len(top.index)+1)) # 重置index,並從1開始編號

6# print(top[:10][['title','favorites','comment']])

7

8# 按年份排名

9# # 增加一列年份列

10# data['year'] = data['write_time'].dt.year

11deftopn(data):

12top = data.sort_values('favorites',ascending=False)

13returntop[:3]

14data = data.groupby(by=['year']).apply(topn)

15print(data[['title','favorites']])

16# 增加每年top123列,列依次值為1、2、3

17data['add'] =1# 輔助

18data['top'] = data.groupby(by='year')['add'].cumsum()

19data_reshape = data.pivot_table(index='year',columns='top',values='favorites').reset_index()

20# print(data_reshape)  # ok

21data_reshape.plot(

22# x='year',

23y=[1,2,3],

24kind='bar',

25width=0.3,

26color=['#1362A3','#3297EA','#8EC6F5']# 設定不同的顏色

27# title='虎嗅網歷年收藏數最多的3篇文章'

28)

29plt.xlabel('Year')

30plt.ylabel('文章收藏數量')

31plt.title('歷年 TOP3 文章收藏量比較',color = colors,fontsize=fontsize_title)

32plt.tight_layout()# 自動控制空白邊緣,以全部顯示x軸名稱

33# plt.savefig('歷年 Top3 文章收藏量比較.png',dpi=200)

34plt.show()

4.4.1. 最高產作者 TOP20

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

3901436-a2756bbc4637903b

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

程式碼實現如下:

1defanalysis3(data):

2data = data.groupby(data['name'])['title'].count()

3data = data.sort_values(ascending=False)

4# pandas 直接繪製,.invert_yaxis()顛倒順序

5data[1:21].plot(kind='barh',color=color_line).invert_yaxis()

6fory,xinenumerate(list(data[1:21].values)):

7plt.text(x+12,y+0.2,'%s'%round(x,1),ha='center',color=colors)

8plt.xlabel('文章數量')

9plt.ylabel('作者')

10plt.title('發文數量最多的 TOP20 作者',color = colors,fontsize=fontsize_title)

11plt.tight_layout()

12plt.savefig('發文數量最多的TOP20作者.png',dpi=200)

13plt.show()

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

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

這裡,為了避免出現「某作者只寫了一篇高收藏率的文章」這種不能代表其真實水準的情況,我們將篩選範圍定在至少釋出過 5 篇文章的作者們。

3901436-89c9a924d8ce5bef

可以看到,前 10 名作者包括:遙遙領先的重讀、兩位高產又有質量的辯手李慕陽飯統戴老闆,還有大眾比較熟悉的高曉鬆寧南山等。

如果你將這份名單和上面那份高產作者名單進行對比,會發現他們沒有出現在這個名單中。相比於數量,質量可能更重要吧。

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

3901436-95c3df0cae22a9b3

居然寫的都是清一色關於馬老闆家的文章。

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

3901436-c04545d4cff16cff

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

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

3901436-f114ef1b6b7177ec

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

具體實現程式碼:

1defanalysis4(data):

2data = pd.pivot_table(data,values=['favorites'],index='name',aggfunc=[np.sum,np.size])

3data['avg'] = data[('sum','favorites')]/data[('size','favorites')]

4# 平均收藏數取整

5# data['avg'] = data['avg'].round(decimals=1)

6data['avg'] = data['avg'].astype('int')

7# flatten 平鋪列

8data.columns = data.columns.get_level_values(0)

9data.columns = ['total_favorites','ariticls_num','avg_favorites']

10# 篩選出文章數至少5篇的

11data=data.query('ariticls_num > 4')

12data = data.sort_values(by=['avg_favorites'],ascending=False)

13# # 檢視平均收藏率第一名詳情

14# data = data.query('name == "重讀"')

15# # 檢視平均收藏率倒數第一名詳情

16# data = data.query('name == "Yang Yemeng"')

17# print(data[['title','favorites','write_time']])

18print(data[:10])# 前10名

19print(data[-10:])# 後10名

4.5. 文章評論數最多 TOP10

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

3901436-f0f3754fbaba625f

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

發現了兩個有意思的現象。

第一,上面關於三星和前面阿里的這些批量文章,它們「霸佔」了評論和收藏榜,結合知乎上曾經的一篇關於介紹虎嗅這個網站的文章:虎嗅網其實是這樣的 ,貌似能發現些微妙的事情

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

我們進一步觀察下這兩個引數的關係。

3901436-21e5794242149a07

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

4.6. 文章標題長度

下面,我們再來看看文章標題的長度和收藏量之間有沒有什麼關係。

3901436-4b0e94e520a6dfc2

大致可以看出兩點現象:

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

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

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

實現程式碼如下:

1defanalysis5(data):

2plt.scatter(

3x=data['favorites'],

4y =data['comment'],

5s=data['title_length']/2,

6)

7plt.xlabel('文章收藏量')

8plt.ylabel('文章評論數')

9plt.title('文章標題長度與收藏量和評論數之間的關係',color = colors,fontsize=fontsize_title)

10plt.tight_layout()

11plt.show()

4.7. 標題形式

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

3901436-6c11c00cb78b3f73

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

4.8. 文字分析

最後,我們從這 5 萬篇文章中的標題和摘要中,來看看虎嗅網的文章主要關注的都是哪些主題領域。

這裡首先運用了 jieba 分詞包對標題進行了分詞,然後用 WordCloud 做成了詞雲圖,因虎嗅網含有「虎」字,故選取了一張老虎頭像。(關於 jieba 和 WordCloud 兩個包,之後再詳細介紹)

3901436-7b7330c89e090dff

可以看到文章的主題內容側重於:網際網路、知名公司、電商、投資這些領域。這和網站本身對外宣傳的核心內容,即「關注網際網路與移動網際網路一系列明星公司的起落軌跡、產業潮汐的動力與趨勢,以及網際網路與移動網際網路如何改造傳統產業」大致相符合。

實現程式碼如下:

1defanalysis6(data):

2text=''

3foriindata['title'].values:

4symbol_to_replace ='[!"#$%&\'()*+,-./:;<=>[email protected],。?★、…【】《》?“”‘’![\\]^_`{|}~]+'

5i = re.sub(symbol_to_replace,'',i)

6text+=' '.join(jieba.cut(i,cut_all=False))

7d = path.dirname(__file__)if"__file__"inlocals()elseos.getcwd()

8

9background_Image = np.array(Image.open(path.join(d,"tiger.png")))

10font_path ='C:\Windows\Fonts\SourceHanSansCN-Regular.otf'# 思源黑字型

11

12# 新增stopswords

13stopwords = set()

14# 先執行對text進行詞頻統計再排序,再選擇要增加的停用詞

15stopwords.update(['如何','怎麼','一個','什麼','為什麼','還是','我們','為何','可能','不是','沒有','哪些','成為','可以','背後','到底','就是','這麼','不要','怎樣','為了','能否','你們','還有','這樣','這個','真的','那些'])

16wc = WordCloud(

17background_color ='black',

18font_path = font_path,

19mask = background_Image,

20stopwords = stopwords,

21max_words =200,

22margin =2,

23max_font_size =100,

24random_state =42,

25scale =2,

26)

27wc.generate_from_text(text)

28process_word = WordCloud.process_text(wc, text)

29# 下面是字典排序

30sort = sorted(process_word.items(),key=lambdae:e[1],reverse=True)# sort為list

31print(sort[:50])# 輸出前詞頻最高的前50個,然後篩選出不需要的stopwords,新增到前面的stopwords.update()方法中

32img_colors = ImageColorGenerator(background_Image)

33wc.recolor(color_func=img_colors)# 顏色跟隨圖片顏色

34plt.imshow(wc,interpolation='bilinear')

35plt.axis('off')

36plt.tight_layout()# 自動控制空白邊緣

37plt.savefig('huxiu20.png',dpi=200)

38plt.show()

上面的關鍵詞是這幾年總體的概況,而科技網際網路行業每年的發展都是不同的,所以,我們再來看看歷年的一些關鍵詞,透過這些關鍵詞看看這幾年網際網路行業、科技熱點、知名公司都有些什麼不同變化。

3901436-c0a43d6f4b0bc599

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

中國網際網路、公司、蘋果、騰訊、阿里等這些熱門關鍵詞一直都是熱門,這幾家公司真是穩地一批啊。

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

不斷有新的熱門技術出現:2013 - 2015 年的 O2O、2016 年的 VR、2017 年的 AI 、2018 年的「區塊鏈」。這些科技前沿技術也是這幾年大家口耳相傳的熱門詞彙。

通過這一幅圖,就看出了這幾年科技網際網路行業、明星公司、熱點資訊的風雲變化。

5. 小結

本文簡要分析了虎嗅網 5 萬篇文章資訊,大致瞭解了近些年科技網際網路的千變萬化。

發掘了那些優秀的文章和作者,能夠節省寶貴的時間成本。

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

本文尚未做深入的文字挖掘,而文字挖掘可能比資料探勘涵蓋的資訊量更大,更有價值。進行這些分析需要機器學習和深度學習的知識,待後期學習後再來補充。

本文完。

文中的完整程式碼和素材可以在下面的連結中獲取:

https://github.com/makcyun/eastmoney_spider

Python愛好者社群歷史文章大合集

福利:文末掃碼立刻關注公眾號,“Python愛好者社群”,開始學習Python課程:

關注後在公眾號內回覆“課程”即可獲取:

小編的轉行入職資料科學(資料分析挖掘/機器學習方向)【最新免費】

小編的Python入門免費視訊課程!!!

小編的Python快速上手matplotlib視覺化庫!!!

崔老師爬蟲實戰案例免費學習視訊。

陳老師資料分析報告製作免費學習視訊。

玩轉大資料分析!Spark2.X+Python 精華實戰課程免費學習視訊。

3901436-4bfcb88f60ab08ae