科技網際網路都有啥熱點資訊?爬取虎嗅5萬篇文章告訴你
歡迎關注天善智慧,我們是專注於商業智慧BI,人工智慧AI,大資料分析與挖掘領域的垂直社群,學習,問答、求職一站式搞定!
對商業智慧BI、大資料分析挖掘、機器學習,python,R等資料領域感興趣的同學加微信:tsaiedu,並註明訊息來源,邀請你進入資料愛好者交流群,資料愛好者們都在這兒。
作者:蘇克1900
公眾號:第2大腦
摘要:不少時候,一篇文章能否得到廣泛的傳播,除了文章本身實打實的質量以外,一個好的標題也至關重要。本文爬取了虎嗅網建站至今共 5 萬條新聞標題內容,助你找到起文章標題的技巧與靈感。同時,分享一些值得關注的文章和作者。
寫在前面:由於文中有一些超連結,無法在公眾號開啟,建議點選底部「閱讀原文」或者複製下面的部落格連結到瀏覽器開啟,體驗更好。
https://www.makcyun.top/
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 引數就能成功獲取頁面的資訊,其他兩項引數無關緊要,所以構造分頁爬取非常簡單。
1huxiu_hash_code:39bcd9c3fe9bc69a6b682343ee3f024a
2page:4
3last_dateline:1541123160
接著,切換選項卡到 Preview 和 Response 檢視網頁內容,可以看到資料都位於 data 欄位裡。total_page 為 2004,表示一共有 2004 頁的文章內容,每一頁有 25 篇文章,總共約 5 萬篇,也就是我們要爬取的數量。
以上,我們就找到了所需內容,接下來可以開始構造爬蟲,整個爬取思路比較簡單。之前我們也練習過這一類 Ajax 文章的爬取,可以參考:
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/
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 便完成了該專案的新建。
新專案建立好後會自動生成一部分模板程式碼,我們只需在此基礎上進行修改和完善,然後就可以執行爬蟲專案了。現在,簡單梳理下程式碼編寫步驟。
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 就可以順利執行單個網頁的抓取、解析和儲存,結果如下:
上面完成了單頁面的爬取,接下來,我們需要爬取全部 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 小時左右完成。
以上,就完成了資料的獲取。有了資料我們就可以著手分析,不過這之前還需簡單地進行一下資料的清洗、處理。
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. 不同時期文章釋出的數量變化
可以看到 ,以季度為時間尺度的 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
接下來,到了我們比較關心的問題:幾萬篇文章裡,到底哪些文章寫得比較好或者比較火?
此處選取了「favorites」(收藏數量)作為衡量標準。畢竟,一般好的文章,我們都會有收藏的習慣。
第一名「讀完這10本書,你就能站在智商鄙視鏈的頂端了 」以 1113 次收藏位居第一,並且遙遙領先於後者,看來大家都懷有「想早日攀上人生巔峰,一覽眾人小」的想法啊。開啟這篇文章的連結,文中提到了這幾本書:《思考,快與慢》、《思考的技術》、《麥肯錫入職第一課:讓職場新人一生受用的邏輯思考力》等。一本都沒看過,看來這輩子是很難登上人生巔峰了。
發現兩個有意思的地方:
第一,文章標題都比較短小精煉。
第二,文章收藏量雖然比較高,但評論數都不多,猜測這是因為大家都喜歡做伸手黨?
4.4. 歷年文章收藏量 TOP3
在瞭解文章的總體排名之後,我們來看看歷年的文章排名是怎樣的。這裡,每年選取了收藏量最多的 3 篇文章。
可以看到,文章收藏量基本是逐年遞增的,但 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
上面,我們從收藏量指標進行了分析,下面,我們關注一下發布文章的作者(個人/媒體)。前面提到發文最多的是虎嗅官方,有一萬多篇文章,這裡我們篩除官媒,看看還有哪些比較高產的作者。
可以看到,前 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 篇文章的作者們。
可以看到,前 10 名作者包括:遙遙領先的重讀、兩位高產又有質量的辯手李慕陽和飯統戴老闆,還有大眾比較熟悉的高曉鬆、寧南山等。
如果你將這份名單和上面那份高產作者名單進行對比,會發現他們沒有出現在這個名單中。相比於數量,質量可能更重要吧。
下面,我們就來看看排名第一的重讀都寫了哪些高收藏量文章。
居然寫的都是清一色關於馬老闆家的文章。
瞭解了前十名作者之後,我們順便也看看那些處於最後十名的都是哪些作者。
一對比,就能看到他們的文章收藏量就比較寒磣了。尤其好奇最後一位作者Yang Yemeng,他寫了 7 篇文章,竟然一個收藏都沒有。
來看看他究竟寫了些什麼文章。
原來寫的全都是英文文章,看來大家並不太鐘意閱讀英文類的文章啊。
具體實現程式碼:
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
說完了收藏量。下面,我們再來看看評論數量最多的文章是哪些。
基本上都是和三星有關的文章,這些文章大多來自 2014 年,那幾年三星好像是挺火的,不過這兩年國內基本上都見不到三星的影子了,世界變化真快。
發現了兩個有意思的現象。
第一,上面關於三星和前面阿里的這些批量文章,它們「霸佔」了評論和收藏榜,結合知乎上曾經的一篇關於介紹虎嗅這個網站的文章:虎嗅網其實是這樣的 ,貌似能發現些微妙的事情。
第二,這些文章評論數和收藏數兩個指標幾乎呈極端趨勢,評論量多的文章收藏量卻很少,評論量少的文章收藏量卻很多。
我們進一步觀察下這兩個引數的關係。
可以看到,大多數點都位於左下角,意味著這些文章收藏量和評論數都比較低。但也存在少部分位於上方和右側的異常值,表明這些文章呈現 「多評論、少收藏」或者「少評論、多收藏」的特點。
4.6. 文章標題長度
下面,我們再來看看文章標題的長度和收藏量之間有沒有什麼關係。
大致可以看出兩點現象:
第一,收藏量高的文章,他們的標題都比較短(右側的部分散點)。
第二,標題很長的文章,它們的收藏量都非常低(左邊形成了一條垂直線)。
看來,文章起標題時最好不要起太長的。
實現程式碼如下:
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. 標題形式
下面,我們看看作者在起文章標題的時候,在標點符號方面有沒有什麼偏好。
可以看到,五萬篇文章中,大多數文章的標題是陳述性標題。三分之一(34.8%) 的文章標題使用了問號「?」,而僅有 5% 的文章用了歎號「!」。通常,問號會讓人們產生好奇,從而想去點開文章;而歎號則會帶來一種緊張或者壓迫感,使人不太想去點開。所以,可以嘗試多用問號而少用歎號。
4.8. 文字分析
最後,我們從這 5 萬篇文章中的標題和摘要中,來看看虎嗅網的文章主要關注的都是哪些主題領域。
這裡首先運用了 jieba 分詞包對標題進行了分詞,然後用 WordCloud 做成了詞雲圖,因虎嗅網含有「虎」字,故選取了一張老虎頭像。(關於 jieba 和 WordCloud 兩個包,之後再詳細介紹)
可以看到文章的主題內容側重於:網際網路、知名公司、電商、投資這些領域。這和網站本身對外宣傳的核心內容,即「關注網際網路與移動網際網路一系列明星公司的起落軌跡、產業潮汐的動力與趨勢,以及網際網路與移動網際網路如何改造傳統產業」大致相符合。
實現程式碼如下:
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()
上面的關鍵詞是這幾年總體的概況,而科技網際網路行業每年的發展都是不同的,所以,我們再來看看歷年的一些關鍵詞,透過這些關鍵詞看看這幾年網際網路行業、科技熱點、知名公司都有些什麼不同變化。
可以看到每年的關鍵詞都有一些相同之處,但也不同的地方:
中國網際網路、公司、蘋果、騰訊、阿里等這些熱門關鍵詞一直都是熱門,這幾家公司真是穩地一批啊。
每年會有新熱點湧現:比如 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 精華實戰課程免費學習視訊。