咪蒙

文学硕士,驾驭文字能力极强。并且是一个拥有一千多万粉丝,每篇文章阅读量都   100W+,头条发个软文都能赚 80 万,永远都能抓住粉丝G点的那个女人。

1月份因为某篇文章,在网络上被一大批网友炮轰。我也因此关注了她。一开始发现她的文章非常接地气,基本都是和生活紧密相连,但看的多了,发现经常在文中非常平滑的挑起某种关系之间的矛盾。很大一部分文章都是围绕女性展开话题。而且每天更新时间都在晚上十一点左右,几乎从来不间断。包括春节。

2015年9月15日,公众号第一篇文章《女友对你作?你应该谢天谢地,因为她爱你》,直男癌表示理解不来这话什么意思。 昨天公众号注销,又一次成为热点话题。历史文章也都不能看了,好在今天一个小伙伴分享了咪蒙所有文章的压缩包。

因为是直接从文件中读取数据,相比于从公众号中抓取文章要方便很多。最吸引我的说实话就是标题,读者都是被标题吸引了才去选择是否读你的文章。咪蒙这一点真的厉害。

总共 1013 篇文章,直接读取文件夹中的所有文件就好,

import os
import re
files = os.listdir(r"E:\BaiduNetdiskDownload\咪蒙\咪蒙全部文章PDF")
for i in files:
 # 通过正则匹配标题中的日期
 mat = re.search(r"(\d{4}_\d{1,2}_\d{1,2} )", i)
 re_str = mat.groups()[]
 # 替换日期和文件后缀名
 file_name = i.replace(re_str,'').replace('.pdf','')
 # 去掉图片标题
 if file_name == "分享图片":
     continue
 print(file_name)

更直观的去看标题,可以通过 WorldCloud 生成词云图。这里文章太多,生成所有标题的词云可能看不太清,所以只生成了近期部分标题。

import numpy as np
from PIL import Image
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 读取所有文件的标题,存在txt文本中
with open('标题.txt', 'r', encoding='utf-8') as f:
 word = (f.read())
 f.close()

# 图片模板和字体
image = np.array(Image.open('背景图片.jpg'))
# 指定字体,否则汉字不显示
font_path='yahei.ttf'

# 结巴粉刺
wordlist_after_jieba = jieba.cut(word)
# 分词结果
wl_space_split = " ".join(wordlist_after_jieba)
# 关键一步
my_wordcloud = WordCloud(scale=, font_path=font_path,mask=image, background_color='white',
                      max_words=, max_font_size=, random_state=).generate(wl_space_split)
# 显示生成的词云
plt.imshow(my_wordcloud)
plt.axis("off")
plt.show()
# 保存生成的图片
my_wordcloud.to_file('result.jpg')

毕竟小编主要还是 java 开发,Python 实在是有点渣,为了美观用在线工具生成了词云,就假装是我生成的吧

从上图中看出来,真的是在标题上煞废了苦心。标题只是让用户打开,只有内容才能真正的留住用户。那究竟什么内容这么吸引人呢?

因为拿到的文件格式是 PDF 文件,因此可以通过 Python 的 pdfminer3k 库进行操作。

安装库

pip3 install pdfminer3k

代码如下

import sys
import importlib
import os
importlib.reload(sys)

from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import PDFPageAggregator
from pdfminer.layout import LTTextBoxHorizontal, LAParams
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed

def readPDF(path, toPath):
  # 以二进制的形式打开PDF文件
  with open(path, "rb") as f:
      # 创建一个PDF解析器
      parser = PDFParser(f)
      # 创建PDF文档
      pdfFile = PDFDocument()
      # 文档放入解析器中
      parser.set_document(pdfFile)
      pdfFile.set_parser(parser)
      # 初始化密码
      pdfFile.initialize()
      # 检测文档是否可以转换成txt
  if not pdfFile.is_extractable:
      raise PDFTextExtractionNotAllowed
  else:
      # 解析数据
      # 数据管理
      manager = PDFResourceManager()
      # 创建一个PDF设备对象
      laparams = LAParams()
      device = PDFPageAggregator(manager, laparams=laparams)
      # 解释器对象
      interpreter = PDFPageInterpreter(manager, device)

      # 开始循环处理,每次处理一页
      for page in pdfFile.get_pages():
          interpreter.process_page(page)
          layout = device.get_result()
          for x in layout:
              if(isinstance(x, LTTextBoxHorizontal)):
                  with open(toPath, "a") as f:
                      str = x.get_text()
                      # print(str)
                      f.write(str.encode("gbk", 'ignore').decode("gbk", "ignore")+"\n")
