美文网首页一起学pythonpython爬虫日记本
从数据爬取到机器学习——标题党,你的标题值几何

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

作者: 9c8bd366d2f7 | 来源:发表于2017-07-21 09:36 被阅读130次

    一、前言:

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

    二、引子:

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


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

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


    惨遭现实打脸
    所以还是安心撸码吧╮(╯_╰)╭

    三、爬取数据

    找页面找接口解析元素是一件很繁琐的过程,已经有一个现成的采集器,那就直接对它进行抓包。
    用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'].values
    y = 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
    继续为了温饱撸码去╥﹏╥...

    相关文章

      网友评论

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

        本文链接:https://www.haomeiwen.com/subject/qjnahxtx.html