帮你多维度分析简书文章是否受欢迎

需求分析

简书文章的分析功能比较弱,只能按照热度排序,从页面上看,热度指的是点赞数。

热度

可文章还有其他的分析维度:阅读数,评论数, 点赞数。简书并没有提供对这些维度的分析。

既然如此,就自己撸起袖子干吧...

实现的需求很简单:将自己简书文章的阅读、评论、点赞、打赏、标题、发布时间抓取下来,存入数据库,再进行分析展示

效果如下:

简书文章分析.gif

以上只是最简单的展示,可以自定义其他数据分析效果

具体实现

数据抓取

使用python抓取页面数据,抓取之前先分析页面的html结构

分析html结构

具体实现代码:

# -*- coding: utf-8 -*-
import requests
import pyquery
import time
import datetime
import pymysql

# 数据库连接信息
conn = pymysql.connect(host='127.0.0.1', user='root', passwd=None, db='test', charset='utf8')
cur = conn.cursor()

user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' \
             ' (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'
headers = {"User-Agent": "user-agent:%s" % user_agent}
page = 0
flag = True

while flag:
    baseUrl = 'https://www.jianshu.com/u/f9338eda7dda?page='
    page = int(page) + 1
    url = baseUrl + str(page)
    print(url)

    # 抓取数据
    req = requests.get(url, headers=headers, timeout=2)
    pageText = req.text
    pq = pyquery.PyQuery(pageText)
    contents = pq('li')
    for x in contents:
        el = pq(x)
        title = el.find('a.title').text()
        if title:
            nodeId = el.attr('data-note-id')

            # data-note-id为空时,表示文章已抓取完毕,此时退出循环
            if nodeId is None:
                flag = False
                break

            link = 'https://www.jianshu.com' + el.find('a.title').attr('href') # 文章链接
            postTime = el.find('span.time').attr('data-shared-at') # 发布时间
            dateTime = datetime.datetime.strptime(postTime, "%Y-%m-%dT%H:%M:%S+08:00")
            create_time = int(time.mktime(dateTime.timetuple()))
            read_num = el.find('i.ic-list-read').parent().text() # 阅读数
            comment_num = el.find('i.ic-list-comments').parent().text() # 评论数
            like_num = el.find('i.ic-list-like').parent().text() # 点赞数
            money_num = el.find('i.ic-list-money').parent().text() # 打赏数
            if money_num is '':
                money_num = 0

            # 数据入库
            analyze_time = int(time.time())
            sql = "insert into analyze_article \
                  (title, link, create_time, analyze_time, read_num, like_num, comment_num, money_num) values \
                  ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s')" % \
                  (title, link, create_time, analyze_time, read_num, like_num, comment_num, money_num)
            cur.execute(sql)
            conn.commit()

    # 暂停1秒,避免被简书的反爬虫拦截
    time.sleep(1)

php读取数据

爬虫将数据入库后,用php作为服务端读取数据表数据

极简单的数据读取脚本,无需解释,直接贴代码

<?php
header("Access-Control-Allow-Origin:*"); // 如果客户端和服务端不同域,要加上这行代码,不然会报跨域错误
$con=mysqli_connect("localhost","root","","test");
$analyzeTime = strtotime(date('Y-m-m', time())) - 3600 * 24;
$sql="SELECT * FROM analyze_article where analyze_time >= $analyzeTime";
$order = '';
if (isset($_GET['read_num'])) {
    $order = " order by read_num desc";
}
if (isset($_GET['like_num'])) {
    $order = " order by like_num desc";
}
if (isset($_GET['comment_num'])) {
    $order = " order by comment_num desc";
}
if (isset($_GET['money_num'])) {
    $order = " order by money_num desc";
}
$sql .= $order;
$result=mysqli_query($con,$sql);
$data=mysqli_fetch_all($result, MYSQLI_ASSOC);
mysqli_free_result($result);
mysqli_close($con);
echo json_encode($data, true);

前端使用vue.js展现

php后端返回json数据,vue.js将json数据解析展现到页面

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
    <title>简书文章分析</title>
    <style>
        .container {
            margin-top: 2%;
        }
    </style>
</head>
<body>
<div class="container">
    <div id="app">
        <h3 class="text-center">简书文章分析</h3>
        <table class="table table-bordered table-hover">
            <tr>
                <th>标题</th>
                <th><a href="" @click.prevent="changeOrder('read_num')" class="text-info">阅读</a></th>
                <th><a href="" @click.prevent="changeOrder('like_num')" class="text-danger">点赞</a></th>
                <th><a href="" @click.prevent="changeOrder('comment_num')" class="text-warning">评论</a></th>
                <th><a href="" @click.prevent="changeOrder('money_num')" class="text-success">打赏</a></th>
            </tr>
            <tr v-for="item in list">
                <td><a :href="item.link" target="_blank">{{ item.title }}</a></td>
                <td>{{ item.read_num }}</td>
                <td>{{ item.like_num }}</td>
                <td>{{ item.comment_num }}</td>
                <td>{{ item.money_num }}</td>
            </tr>
        </table>
    </div>
</div>
<script>
    let url = 'http://local.php.com/jianshu.php';
    let vm = new Vue({
        el: '#app',
        data: {
            list: []
        },
        methods: {
            changeOrder: function (sign) {
                let reqUrl = url + '?' + sign + '=1'
                axios.get(reqUrl, {})
                    .then(function (response) {
                        vm.$data.list = response.data;
                    })
            },
        }
    });
    axios.get(url, {})
        .then(function (response) {
            vm.$data.list = response.data;
        })
        .catch(function (error) {
            console.log(error);
        })
        .then(function () {
            // always executed
        });
</script>
</body>
</html>

对于vue.js不熟悉的同学,推荐查看:实例学习vue.js目录

小结

除了以上极简的按不同维度排序外,还可以从不同角度进行分析,前提是你的数据量要多,你也可以拿那些大v的简书主页放到程序中进行分析,有助于你了解大v的文章好在哪里。

完整的源包下载

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,934评论 3 118
  • 整理自《数据结构高分笔记》 1、概念和流程 基本概念所谓外部排序,即对外存中的记录进行排序(相对于内部排序而言),...
    文哥的学习日记阅读 993评论 0 1
  • 想必最近有很多人在关注ICO以及政府对其的监管,而李笑来就是这些天站在舆论风口浪尖的人。 我最开始知道笑来老师是通...
    仙人掌cactus阅读 710评论 0 1
  • 哈佛大学的最新定义: 1.什么叫幸福? 每天在学习和成长中的感觉就叫幸福。 2.何为智慧? 掌握了世界万物...
    大智若语阅读 196评论 0 1