从数据爬取到机器学习—标题党,你的标题值几何

一、前言:

听说自媒体火了 听说自媒体平台多了 听说自媒体平台补贴高了 听说搞自媒体的人都赚翻了 …… 我也想不撸码,投身于自媒体行业去~( ̄▽ ̄~)(~ ̄▽ ̄)~

二、引子:

前段时间拿到一个自媒体平台伪原创的采集器,嗯,长下面那样:

某自媒体平台伪原创采集器

按照阅读量排序进行采集,选择高阅读量的文章,稍加修改,就是一篇自己的伪原创文章了,赶紧注册几个自媒体平台号,什么千家号、尾条号、北极熊号,每天发上几篇自己,坐等各大平台给自己送钱,创造被动收入、实现财务自由,指日可待(๑•̀ㅂ•́)و✧。 醒醒,快醒醒,现实分分钟打我脸(;´༎ຶД༎ຶ`)

惨遭现实打脸

所以还是安心撸码吧╮(╯_╰)╭

三、爬取数据

找页面找接口解析元素是一件很繁琐的过程,已经有一个现成的采集器,那就直接对它进行抓包。 用wireshake抓取到它的HTTP请求:

采集器的HTTP请求

解析出来:

详细的请求

打开链接看看:

接口返回的数据

嗯,有了接口,那就直接写爬虫爬数据吧 头条号的ID直接使用采集器自带的(就是那么懒╮(╯▽╰)╭)

# coding:utf-8
import requests
import json
import pymongo
# 链接MongoDB
conn = pymongo.MongoClient(host='localhost',port=27017)
toutiaohao = conn['toutiaohao']
news = toutiaohao['news']

headers = {    
    'Host': 'www.toutiao.com',
    '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)',    
    'Connection': 'Keep-Alive',    
    'Content-Type': 'text/plain; Charset=UTF-8',    
    'Accept': '*/*',    'Accept-Language': 'zh-cn',    
    'Cookie': '__tasessionId=x57suhyhv1500091331200;cp=5969D943FCF37E1',
}
def scrap_toutiao(uid):
    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)
    resp = requests.get(url,headers=headers).text
    data = json.loads(resp,encoding='utf-8')['data']    
    if len(data) != 0:        
        for d in data:            
            try:
                category = d['chinese_tag']            
            except:
                category = '其他'
            result = {                
                'title':d['title'],                
                'readcount':d['go_detail_count'],                
                'category':category,                
                'comment':d['comments_count'],                
                'author':d['source']
            }
            print(result)
            news.insert_one(result)
with open('今日头条ID.txt',mode='r') as text:
    oneid = text.readlines()    
    for i in oneid:
        print(i,end='')
        scrap_toutiao(uid=i)
conn.close()

没用多进程多线程,没用代理池,没考虑异常处理,没有编码的规范性,嗯,菜鸡只写菜鸡风格的爬虫。╮(﹀_﹀)╭ 去MongoDB里面看看数据:

四、探索数据

脸皮薄,怕被骂ㄟ( ▔, ▔ )ㄏ 加载进pandas,来探索探索爬取到的数据 1、引入模块

import numpy as np
import pandas as pd
import pymongo
import matplotlib.pyplot as plt

2、从mongodb中加载数据

# 链接MongoDB
conn = pymongo.MongoClient(host='localhost',port=27017)
toutiaohao = conn['toutiaohao']
news = toutiaohao['news']

data = pd.DataFrame(list(news.find()))
del data['_id']

3、去除重复值

data = data.drop_duplicates(subset='title')

最后剩下11291条头条:

去重后的数据

4、按照阅读量排序,看看前10都是些什么文章:

data = data.sort_values('readcount',ascending=False)
data.head(10)

点击量前10的头条

嗯,9条娱乐新闻,剩下一条,算是伦理新闻么(☄⊙ω⊙)☄

5、再看看各个类别的占比

data['category'].value_counts().reset_index()

前5

plt.style.use('ggplot')
plt.figure(figsize=(6,6))
plt.pie(data['category'].value_counts().reset_index()['category'],labels=data['category'].value_counts().reset_index()['index'])

分类占比饼图

plt.figure(figsize=(15,10))
plt.bar(np.arange(len(data['category'].value_counts().reset_index())),data['category'].value_counts().reset_index()['category'])
plt.xticks(np.arange(len(data['category'].value_counts().reset_index())),data['category'].value_counts().reset_index()['index'],rotation=50)

分类数量柱状图

娱乐新闻一骑绝尘,真是个娱乐至死的时代[]~( ̄▽ ̄)~*

6、最后看看各个头条号的阅读量 采集的数据中,一共包含210个头条号 阅读量前10位为:

data_groupby_author_to_readcount = data.groupby('author')['readcount'].sum().reset_index().sort_values('readcount',ascending=False)
data_groupby_author_to_readcount.head(10)

阅读量前10的头条号

前10的阅读量合计:

data_groupby_author_to_readcount.head(10)['readcount'].sum()

158309655

所有头条号的阅读量合计为:

data_groupby_author_to_readcount['readcount'].sum()

635325549

嗯,前10的头条号占了总流量的6分之一。 但是!!!前面所说的都没有什么屁用。 因为!!!通过统计显示,采集的210个头条号中,娱乐类的头条号占了157个┑( ̄Д  ̄)┍

data.drop_duplicates(subset='author').groupby('category')['author'].count().reset_index()

头条号类型比率饼图

是不是很尴尬 嗯,不尴尬,重点在下面

五、机器学习——使用朴素贝叶斯构建标题分类器

本来想做个根据标题来预测阅读量的例子,细想了一下,自己这渣水平还是不要自己找不痛快了。 那就做一个分类器吧。 根据标题预测阅读量的高低等级。 实现简单、容易理解d=====( ̄▽ ̄*)b 先看看数据的整体情况:

data.describe()
count      11291.0
mean       56268.3
std       176473.9
min            0.0
25%          295.0
50%         2601.0
75%        30703.0
max      3941170.0

数据整体情况

嗯,平均阅读量为56268 也不清楚自媒体行业的阅读量等级标准,姑且就拿样本数据的分位值平均值作为标准吧, 高于中分位的为高阅读量,低于中分位的为低阅读量。 就这样愉快地决定了。o(*≧▽≦)ツ 生成一个新的阅读量等级序列:

data['level'] = data['readcount'].map(lambda x:1 if x >= 2601 else 0)

然后,对标题进行分词

import jieba
data['fenci'] = data['title'].map(lambda x:' '.join(jieba.cut(x)))

数据就成了这样:

加入分词和阅读量等级后的数据

接下来提取数据,用于生成训练和测试数据:

X = data['fenci'].valuesy = data['level'].values

分割训练集和测试集:

from sklearn.cross_validation import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2)

提取分词后的头条标题的文本特征:

from sklearn.feature_extraction.text import CountVectorizer,TfidfTransformer
vectorizer = CountVectorizer()

X_train_termcounts = vectorizer.fit_transform(X_train)

tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)

使用朴素贝叶斯算法进行模型训练

from sklearn.neighbors import KNeighborsClassifier

classifier = MultinomialNB().fit(X_train_tfidf,y_train)
knn_classifier = KNeighborsClassifier().fit(X_train_tfidf,y_train)

这样一个朴素贝叶斯的模型就训练好了,我们用测试数据来进行预测一下:

X_test_termcounts = vectorizer.transform(X_test)
X_test_tfidf = tfidf_transformer.transform(X_test_termcounts)

predicted = classifier.predict(X_test_tfidf)

看看预测数据的准确率:

from sklearn.metrics import accuracy_score
print('朴素贝叶斯分类器:',accuracy_score(y_test,predicted))

模型预测准确率

嗯,百分之六十的准确率…… 这基本上也就告别实际应用了(ノへ ̄、)

拿本文的标题预测一下:

classifier.predict(tfidf_transformer.transform(vectorizer.transform(['从 数据 爬取 到 机器 学习——标题党 你的 标题 值 几何'])))

本文标题预测

感人的0——感人的低。 看来没有投身自媒体的本事ε(┬┬﹏┬┬)3 继续为了温饱撸码去╥﹏╥...

原文发布于微信公众号 - 州的先生(zmister2016)

原文发表时间:2017-07-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

TensorFlow、MXNet、PaddlePaddle三个开源库对比

本文从定位、框架使用、分布式构成三个方面比较了TensorFlow、MXNet、PaddlePaddle三个框架。

1090
来自专栏tkokof 的技术,小趣及杂念

音乐游戏&音频解析 ABC(下)

  首先我们应该先确定一下我们到底需要解析歌曲的哪些信息?歌名?作者?呵呵,都不是,我们要解析的应该是歌曲的“信号”属性(譬如歌曲的BPM)。然而歌曲的这些属性...

761
来自专栏机器人网

PID控制原理:看完这三个故事,你就明白了

一、PID的故事 小明接到这样一个任务:有一个水缸点漏水(而且漏水的速度还不一定固定不变),要求水面高度维持在某个位置,一旦发现水面高度低于要求位置,就要往水缸...

2563
来自专栏pangguoming

WebGL 入门-WebGL简介与3D图形学

什么是WebGL? WebGL是一项使用JavaScript实现3D绘图的技术,浏览器无需插件支持,Web开发者就能借助系统显卡(GPU)进行编写代码从而呈现3...

39911
来自专栏量子位

Chrome暗藏的恐龙跳一跳,已经被AI轻松掌握了

作为一个Google Chrome浏览器的用户,当你看到上面那个页面时,不要沮丧。换个角度一想,墙内还能有更多的Play时间哦~

843
来自专栏智能算法

数据异常到底该如何检测?(一)

小编在正式进入工作之后,面对的第一个需要去解决的问题:在网络安全监测中,如何发现异常数据?如异常用户登录,异常操作等。对于网络上的问题我确实是第一次接触这样类型...

3277
来自专栏数据结构与算法

网络最大流入门

前言 网络最大流是网络流中最基础也是最重要的部分,后边的许多模型也都是由最大流问题引申而来的 最大流 在研究这个问题之前,让我们先来学习一下前置知识 可行流 设...

3075
来自专栏数据结构与算法

记一道贝叶斯公式的裸题

上课好不容易听懂了,赶紧整理一下,不然以我的记性估计明天就要忘干净了 题目 一个用户所有邮件分为两类:$A_1$代表垃圾邮件, $A_2$代表非垃圾邮件 根据经...

2495
来自专栏量子位

众筹项目能否成功?用机器学习预测可以早知道

安妮 编译自 Shrikar Archak 量子位出品 | 公众号 QbitAI Kickstarter是一家美国的众筹平台。自2009年成立至今,已经有36万...

3415
来自专栏算法+

音频增益响度分析 ReplayGain 附完整C代码示例

人们所熟知的图像方面的3A算法有: AF自动对焦(Automatic Focus) 自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automa...

4538

扫码关注云+社区