很可惜 T 。T 您現(xiàn)在還不是作者身份,不能自主發(fā)稿哦~
如有投稿需求,請把文章發(fā)送到郵箱tougao@appcpx.com,一經(jīng)錄用會有專人和您聯(lián)系
咨詢?nèi)绾纬蔀榇河鹱髡哒埪?lián)系:鳥哥筆記小羽毛(ngbjxym)
不少時(shí)候,一篇文章能否得到廣泛的傳播,除了文章本身實(shí)打?qū)嵉馁|(zhì)量以外,一個(gè)好的標(biāo)題也至關(guān)重要。本文爬取了虎嗅網(wǎng)建站至今共 5 萬條新聞標(biāo)題內(nèi)容,助你找到起文章標(biāo)題的技巧與靈感。同時(shí),分享一些值得關(guān)注的文章和作者。
在眾多新媒體網(wǎng)站中,「虎嗅」網(wǎng)的文章內(nèi)容和質(zhì)量還算不錯(cuò)。在「新榜」科技類公眾號排名中,它位居榜單第 3 名,還是比較受歡迎的。所以選擇爬取該網(wǎng)站的文章信息,順便從中了解一下這幾年科技互聯(lián)網(wǎng)都出現(xiàn)了哪些熱點(diǎn)信息。
分析虎嗅網(wǎng) 5 萬篇文章的基本情況,包括收藏?cái)?shù)、評論數(shù)等
發(fā)掘最受歡迎和最不受歡迎的文章及作者
分析文章標(biāo)題形式(長度、句式)與受歡迎程度之間的關(guān)系
展現(xiàn)近些年科技互聯(lián)網(wǎng)行業(yè)的熱門詞匯
Python 3.6
pyspider
MongoDB
Matplotlib
WordCloud
Jieba
使用 pyspider 抓取了虎嗅網(wǎng)的主頁文章,文章抓取時(shí)期為 2012 年建站至 2018 年 11 月 1 日,共計(jì)約 5 萬篇文章。抓取 了 7 個(gè)字段信息:文章標(biāo)題、作者、發(fā)文時(shí)間、評論數(shù)、收藏?cái)?shù)、摘要和文章鏈接。
這是要爬取的 網(wǎng)頁界面,可以看到是通過 AJAX 加載的。
右鍵打開開發(fā)者工具查看翻頁規(guī)律,可以看到 URL 請求是 POST 類型,下拉到底部查看 Form Data,表單需提交參數(shù)只有 3 項(xiàng)。經(jīng)嘗試, 只提交 page 參數(shù)就能成功獲取頁面的信息,其他兩項(xiàng)參數(shù)無關(guān)緊要,所以構(gòu)造分頁爬取非常簡單。
1huxiu_hash_code: 39bcd9c3fe9bc69a6b682343ee3f024a
2page: 4
3last_dateline: 1541123160
接著,切換選項(xiàng)卡到 Preview 和 Response 查看網(wǎng)頁內(nèi)容,可以看到數(shù)據(jù)都位于 data 字段里。total_page 為 2004,表示一共有 2004 頁的文章內(nèi)容,每一頁有 25 篇文章,總共約 5 萬篇,也就是我們要爬取的數(shù)量。
以上,我們就找到了所需內(nèi)容,接下來可以開始構(gòu)造爬蟲,整個(gè)爬取思路比較簡單。之前我們也練習(xí)過這一類 Ajax 文章的爬取,可以參考:
做 PPT 沒靈感?澎湃網(wǎng) 1500 期信息圖送給你
和之前文章(《以虎嗅網(wǎng)4W篇文章為例,展現(xiàn)數(shù)據(jù)分析全流程》)不同的是,這里我們使用一種新的工具來進(jìn)行爬取,叫做:pyspider 框架。由國人 binux 大神開發(fā),GitHub Star 數(shù)超過 12 K,足以證明它的知名度。可以說,學(xué)習(xí)爬蟲不能不會使用這個(gè)框架。
網(wǎng)上關(guān)于這個(gè)框架的介紹和實(shí)操案例非常多,這里僅簡單介紹一下。
我們之前的爬蟲都是在 Sublime 、PyCharm 這種 IDE 窗口中執(zhí)行的,整個(gè)爬取過程可以說是處在黑箱中,內(nèi)部運(yùn)行的些細(xì)節(jié)并不太清楚。而 pyspider 一大亮點(diǎn)就在于提供了一個(gè)可視化的 WebUI 界面,能夠清楚地查看爬蟲的運(yùn)行情況。
pyspider 的架構(gòu)主要分為 Scheduler(調(diào)度器)、Fetcher(抓取器)、Processer(處理器)三個(gè)部分。Monitor(監(jiān)控器)對整個(gè)爬取過程進(jìn)行監(jiān)控,Result Worker(結(jié)果處理器)處理最后抓取的結(jié)果。
該框架比較容易上手,網(wǎng)頁右邊是代碼區(qū),先定義類(Class)然后在里面添加爬蟲的各種方法(也可以稱為函數(shù)),運(yùn)行的過程會在左上方顯示,左下方則是輸出結(jié)果的區(qū)域。
這里,分享幾個(gè)不錯(cuò)的教程以供參考:
官方主頁:http://docs.pyspider.org/en/latest/
pyspider 爬蟲原理剖析:http://python.jobbole.com/81109/
pyspider 爬淘寶圖案例實(shí)操:https://cuiqingcai.com/2652.html
安裝好該框架并大概了解用法后,下面我們可以就開始爬取了。
CMD 命令窗口執(zhí)行:pyspider all 命令,然后瀏覽器輸入:http://localhost:5000/ 就可以啟動 pyspider 。
點(diǎn)擊 Create 新建一個(gè)項(xiàng)目,Project Name 命名為:huxiu,因?yàn)橐廊〉?URL 是 POST 類型,所以這里可以先不填寫,之后可以在代碼中添加,再次點(diǎn)擊 Creat 便完成了該項(xiàng)目的新建。
新項(xiàng)目建立好后會自動生成一部分模板代碼,我們只需在此基礎(chǔ)上進(jìn)行修改和完善,然后就可以運(yùn)行爬蟲項(xiàng)目了?,F(xiàn)在,簡單梳理下代碼編寫步驟。
1from pyspider.libs.base_handler import * 2class Handler(BaseHandler): 3 crawl_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 } 9 def on_start(self): 10 for page in range(2,3): # 先循環(huán)1頁 11 print('正在爬取第 %s 頁' % page) 12 self.crawl(' data={'page':page}, callback=self.index_page)
這里,首先定義了一個(gè) Handler 主類,整個(gè)爬蟲項(xiàng)目都主要在該類下完成。 接著,可以將爬蟲基本的一些基本配置,比如 Headers、代理等設(shè)置寫在下面的 crawl_config 屬性中。
如果你還沒有習(xí)慣從函數(shù)(def)轉(zhuǎn)換到類(Class)的代碼寫法,那么需要先了解一下類的相關(guān)知識,之后我也會單獨(dú)用一篇文章介紹一下。
下面的 on_start() 方法是程序的入口,也就是說程序啟動后會首先從這里開始運(yùn)行。首先,我們將要爬取的 URL傳入 crawl() 方法,同時(shí)將 URL 修改成虎嗅網(wǎng)的:https://www.huxiu.com/v2_action/article_list。
由于 URL 是 POST 請求,所以我們還需要增加兩個(gè)參數(shù):method 和 data。method 表示 HTTP 請求方式,默認(rèn)是 GET,這里我們需要設(shè)置為 POST;data 是 POST 請求表單參數(shù),只需要添加一個(gè) page 參數(shù)即可。
接著,通過 callback 參數(shù)定義一個(gè) index_page() 方法,用來解析 crawl() 方法爬取 URL 成功后返回的 Response 響應(yīng)。在后面的 index_page() 方法中,可以使用 PyQuery 提取響應(yīng)中的所需內(nèi)容。具體提取方法如下:
1import json
2from pyquery import PyQuery as pq
3def index_page(self, response):
4 content = response.json['data']
5 # 注意,在sublime中,json后面需要添加(),pyspider 中則不用
6 doc = pq(content)
7 lis = doc('.mod-art').items()
8 data = [{
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 } for item in lis ] # 列表生成式結(jié)果返回每頁提取出25條字典信息構(gòu)成的list
17 print(data)
18 return data
這里,網(wǎng)頁返回的 Response 是 json 格式,待提取的信息存放在其中的 data 鍵值中,由一段 HTML 代碼構(gòu)成。我們可以使用 response.json['data'] 獲取該 HTML 信息,接著使用 PyQuery 搭配 CSS 語法提取出文章標(biāo)題、鏈接、作者等所需信息。這里使用了列表生成式,能夠精簡代碼并且轉(zhuǎn)換為方便的 list 格式,便于后續(xù)存儲到 MongoDB 中。
我們輸出并查看一下第 2 頁的提取結(jié)果:
1# 由25個(gè) dict 構(gòu)成的 list
2[{'title': '想要長生不老?殺死體內(nèi)的“僵尸細(xì)胞”吧', 'url': 'https://www.huxiu.com/article/270086.html', 'name': '造就Talk', 'write_time': '19小時(shí)前', 'comment': '4', 'favorites': '28', 'abstract': '如果有了最終療法,也不應(yīng)該是每天都需要接受治療'},
3 {'title': '日本步入下流社會,我們還在買買買', 'url': 'https://www.huxiu.com/article/270112.html', 'name': '騰訊《大家》?', 'write_time': '20小時(shí)前', 'comment': '13', 'favorites': '142', 'abstract': '我買,故我在'}
4...
5]
可以看到,成功得到所需數(shù)據(jù),然后就可以保存了,可以選擇輸出為 CSV、MySQL、MongoDB 等方式,這里我們選擇保存到 MongoDB 中。
1import pandas as pd
2import pymongo
3import time
4import numpy as np
5client = pymongo.MongoClient('localhost',27017)
6db = client.Huxiu
7mongo_collection = db.huxiu_news
8
9def on_result(self,result):
10 if result:
11 self.save_to_mongo(result)
12def save_to_mongo(self,result):
13 df = pd.DataFrame(result)
14 #print(df)
15 content = json.loads(df.T.to_json()).values()
16 if mongo_collection.insert_many(content):
17 print('存儲到 mongondb 成功')
18 # 隨機(jī)暫停
19 sleep = np.random.randint(1,5)
20 time.sleep(sleep)
上面,定義了一個(gè) on_result() 方法,該方法專門用來獲取 return 的結(jié)果數(shù)據(jù)。這里用來接收上面 index_page() 返回的 data 數(shù)據(jù),在該方法里再定義一個(gè)存儲到 MongoDB 的方法就可以保存到 MongoDB 中。
關(guān)于數(shù)據(jù)如何存儲到 MongoDB 中,我們在之前的一篇文章中有過介紹,如果忘記了可以回顧一下。
下面,我們來測試一下整個(gè)爬取和存儲過程。點(diǎn)擊左上角的 run 就可以順利運(yùn)行單個(gè)網(wǎng)頁的抓取、解析和存儲,結(jié)果如下:
上面完成了單頁面的爬取,接下來,我們需要爬取全部 2000 余頁內(nèi)容。
需要修改兩個(gè)地方,首先在 on_start() 方法中將 for 循環(huán)頁數(shù) 3 改為 2002。改好以后,如果我們直接點(diǎn)擊 run ,會發(fā)現(xiàn)還是只能爬取第 2 頁的結(jié)果。
這是因?yàn)椋琾yspider 以 URL的 MD5 值作為 唯一 ID 編號,ID 編號相同的話就視為同一個(gè)任務(wù),便不會再重復(fù)爬取。由于 GET 請求的 分頁URL 通常是有差異的,所以 ID 編號會不同,也就自然能夠爬取多頁。但這里 POST 請求的分頁 URL 是相同的,所以爬完第 2 頁,后面的頁數(shù)便不會再爬取。
那有沒有解決辦法呢? 當(dāng)然是有的,我們需要重新寫下 ID 編號的生成方式,方法很簡單,在 on_start() 方法前面添加下面 2 行代碼即可:
1def get_taskid(self,task):
2 return md5string(task['url']+json.dumps(task['fetch'].get('data','')))
這樣,我們再點(diǎn)擊 run 就能夠順利爬取 2000 頁的結(jié)果了,我這里一共抓取了 49,996 條結(jié)果,耗時(shí) 2 小時(shí)左右完成。
以上,就完成了數(shù)據(jù)的獲取。有了數(shù)據(jù)我們就可以著手分析,不過這之前還需簡單地進(jìn)行一下數(shù)據(jù)的清洗、處理。
首先,我們需要從 MongoDB 中讀取數(shù)據(jù),并轉(zhuǎn)換為 DataFrame。
1client = pymongo.MongoClient(host='localhost', port=27017)
2db = client['Huxiu']
3collection = db['huxiu_news']
4# 將數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)為DataFrame
5data = pd.DataFrame(list(collection.find()))
下面我們看一下數(shù)據(jù)的總體情況,可以看到數(shù)據(jù)的維度是 49996 行 × 8 列。發(fā)現(xiàn)多了一列無用的 _id 需刪除,同時(shí) name 列有一些特殊符號,比如? 需刪除。另外,數(shù)據(jù)格式全部為 Object 字符串格式,需要將 comment 和 favorites 兩列更改為數(shù)值格式、 write_time 列更改為日期格式
1print(data.shape) # 查看行數(shù)和列數(shù)
2print(data.info()) # 查看總體情況
3print(data.head()) # 輸出前5行
4
5# 結(jié)果:
6(49996, 8)
7Data columns (total 8 columns):
8_id 49996 non-null object
9abstract 49996 non-null object
10comment 49996 non-null object
11favorites 49996 non-null object
12name 49996 non-null object
13title 49996 non-null object
14url 49996 non-null object
15write_time 49996 non-null object
16dtypes: object(8)
17
18 _id abstract comment favorites name title url write_time
190 5bdc2 “在你們看到… 22 50 普象工業(yè)設(shè)計(jì)小站? 看了蘋果屌 https:// 10小時(shí)前
201 5bdc2 中國”綠卡”號稱“世界最難拿” 9 16 經(jīng)濟(jì)觀察報(bào)? 遞交材料厚 https:// 10小時(shí)前
212 5bdc2 鮮衣怒馬少年時(shí) 2 13 小馬宋 金庸小說陪 https:// 11小時(shí)前
223 5bdc2 預(yù)告還是預(yù)警? 3 10 Cuba Libre 阿里即將發(fā) https:// 11小時(shí)前
234 5bdc2 庫克:咋回事? 2 3 Cuba Libre 【虎嗅早報(bào) https:// 11小時(shí)前
代碼實(shí)現(xiàn)如下:
1# 刪除無用_id列
2data.drop(['_id'],axis=1,inplace=True)
3# 替換掉特殊字符?
4data['name'].replace('?','',inplace=True,regex=True)
5# 字符更改為數(shù)值
6data = data.apply(pd.to_numeric,errors='ignore')
7# 更該日期格式
8data['write_time'] = data['write_time'].replace('.*前','2018-10-31',regex=True)
9# 為了方便,將write_time列,包含幾小時(shí)前和幾天前的行,都替換為10月31日最后1天。
10data['write_time'] = pd.to_datetime(data['write_time'])
下面,我們看一下數(shù)據(jù)是否有重復(fù),如果有,那么需要?jiǎng)h除。
1# 判斷整行是否有重復(fù)值
2print(any(data.duplicated()))
3# 顯示True,表明有重復(fù)值,進(jìn)一步提取出重復(fù)值數(shù)量
4data_duplicated = data.duplicated().value_counts()
5print(data_duplicated) # 顯示2 True ,表明有2個(gè)重復(fù)值
6# 刪除重復(fù)值
7data = data.drop_duplicates(keep='first')
8# 刪除部分行后,index中斷,需重新設(shè)置index
9data = data.reset_index(drop=True)
10#結(jié)果:
11True
12False 49994
13True 2
然后,我們再增加兩列數(shù)據(jù),一列是文章標(biāo)題長度列,一列是年份列,便于后面進(jìn)行分析。
1data['title_length'] = data['title'].apply(len)
2data['year'] = data['write_time'].dt.year
3Data columns (total 9 columns):
4abstract 49994 non-null object
5comment 49994 non-null int64
6favorites 49994 non-null int64
7name 49994 non-null object
8title 49994 non-null object
9url 49994 non-null object
10write_time 49994 non-null datetime64[ns]
11title_length 49994 non-null int64
12year 49994 non-null int64
以上,就完成了基本的數(shù)據(jù)清洗處理過程,針對這 9 列數(shù)據(jù)可以開始進(jìn)行分析了。
通常,數(shù)據(jù)分析主要分為四類: 「描述型分析」、「診斷型分析」「預(yù)測型分析」「規(guī)范型分析」?!该枋鲂头治觥故怯脕砀爬ā⒈硎鍪挛镎w狀況以及事物間關(guān)聯(lián)、類屬關(guān)系的統(tǒng)計(jì)方法,是這四類中最為常見的數(shù)據(jù)分析類型。通過統(tǒng)計(jì)處理可以簡潔地用幾個(gè)統(tǒng)計(jì)值來表示一組數(shù)據(jù)地集中性(如平均值、中位數(shù)和眾數(shù)等)和離散型(反映數(shù)據(jù)的波動性大小,如方差、標(biāo)準(zhǔn)差等)。
這里,我們主要進(jìn)行描述性分析,數(shù)據(jù)主要為數(shù)值型數(shù)據(jù)(包括離散型變量和連續(xù)型變量)和文本數(shù)據(jù)。
先來看一下總體情況。
1print(data.describe())
2 comment favorites title_length
3count 49994.000000 49994.000000 49994.000000
4mean 10.860203 34.081810 22.775333
5std 24.085969 48.276213 9.540142
6min 0.000000 0.000000 1.000000
725% 3.000000 9.000000 17.000000
850% 6.000000 19.000000 22.000000
975% 12.000000 40.000000 28.000000
10max 2376.000000 1113.000000 224.000000
這里,使用了 data.describe() 方法對數(shù)值型變量進(jìn)行統(tǒng)計(jì)分析。從上面可以簡要得出以下幾個(gè)結(jié)論:
讀者的評論和收藏?zé)崆槎疾凰闾?/strong>。大部分文章(75 %)的評論數(shù)量為十幾條,收藏?cái)?shù)量不過幾十個(gè)。這和一些微信大 V 公眾號動輒百萬級閱讀、數(shù)萬級評論和收藏量相比,虎嗅網(wǎng)的確相對小眾一些。不過也正是因?yàn)樾”?,也才深得部分人的喜歡。
評論數(shù)最多的文章有 2376 條,收藏?cái)?shù)最多的文章有 1113 個(gè)收藏量,說明還是有一些潛在的比較火或者質(zhì)量比較好的文章。
最長的文章標(biāo)題長達(dá) 224 個(gè)字,大部分文章標(biāo)題長度在 20 來個(gè)字左右,所以 標(biāo)題最好不要太長或過短。
對于非數(shù)值型變量(name、write_time),使用 describe() 方法會產(chǎn)生另外一種匯總統(tǒng)計(jì)。
1print(data['name'].describe())
2print(data['write_time'].describe())
3# 結(jié)果:
4count 49994
5unique 3162
6top 虎嗅
7freq 10513
8Name: name, dtype: object
9count 49994
10unique 2397
11top 2014-07-10 00:00:00
12freq 274
13first 2012-04-03 00:00:00
14last 2018-10-31 00:00:00
unique 表示唯一值數(shù)量,top 表示出現(xiàn)次數(shù)最多的變量,freq 表示該變量出現(xiàn)的次數(shù),所以可以簡單得出以下幾個(gè)結(jié)論:
在文章來源方面,3162 個(gè)作者貢獻(xiàn)了這 5 萬篇文章,其中自家官網(wǎng)「虎嗅」寫的數(shù)量最多,超過了 1 萬篇,這也很自然。
在文章發(fā)表時(shí)間方面,最早的一篇文章來自于 2012年 4 月 3 日。 6 年多時(shí)間,發(fā)文數(shù)最多的 1 天 是 2014 年 7 月 10 日,一共發(fā)了 274 篇文章。
可以看到 ,以季度為時(shí)間尺度的 6 年間,前幾年發(fā)文數(shù)量比較穩(wěn)定,大概在1750 篇左右,個(gè)別季度數(shù)量激增到 2000 篇以上。2016 年之后文章開始增加到 2000 篇以上,可能跟網(wǎng)站知名度提升有關(guān)。首尾兩個(gè)季度日期不全,所以數(shù)量比較少。
具體代碼實(shí)現(xiàn)如下:
1def analysis1(data):
2 # # 匯總統(tǒng)計(jì)
3 # print(data.describe())
4 # print(data['name'].describe())
5 # print(data['write_time'].describe())
6
7 data.set_index(data['write_time'],inplace=True)
8 data = data.resample('Q').count()['name'] # 以季度匯總
9 data = data.to_period('Q')
10 # 創(chuàng)建x,y軸標(biāo)簽
11 x = np.arange(0,len(data),1)
12 ax1.plot(x,data.values, #x、y坐標(biāo)
13 color = color_line , #折線圖顏色為紅色
14 marker = 'o',markersize = 4 #標(biāo)記形狀、大小設(shè)置
15 )
16 ax1.set_xticks(x) # 設(shè)置x軸標(biāo)簽為自然數(shù)序列
17 ax1.set_xticklabels(data.index) # 更改x軸標(biāo)簽值為年份
18 plt.xticks(rotation=90) # 旋轉(zhuǎn)90度,不至太擁擠
19
20 for x,y in zip(x,data.values):
21 plt.text(x,y + 10,'%.0f' %y,ha = 'center',color = colors,
fontsize=fontsize_text )
22 # '%.0f' %y 設(shè)置標(biāo)簽格式不帶小數(shù)
23 # 設(shè)置標(biāo)題及橫縱坐標(biāo)軸標(biāo)題
24 plt.title('虎嗅網(wǎng)文章數(shù)量發(fā)布變化(2012-2018)',color = colors,
fontsize=fontsize_title)
25 plt.xlabel('時(shí)期')
26 plt.ylabel('文章(篇)')
27 plt.tight_layout() # 自動控制空白邊緣
28 plt.savefig('虎嗅網(wǎng)文章數(shù)量發(fā)布變化.png',dpi=200)
29 plt.show()
接下來,到了我們比較關(guān)心的問題:幾萬篇文章里,到底哪些文章寫得比較好或者比較火?
此處選取了「favorites」(收藏?cái)?shù)量)作為衡量標(biāo)準(zhǔn)。畢竟,一般好的文章,我們都會有收藏的習(xí)慣。
第一名「讀完這10本書,你就能站在智商鄙視鏈的頂端了 」以 1113 次收藏位居第一,并且遙遙領(lǐng)先于后者,看來大家都懷有「想早日攀上人生巔峰,一覽眾人小」的想法啊。打開這篇文章的鏈接,文中提到了這幾本書:《思考,快與慢》、《思考的技術(shù)》、《麥肯錫入職第一課:讓職場新人一生受用的邏輯思考力》等。一本都沒看過,看來這輩子是很難登上人生巔峰了。
發(fā)現(xiàn)兩個(gè)有意思的地方:
第一,文章標(biāo)題都比較短小精煉。
第二,文章收藏量雖然比較高,但評論數(shù)都不多,猜測這是因?yàn)?nbsp;大家都喜歡做伸手黨?
在了解文章的總體排名之后,我們來看看歷年的文章排名是怎樣的。這里,每年選取了收藏量最多的 3 篇文章。
可以看到,文章收藏量基本是逐年遞增的,但 2015 年的 3 篇文章的收藏量卻是最高的,包攬了總排名的前 3 名,不知道這一年的文章有什么特別之處。
以上只羅列了一小部分文章的標(biāo)題,可以看到標(biāo)題起地都蠻有水準(zhǔn)的。關(guān)于標(biāo)題的重要性,有這樣通俗的說法:「一篇好文章,標(biāo)題占一半
」,一個(gè)好的標(biāo)題可以大大增強(qiáng)文章的傳播力和吸引力。文章標(biāo)題雖只有短短數(shù)十字,但要想起好,里面也是很有很多技巧的。
好在,這里提供了 5 萬個(gè)標(biāo)題可供參考。
代碼實(shí)現(xiàn)如下:
1def analysis2(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
11 def topn(data):
12 top = data.sort_values('favorites',ascending=False)
13 return top[:3]
14 data = data.groupby(by=['year']).apply(topn)
15 print(data[['title','favorites']])
16 # 增加每年top123列,列依次值為1、2、3
17 data['add'] = 1 # 輔助
18 data['top'] = data.groupby(by='year')['add'].cumsum()
19 data_reshape = data.pivot_table(index='year',columns='top',values='favorites').
reset_index()
20 # print(data_reshape) # ok
21 data_reshape.plot(
22 # x='year',
23 y=[1,2,3],
24 kind='bar',
25 width=0.3,
26 color=['#1362A3','#3297EA','#8EC6F5'] # 設(shè)置不同的顏色
27 # title='虎嗅網(wǎng)歷年收藏?cái)?shù)最多的3篇文章'
28 )
29 plt.xlabel('Year')
30 plt.ylabel('文章收藏?cái)?shù)量')
31 plt.title('歷年 TOP3 文章收藏量比較',color = colors,fontsize=fontsize_title)
32 plt.tight_layout() # 自動控制空白邊緣,以全部顯示x軸名稱
33 # plt.savefig('歷年 Top3 文章收藏量比較.png',dpi=200)
34 plt.show()
上面,我們從收藏量指標(biāo)進(jìn)行了分析,下面,我們關(guān)注一下發(fā)布文章的作者(個(gè)人/媒體)。前面提到發(fā)文最多的是虎嗅官方,有一萬多篇文章,這里我們篩除官媒,看看還有哪些比較高產(chǎn)的作者。
可以看到,前 20 名作者的發(fā)文量差距都不太大。發(fā)文比較多的有「娛樂資本論」、「Eastland」、「發(fā)條橙子」這類媒體號;也有虎嗅官網(wǎng)團(tuán)隊(duì)的作者:發(fā)條橙子、周超臣、張博文等;還有部分獨(dú)立作者:假裝FBI、孫永杰等。可以嘗試關(guān)注一下這些高產(chǎn)作者。
代碼實(shí)現(xiàn)如下:
1def analysis3(data):
2 data = data.groupby(data['name'])['title'].count()
3 data = data.sort_values(ascending=False)
4 # pandas 直接繪制,.invert_yaxis()顛倒順序
5 data[1:21].plot(kind='barh',color=color_line).invert_yaxis()
6 for y,x in enumerate(list(data[1:21].values)):
7 plt.text(x+12,y+0.2,'%s' %round(x,1),ha='center',color=colors)
8 plt.xlabel('文章數(shù)量')
9 plt.ylabel('作者')
10 plt.title('發(fā)文數(shù)量最多的 TOP20 作者',color = colors,fontsize=fontsize_title)
11 plt.tight_layout()
12 plt.savefig('發(fā)文數(shù)量最多的TOP20作者.png',dpi=200)
13 plt.show()
我們關(guān)注一個(gè)作者除了是因?yàn)槲恼赂弋a(chǎn)以外,可能更看重的是其文章水準(zhǔn)。這里我們選擇「文章平均收藏量」(總收藏量/文章數(shù))這個(gè)指標(biāo),來看看文章水準(zhǔn)比較高的作者是哪些人。
這里,為了避免出現(xiàn)「某作者只寫了一篇高收藏率的文章」這種不能代表其真實(shí)水準(zhǔn)的情況,我們將篩選范圍定在至少發(fā)布過 5 篇文章的作者們。
可以看到,前 10 名作者包括:遙遙領(lǐng)先的 重讀、兩位高產(chǎn)又有質(zhì)量的 辯手李慕陽 和 飯統(tǒng)戴老板 ,還有大眾比較熟悉的 高曉松、寧南山等。
如果你將這份名單和上面那份高產(chǎn)作者名單進(jìn)行對比,會發(fā)現(xiàn)他們沒有出現(xiàn)在這個(gè)名單中。相比于數(shù)量,質(zhì)量可能更重要吧。
下面,我們就來看看排名第一的 重讀 都寫了哪些高收藏量文章。
居然寫的都是清一色關(guān)于馬老板家的文章。
了解了前十名作者之后,我們順便也看看那些處于最后十名的都是哪些作者。
一對比,就能看到他們的文章收藏量就比較寒磣了。尤其好奇最后一位作者 Yang Yemeng ,他寫了 7 篇文章,竟然一個(gè)收藏都沒有。
來看看他究竟寫了些什么文章。
原來寫的全都是英文文章,看來大家并不太鐘意閱讀英文類的文章啊。
具體實(shí)現(xiàn)代碼:
1def analysis4(data):
2 data = pd.pivot_table(data,values=['favorites'],index='name',
aggfunc=[np.sum,np.size])
3 data['avg'] = data[('sum','favorites')]/data[('size','favorites')]
4 # 平均收藏?cái)?shù)取整
5 # data['avg'] = data['avg'].round(decimals=1)
6 data['avg'] = data['avg'].astype('int')
7 # flatten 平鋪列
8 data.columns = data.columns.get_level_values(0)
9 data.columns = ['total_favorites','ariticls_num','avg_favorites']
10 # 篩選出文章數(shù)至少5篇的
11 data=data.query('ariticls_num > 4')
12 data = data.sort_values(by=['avg_favorites'],ascending=False)
13 # # 查看平均收藏率第一名詳情
14 # data = data.query('name == "重讀"')
15 # # 查看平均收藏率倒數(shù)第一名詳情
16 # data = data.query('name == "Yang Yemeng"')
17 # print(data[['title','favorites','write_time']])
18 print(data[:10]) # 前10名
19 print(data[-10:]) # 后10名
說完了收藏量。下面,我們再來看看評論數(shù)量最多的文章是哪些。
基本上都是和 三星 有關(guān)的文章,這些文章大多來自 2014 年,那幾年 三星 好像是挺火的,不過這兩年國內(nèi)基本上都見不到三星的影子了,世界變化真快。
發(fā)現(xiàn)了兩個(gè)有意思的現(xiàn)象。
第一,上面關(guān)于 三星 和前面 阿里 的這些批量文章,它們「霸占」了評論和收藏榜,結(jié)合知乎上曾經(jīng)的一篇關(guān)于介紹虎嗅這個(gè)網(wǎng)站的文章:虎嗅網(wǎng)其實(shí)是這樣的 ,貌似能發(fā)現(xiàn)些微妙的事情。
第二,這些文章評論數(shù)和收藏?cái)?shù)兩個(gè)指標(biāo)幾乎呈極端趨勢,評論量多的文章收藏量卻很少,評論量少的文章收藏量卻很多。
我們進(jìn)一步觀察下這兩個(gè)參數(shù)的關(guān)系。
可以看到,大多數(shù)點(diǎn)都位于左下角,意味著這些文章收藏量和評論數(shù)都比較低。但也存在少部分位于上方和右側(cè)的異常值,表明這些文章呈現(xiàn) 「多評論、少收藏」或者「少評論、多收藏」的特點(diǎn)。
下面,我們再來看看文章標(biāo)題的長度和收藏量之間有沒有什么關(guān)系。
大致可以看出兩點(diǎn)現(xiàn)象:
第一,收藏量高的文章,他們的標(biāo)題都比較短(右側(cè)的部分散點(diǎn))。
第二,標(biāo)題很長的文章,它們的收藏量都非常低(左邊形成了一條垂直線)。
看來,文章起標(biāo)題時(shí)最好不要起太長的。
實(shí)現(xiàn)代碼如下:
1def analysis5(data):
2 plt.scatter(
3 x=data['favorites'],
4 y =data['comment'],
5 s=data['title_length']/2,
6 )
7 plt.xlabel('文章收藏量')
8 plt.ylabel('文章評論數(shù)')
9 plt.title('文章標(biāo)題長度與收藏量和評論數(shù)之間的關(guān)系',color = colors,
fontsize=fontsize_title)
10 plt.tight_layout()
11 plt.show()
下面,我們看看作者在起文章標(biāo)題的時(shí)候,在標(biāo)點(diǎn)符號方面有沒有什么偏好。
可以看到,五萬篇文章中,大多數(shù)文章的標(biāo)題是陳述性標(biāo)題。三分之一(34.8%) 的文章標(biāo)題使用了問號「?」,而僅有 5% 的文章用了嘆號「!」。通常,問號會讓人們產(chǎn)生好奇,從而想去點(diǎn)開文章;而嘆號則會帶來一種緊張或者壓迫感,使人不太想去點(diǎn)開。所以,可以嘗試多用問號而少用嘆號。
最后,我們從這 5 萬篇文章中的標(biāo)題和摘要中,來看看虎嗅網(wǎng)的文章主要關(guān)注的都是哪些主題領(lǐng)域。
這里首先運(yùn)用了 jieba 分詞包對標(biāo)題進(jìn)行了分詞,然后用 WordCloud 做成了詞云圖,因虎嗅網(wǎng)含有「虎」字,故選取了一張老虎頭像。(關(guān)于 jieba 和 WordCloud 兩個(gè)包,之后再詳細(xì)介紹)
可以看到文章的主題內(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è)」大致相符合。
實(shí)現(xiàn)代碼如下:
1def analysis6(data):
2 text=''
3 for i in data['title'].values:
4 symbol_to_replace = '[!"#$%&\'()*+,-./:;<=>?@,。?★、…【】《》?
“”‘’![\\]^_`{|}~]+'
5 i = re.sub(symbol_to_replace,'',i)
6 text+=' '.join(jieba.cut(i,cut_all=False))
7 d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
8
9 background_Image = np.array(Image.open(path.join(d, "tiger.png")))
10 font_path = 'C:\Windows\Fonts\SourceHanSansCN-Regular.otf' # 思源黑字體
11
12 # 添加stopswords
13 stopwords = set()
14 # 先運(yùn)行對text進(jìn)行詞頻統(tǒng)計(jì)再排序,再選擇要增加的停用詞
15 stopwords.update(['如何','怎么','一個(gè)','什么','為什么','還是','我們','為何',
'可能','不是','沒有','哪些','成為','可以','背后','到底','就是','這么','不要','怎樣','為了',
'能否','你們','還有','這樣','這個(gè)','真的','那些'])
16 wc = WordCloud(
17 background_color = 'black',
18 font_path = font_path,
19 mask = background_Image,
20 stopwords = stopwords,
21 max_words = 200,
22 margin =2,
23 max_font_size = 100,
24 random_state = 42,
25 scale = 2,
26 )
27 wc.generate_from_text(text)
28 process_word = WordCloud.process_text(wc, text)
29 # 下面是字典排序
30 sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True) # sort
為list
31 print(sort[:50]) # 輸出前詞頻最高的前50個(gè),然后篩選出不需要的stopwords,
添加到前面的stopwords.update()方法中
32 img_colors = ImageColorGenerator(background_Image)
33 wc.recolor(color_func=img_colors) # 顏色跟隨圖片顏色
34 plt.imshow(wc,interpolation='bilinear')
35 plt.axis('off')
36 plt.tight_layout() # 自動控制空白邊緣
37 plt.savefig('huxiu20.png',dpi=200)
38 plt.show()
上面的關(guān)鍵詞是這幾年總體的概況,而科技互聯(lián)網(wǎng)行業(yè)每年的發(fā)展都是不同的,所以,我們再來看看歷年的一些關(guān)鍵詞,透過這些關(guān)鍵詞看看這幾年互聯(lián)網(wǎng)行業(yè)、科技熱點(diǎn)、知名公司都有些什么不同變化。
可以看到每年的關(guān)鍵詞都有一些相同之處,但也不同的地方:
中國互聯(lián)網(wǎng)、公司、蘋果、騰訊、阿里等這些熱門關(guān)鍵詞一直都是熱門,這幾家公司真是穩(wěn)地一批啊。
每年會有新熱點(diǎ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è)、明星公司、熱點(diǎn)信息的風(fēng)云變化。
本文簡要分析了虎嗅網(wǎng) 5 萬篇文章信息,大致了解了近些年科技互聯(lián)網(wǎng)的千變?nèi)f化。
發(fā)掘了那些優(yōu)秀的文章和作者,能夠節(jié)省寶貴的時(shí)間成本。
一篇文章要想傳播廣泛,文章本身的質(zhì)量和標(biāo)題各占一半,文中的5 萬個(gè)標(biāo)題相信能夠帶來一些靈感。
本文尚未做深入的文本挖掘,而文本挖掘可能比數(shù)據(jù)挖掘涵蓋的信息量更大,更有價(jià)值。進(jìn)行這些分析需要機(jī)器學(xué)習(xí)和深度學(xué)習(xí)的知識,待后期學(xué)習(xí)后再來補(bǔ)充。
本文為作者獨(dú)立觀點(diǎn),不代表鳥哥筆記立場,未經(jīng)允許不得轉(zhuǎn)載。
《鳥哥筆記版權(quán)及免責(zé)申明》 如對文章、圖片、字體等版權(quán)有疑問,請點(diǎn)擊 反饋舉報(bào)
我們致力于提供一個(gè)高質(zhì)量內(nèi)容的交流平臺。為落實(shí)國家互聯(lián)網(wǎng)信息辦公室“依法管網(wǎng)、依法辦網(wǎng)、依法上網(wǎng)”的要求,為完善跟帖評論自律管理,為了保護(hù)用戶創(chuàng)造的內(nèi)容、維護(hù)開放、真實(shí)、專業(yè)的平臺氛圍,我們團(tuán)隊(duì)將依據(jù)本公約中的條款對注冊用戶和發(fā)布在本平臺的內(nèi)容進(jìn)行管理。平臺鼓勵(lì)用戶創(chuàng)作、發(fā)布優(yōu)質(zhì)內(nèi)容,同時(shí)也將采取必要措施管理違法、侵權(quán)或有其他不良影響的網(wǎng)絡(luò)信息。
一、根據(jù)《網(wǎng)絡(luò)信息內(nèi)容生態(tài)治理規(guī)定》《中華人民共和國未成年人保護(hù)法》等法律法規(guī),對以下違法、不良信息或存在危害的行為進(jìn)行處理。
1. 違反法律法規(guī)的信息,主要表現(xiàn)為:
1)反對憲法所確定的基本原則;
2)危害國家安全,泄露國家秘密,顛覆國家政權(quán),破壞國家統(tǒng)一,損害國家榮譽(yù)和利益;
3)侮辱、濫用英烈形象,歪曲、丑化、褻瀆、否定英雄烈士事跡和精神,以侮辱、誹謗或者其他方式侵害英雄烈士的姓名、肖像、名譽(yù)、榮譽(yù);
4)宣揚(yáng)恐怖主義、極端主義或者煽動實(shí)施恐怖活動、極端主義活動;
5)煽動民族仇恨、民族歧視,破壞民族團(tuán)結(jié);
6)破壞國家宗教政策,宣揚(yáng)邪教和封建迷信;
7)散布謠言,擾亂社會秩序,破壞社會穩(wěn)定;
8)宣揚(yáng)淫穢、色情、賭博、暴力、兇殺、恐怖或者教唆犯罪;
9)煽動非法集會、結(jié)社、游行、示威、聚眾擾亂社會秩序;
10)侮辱或者誹謗他人,侵害他人名譽(yù)、隱私和其他合法權(quán)益;
11)通過網(wǎng)絡(luò)以文字、圖片、音視頻等形式,對未成年人實(shí)施侮辱、誹謗、威脅或者惡意損害未成年人形象進(jìn)行網(wǎng)絡(luò)欺凌的;
12)危害未成年人身心健康的;
13)含有法律、行政法規(guī)禁止的其他內(nèi)容;
2. 不友善:不尊重用戶及其所貢獻(xiàn)內(nèi)容的信息或行為。主要表現(xiàn)為:
1)輕蔑:貶低、輕視他人及其勞動成果;
2)誹謗:捏造、散布虛假事實(shí),損害他人名譽(yù);
3)嘲諷:以比喻、夸張、侮辱性的手法對他人或其行為進(jìn)行揭露或描述,以此來激怒他人;
4)挑釁:以不友好的方式激怒他人,意圖使對方對自己的言論作出回應(yīng),蓄意制造事端;
5)羞辱:貶低他人的能力、行為、生理或身份特征,讓對方難堪;
6)謾罵:以不文明的語言對他人進(jìn)行負(fù)面評價(jià);
7)歧視:煽動人群歧視、地域歧視等,針對他人的民族、種族、宗教、性取向、性別、年齡、地域、生理特征等身份或者歸類的攻擊;
8)威脅:許諾以不良的后果來迫使他人服從自己的意志;
3. 發(fā)布垃圾廣告信息:以推廣曝光為目的,發(fā)布影響用戶體驗(yàn)、擾亂本網(wǎng)站秩序的內(nèi)容,或進(jìn)行相關(guān)行為。主要表現(xiàn)為:
1)多次發(fā)布包含售賣產(chǎn)品、提供服務(wù)、宣傳推廣內(nèi)容的垃圾廣告。包括但不限于以下幾種形式:
2)單個(gè)帳號多次發(fā)布包含垃圾廣告的內(nèi)容;
3)多個(gè)廣告帳號互相配合發(fā)布、傳播包含垃圾廣告的內(nèi)容;
4)多次發(fā)布包含欺騙性外鏈的內(nèi)容,如未注明的淘寶客鏈接、跳轉(zhuǎn)網(wǎng)站等,誘騙用戶點(diǎn)擊鏈接
5)發(fā)布大量包含推廣鏈接、產(chǎn)品、品牌等內(nèi)容獲取搜索引擎中的不正當(dāng)曝光;
6)購買或出售帳號之間虛假地互動,發(fā)布干擾網(wǎng)站秩序的推廣內(nèi)容及相關(guān)交易。
7)發(fā)布包含欺騙性的惡意營銷內(nèi)容,如通過偽造經(jīng)歷、冒充他人等方式進(jìn)行惡意營銷;
8)使用特殊符號、圖片等方式規(guī)避垃圾廣告內(nèi)容審核的廣告內(nèi)容。
4. 色情低俗信息,主要表現(xiàn)為:
1)包含自己或他人性經(jīng)驗(yàn)的細(xì)節(jié)描述或露骨的感受描述;
2)涉及色情段子、兩性笑話的低俗內(nèi)容;
3)配圖、頭圖中包含庸俗或挑逗性圖片的內(nèi)容;
4)帶有性暗示、性挑逗等易使人產(chǎn)生性聯(lián)想;
5)展現(xiàn)血腥、驚悚、殘忍等致人身心不適;
6)炒作緋聞、丑聞、劣跡等;
7)宣揚(yáng)低俗、庸俗、媚俗內(nèi)容。
5. 不實(shí)信息,主要表現(xiàn)為:
1)可能存在事實(shí)性錯(cuò)誤或者造謠等內(nèi)容;
2)存在事實(shí)夸大、偽造虛假經(jīng)歷等誤導(dǎo)他人的內(nèi)容;
3)偽造身份、冒充他人,通過頭像、用戶名等個(gè)人信息暗示自己具有特定身份,或與特定機(jī)構(gòu)或個(gè)人存在關(guān)聯(lián)。
6. 傳播封建迷信,主要表現(xiàn)為:
1)找人算命、測字、占卜、解夢、化解厄運(yùn)、使用迷信方式治?。?br /> 2)求推薦算命看相大師;
3)針對具體風(fēng)水等問題進(jìn)行求助或咨詢;
4)問自己或他人的八字、六爻、星盤、手相、面相、五行缺失,包括通過占卜方法問婚姻、前程、運(yùn)勢,東西寵物丟了能不能找回、取名改名等;
7. 文章標(biāo)題黨,主要表現(xiàn)為:
1)以各種夸張、獵奇、不合常理的表現(xiàn)手法等行為來誘導(dǎo)用戶;
2)內(nèi)容與標(biāo)題之間存在嚴(yán)重不實(shí)或者原意扭曲;
3)使用夸張標(biāo)題,內(nèi)容與標(biāo)題嚴(yán)重不符的。
8.「飯圈」亂象行為,主要表現(xiàn)為:
1)誘導(dǎo)未成年人應(yīng)援集資、高額消費(fèi)、投票打榜
2)粉絲互撕謾罵、拉踩引戰(zhàn)、造謠攻擊、人肉搜索、侵犯隱私
3)鼓動「飯圈」粉絲攀比炫富、奢靡享樂等行為
4)以號召粉絲、雇用網(wǎng)絡(luò)水軍、「養(yǎng)號」形式刷量控評等行為
5)通過「蹭熱點(diǎn)」、制造話題等形式干擾輿論,影響傳播秩序
9. 其他危害行為或內(nèi)容,主要表現(xiàn)為:
1)可能引發(fā)未成年人模仿不安全行為和違反社會公德行為、誘導(dǎo)未成年人不良嗜好影響未成年人身心健康的;
2)不當(dāng)評述自然災(zāi)害、重大事故等災(zāi)難的;
3)美化、粉飾侵略戰(zhàn)爭行為的;
4)法律、行政法規(guī)禁止,或可能對網(wǎng)絡(luò)生態(tài)造成不良影響的其他內(nèi)容。
二、違規(guī)處罰
本網(wǎng)站通過主動發(fā)現(xiàn)和接受用戶舉報(bào)兩種方式收集違規(guī)行為信息。所有有意的降低內(nèi)容質(zhì)量、傷害平臺氛圍及欺凌未成年人或危害未成年人身心健康的行為都是不能容忍的。
當(dāng)一個(gè)用戶發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將依據(jù)相關(guān)用戶違規(guī)情節(jié)嚴(yán)重程度,對帳號進(jìn)行禁言 1 天、7 天、15 天直至永久禁言或封停賬號的處罰。當(dāng)涉及欺凌未成年人、危害未成年人身心健康、通過作弊手段注冊、使用帳號,或者濫用多個(gè)帳號發(fā)布違規(guī)內(nèi)容時(shí),本網(wǎng)站將加重處罰。
三、申訴
隨著平臺管理經(jīng)驗(yàn)的不斷豐富,本網(wǎng)站出于維護(hù)本網(wǎng)站氛圍和秩序的目的,將不斷完善本公約。
如果本網(wǎng)站用戶對本網(wǎng)站基于本公約規(guī)定做出的處理有異議,可以通過「建議反饋」功能向本網(wǎng)站進(jìn)行反饋。
(規(guī)則的最終解釋權(quán)歸屬本網(wǎng)站所有)