從數據爬取到機器學習——標題黨,你的標題值幾何

【前方水文預警】

一、前言:

聽說自媒體火了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繼續為了溫飽擼碼去╥﹏╥...

文章首發:公眾號:州的先生 zmister.com


推薦閱讀:

自媒體平台UC雲觀開放收益功能,自媒體作者有收入了
我是如何走上"自媒體"這條道路的
新媒源:2018互聯網的下一波紅利,知識付費超乎想像
媒體人的年底綜合症

TAG:Python | 自媒体 | 爬虫计算机网络 |