path = r"E:\BaiduNetdiskDownload\咪蒙\咪蒙全部文章PDF"

# 获取文件下所有PDF文件数组
files = os.listdir(r"E:\BaiduNetdiskDownload\咪蒙\咪蒙全部文章PDF")
for i in files:
  # 拼接文件路径
  content_url = path + '/' + i
  readPDF(content_url, 'content.txt')
  print(f"{content_url} 读取完成")

全部文章大概 300 多万字左右,这里推荐使用多线程去操作。然后进行数据清洗,因为资料包里有些不相关的推广信息,以及文章的编辑、排版、配图人员的署名、日期等信息。

然后通过分词计算出热点关键词出现的次数。

import jieba
import csv

article = open('content.txt','r').read()
words = list(jieba.cut(article))
articleDict = {}
for w in set(words):
  :
      articleDict[w] = words.count(w)
articlelist = sorted(articleDict.items(),key = lambda x:x[], reverse = True)

#打开文件,追加a
out = open('mm_csv.csv','a', newline='')
#设定写入模式
csv_write = csv.writer(out,dialect='excel')
):
  # 关键词
  word = articlelist[i][]
  # 出现次数
  num = articlelist[i][]
  arr = [word, num]
  csv_write.writerow(arr)
print('已保存为csv文件.')

结果如下图所示

发现出现了很多社交关系中的称呼词。为了更直观的展示,可以通过 pyecharts 进行柱状图显示。

文章中大部分从孩子、父母、男生、女生、闺蜜等话题展开。另外之所以朋友这个词出现在前面,因为很多文章都是讲述"朋友"的故事。

之前看过一篇文章,分析了咪蒙的微博(现已关闭),粉丝将近 200W,其中女性粉丝占据了 85%。年龄段在 23-28 岁之间,这个年龄段的女生对理想中的生活比较向往,而咪蒙的文章就是说出了他们的心声,文中狂喷渣男,直男。作为理工男加程序员我的内心是这样子的。

最后根据高频词生成了一个词云图,背景图片用的是咪蒙的头像。

写在最后

翻了几篇文章发现配图非常的小清新,可能就是用来掩盖鸡汤的毒吧。《寒门状元之死》在网上扒出了许多槽点,为了人气不惜歪曲事实,虚构场景。而且很多文章中出现频繁出现不雅词语。

引用网上的一句话

一部分人讨厌咪蒙,

是因为无法忍受文明世界里一个满口脏话的公知,

是因为我们受够了她不良的蛊惑,

是因为我们相信我们关注的公众号应该有底线和正确的三观,

是因为我们还是一群有良知有思考的年轻人。

比起这种大起大落,我更愿意体会那些渺小的成就感。

比如,程序启动一切正常,说服产品不改需求了,发现BUG就知道哪里出了问题。

再比如,看完这篇文章的你能点个赞。

51Reboot 教育最新课程通知

  • Python 零基础入门课程
  • Python 运维自动化进阶课程
  • Docker + K8s 课程

早报名可享受早鸟价

想要详细了解和报名的同学可以扫码添加好友私聊啦

