從數據爬取到機器學習——標題黨,你的標題值幾何
【前方水文預警】
一、前言:
聽說自媒體火了n聽說自媒體平台多了n聽說自媒體平台補貼高了n聽說搞自媒體的人都賺翻了n……n我也想不擼碼,投身於自媒體行業去~( ̄▽ ̄~)(~ ̄▽ ̄)~
二、引子:
前段時間拿到一個自媒體平台偽原創的採集器,嗯,長下面那樣:
按照閱讀量排序進行採集,選擇高閱讀量的文章,稍加修改,就是一篇自己的偽原創文章了,趕緊註冊幾個自媒體平台號,什麼千家號、尾條號、北極熊號,每天發上幾篇自己,坐等各大平台給自己送錢,創造被動收入、實現財務自由,指日可待(??????) ?。n醒醒,快醒醒,現實分分鐘打我臉(;′??Д??`)n
所以還是安心擼碼吧╮(╯_╰)╭
三、爬取數據
找頁面找介面解析元素是一件很繁瑣的過程,已經有一個現成的採集器,那就直接對它進行抓包。n用wireshake抓取到它的HTTP請求:
解析出來:
打開鏈接看看:n
嗯,有了介面,那就直接寫爬蟲爬數據吧n頭條號的ID直接使用採集器自帶的(就是那麼懶╮(╯▽╰)╭)
# coding:utf-8nnimport requestsnimport jsonnimport pymongonn# 鏈接MongoDBnconn = pymongo.MongoClient(host=localhost,port=27017)ntoutiaohao = conn[toutiaohao]nnews = toutiaohao[news]nnheaders = {n Host: www.toutiao.com,n User-Agent: Mozilla/4.0 (compatible; MSIE 9.0; Windows NT 6.1; 125LA; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022),n Connection: Keep-Alive,n Content-Type: text/plain; Charset=UTF-8,n Accept: */*,n Accept-Language: zh-cn,n Cookie: __tasessionId=x57suhyhv1500091331200;cp=5969D943FCF37E1,n}nndef scrap_toutiao(uid):n url = http://www.toutiao.com/c/user/article/?page_type=1&user_id={uid}&max_behot_time=0&count=60&as=A175F9F659893C3&cp=5969D943FCF37E1.format(uid=uid)n resp = requests.get(url,headers=headers).textn data = json.loads(resp,encoding=utf-8)[data]n if len(data) != 0:n for d in data:n try:n category = d[chinese_tag]n except:n category = 其他n result = {n title:d[title],n readcount:d[go_detail_count],n category:category,n comment:d[comments_count],n author:d[source]n }n print(result)n news.insert_one(result)nnwith open(今日頭條ID.txt,mode=r) as text:n oneid = text.readlines()n for i in oneid:n print(i,end=)n scrap_toutiao(uid=i)nnconn.close()n
沒用多進程多線程,沒用代理池,沒考慮異常處理,沒有編碼的規範性,嗯,就是寫的菜雞風格的爬蟲。╮(﹀_﹀)╭n去MongoDB裡面看看數據:
四、探索數據
臉皮薄,怕被罵ㄟ( ▔, ▔ )ㄏn載入進pandas,來探索探索爬取到的數據n1、引入模塊
import numpy as npnimport pandas as pdnimport pymongonimport matplotlib.pyplot as pltn
2、從mongodb中載入數據
# 鏈接MongoDBnconn = pymongo.MongoClient(host=localhost,port=27017)ntoutiaohao = conn[toutiaohao]nnews = toutiaohao[news]nndata = pd.DataFrame(list(news.find()))ndel data[_id]n
3、去除重複值
data = data.drop_duplicates(subset=title)n
最後剩下11291條頭條:
4、按照閱讀量排序,看看前10都是些什麼文章:
data = data.sort_values(readcount,ascending=False)ndata.head(10)n
嗯,9條娛樂新聞,剩下一條,算是倫理新聞么(?⊙ω⊙)?n5、再看看各個類別的佔比
data[category].value_counts().reset_index()n
plt.style.use(ggplot)nplt.figure(figsize=(6,6))nplt.pie(data[category].value_counts().reset_index()[category],labels=data[category].value_counts().reset_index()[index])n
plt.figure(figsize=(15,10))nplt.bar(np.arange(len(data[category].value_counts().reset_index())),data[category].value_counts().reset_index()[category])nplt.xticks(np.arange(len(data[category].value_counts().reset_index())),data[category].value_counts().reset_index()[index],rotation=50)n
娛樂新聞一騎絕塵,真是個娛樂至死的時代[]~( ̄▽ ̄)~*
6、最後看看各個頭條號的閱讀量n採集的數據中,一共包含210個頭條號n閱讀量前10位為:
data_groupby_author_to_readcount = data.groupby(author)[readcount].sum().reset_index().sort_values(readcount,ascending=False)ndata_groupby_author_to_readcount.head(10)n
前10的閱讀量合計:
data_groupby_author_to_readcount.head(10)[readcount].sum()n
158309655
所有頭條號的閱讀量合計為:
data_groupby_author_to_readcount[readcount].sum()n
635325549
嗯,前10的頭條號佔了總流量的6分之一。n但是!!!前面所說的都沒有什麼屁用。n因為!!!通過統計顯示,採集的210個頭條號中,娛樂類的頭條號佔了157個┑( ̄Д  ̄)┍
data.drop_duplicates(subset=author).groupby(category)[author].count().reset_index()n
是不是很尷尬n嗯,不尷尬,重點在下面
五、機器學習——構建標題分類器
本來想做個根據標題來預測閱讀量的例子,細想了一下,自己這渣水平還是不要自己找不痛快了。n那就做一個分類器吧。n根據標題預測閱讀量的高低等級。n實現簡單、容易理解d=====( ̄▽ ̄*)bn先看看數據的整體情況:
data.describe()ncount 11291.0nmean 56268.3nstd 176473.9nmin 0.0n25% 295.0n50% 2601.0n75% 30703.0nmax 3941170.0n
嗯,平均閱讀量為56268n也不清楚自媒體行業的閱讀量等級標準,姑且就拿樣本數據的分位值平均值作為標準吧,n高於中分位的為高閱讀量,低於中分位的為低閱讀量。n就這樣愉快地決定了。o(*≧▽≦)ツn生成一個新的閱讀量等級序列:
data[level] = data[readcount].map(lambda x:1 if x >= 2601 else 0)n
然後,對標題進行分詞
import jiebandata[fenci] = data[title].map(lambda x: .join(jieba.cut(x)))n
數據就成了這樣:
接下來提取數據,用於生成訓練和測試數據:
X = data[fenci].valuesny = data[level].valuesn
分割訓練集和測試集:
from sklearn.cross_validation import train_test_splitnX_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)n
提取分詞後的頭條標題的文本特徵:
from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformernvectorizer = CountVectorizer()nnX_train_termcounts = vectorizer.fit_transform(X_train)nntfidf_transformer = TfidfTransformer()nX_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)n
使用樸素貝葉斯演算法進行模型訓練
from sklearn.neighbors import KNeighborsClassifiernnclassifier = MultinomialNB().fit(X_train_tfidf,y_train)nknn_classifier = KNeighborsClassifier().fit(X_train_tfidf,y_train)n
這樣一個樸素貝葉斯的模型就訓練好了,我們用測試數據來進行預測一下:
X_test_termcounts = vectorizer.transform(X_test)nX_test_tfidf = tfidf_transformer.transform(X_test_termcounts)nnpredicted = classifier.predict(X_test_tfidf)n
看看預測數據的準確率:
from sklearn.metrics import accuracy_scorenprint(樸素貝葉斯分類器:,accuracy_score(y_test,predicted))n
嗯,百分之六十的準確率……n這基本也就告別實際應用了,(ノへ ̄、)
拿本文的標題預測一下:
classifier.predict(tfidf_transformer.transform(vectorizer.transform([從 數據 爬取 到 機器 學習——標題黨 你的 標題 值 幾何])))n
感人的0——感人的低。n看來沒有投身自媒體的本事ε(┬┬﹏┬┬)3n繼續為了溫飽擼碼去╥﹏╥...
文章首發:公眾號:州的先生 http://zmister.com
推薦閱讀:
※自媒體平台UC雲觀開放收益功能,自媒體作者有收入了
※我是如何走上"自媒體"這條道路的
※新媒源:2018互聯網的下一波紅利,知識付費超乎想像
※媒體人的年底綜合症