用 Python 分析咪蒙1013篇文章,她凭什么会火?的更多相关文章

  1. Python并发编程的几篇文章

    Python几种并发实现方案的性能比较 http://www.elias.cn/Python/PyConcurrency?from=Develop.PyConcurrency python并发编程 h ...

  2. 你真的了解Python自动化吗?这篇文章可以让你了解90%

    人们为什么使用Python? 之所以选择Python的主要因素有以下几个方面: 软件质量:在很大程度上,Python更注重可读性.一致性和软件质量,从而与脚本语言世界中的其他工具区别开发.此外,Pyt ...

  3. python中的面向对象学习以及类的封装(这篇文章初学者一定要好好看)

    这篇文章对于初学者可以很有效的理解面对过程.面对对象 一.首先介绍一下面向过程和面向对象的比较: 面向过程 VS 面向对象 编程范式 编程是程序员用特定的语法+数据结构+算法组成的代码来告诉计算机如何 ...

  4. 别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

    目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.C ...

  5. Python RPC 不会?不妨看看这篇文章

    1. 前言 大家好,我是安果! RPC,全程为 Remote Procedure Call,是一种进程间的通信方式,它采用「 服务端 / 客户机 」模式,是一种请求响应模型 其中,服务端负责提供服务程 ...

  6. fw:学好Python必读的几篇文章

    学好Python必读的几篇文章 from:http://blog.csdn.net/hzxhan/article/details/8555602 分类: python2013-01-30 11:52  ...

  7. 理解Python中的装饰器//这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档

    转自:http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 这篇文章将python的装饰器来龙去脉说的很清楚,故转过来存档 ...

  8. 外国人专门写了一篇文章,来分析为什么go在中国如此火

    外国人专门写了一篇文章,来分析为什么go在中国如此火: <Why is Golang popular in China?> http://herman.asia/why-is-go-pop ...

  9. Python——学好Python必读的几篇文章

    作为脚本语言Python上手容易,但要学好Python能写出一手漂亮的.Pythonic的Python代码并非一日之功,本文的目的在于推荐 一些优秀的Python相关的文章(至于书大家可以看dip.l ...

随机推荐

  1. 常用的Git命令整理

    之前一直忙于项目苦于没有时间总结,今天刚好有时间特来总结一下在工作中常用到的代码版本管理器Git.至于为什么要用Git?Git相比SVN有哪些好处?我就不多说了,前人已经总结的很好.今天主要介绍的是常 ...

  2. [Linux.NET]Nginx 泛解析配置请求映射到多端口实现二级域名访问

    由于想实现一个域名放置多个应用运行的目的,而不想通过域名后加端口号方式处理,这种方式处理记起来太麻烦,偷懒党简直不能忍,故而考虑了使用二级域名来处理多个应用同时运行.Google了一番资料并进行了尝试 ...

  3. tkinter内嵌Matplotlib系列(一)之解读官网教材

    目录 目录 前言 (一)小目标 1.首页卷面: 2.绘制一条函数曲线: 3.绘制多条曲线: (二)官方教材 1.对GUI框架的支持: 2.内嵌于tkinter的说明文档: (三)对官方教程的解读 目录 ...

  4. Hadoop2.7.6_04_HDFS的Shell操作与常见问题

    1. HDFS的shell操作 1.1. 支持的命令及参数 [yun@mini05 zhangliang]$ hadoop fs Usage: hadoop fs [generic options] ...

  5. 移除元素的golang实现

    给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  6. vue实例生命周期详解

    每个 Vue 实例在被创建之前都要经过一系列的初始化过程. 例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM . 在这个过程中,实 ...

  7. python之面向对象进阶2

    封装.property装饰器 封装分为3种情况:封装对象的属性.封装类的属性.封装方法. 封装对象的属性:(在属性名前加双下划线__) class Person: def __init__(self, ...

  8. maven 打包生成doc和源码插件

    <!--配置生成Javadoc包--> <plugin> <groupId>org.apache.maven.plugins</groupId> < ...

  9. 字典树模板题(统计难题 HDU - 1251)

    https://vjudge.net/problem/HDU-1251 标准的字典树模板题: 也注意一下输入方法: #include<iostream> #include<cstdi ...

  10. reorder-list 单链表

    题意: 给你一个单链表 a1 a2 a3 a4 a5....an 让你变成 a1 an a2 an-1 a3 an-2 .... 这里牵涉到,单链表的倒置和两个单链表的合并. class Soluti ...