百度贴吧之旅
本文中介绍的如何通过$\color{red}{正则表达式}$来爬取百度贴吧中的内容,并且通过Jieba
分词和wordcloud
来实现词云图展示
选取的话题是:为何大学女生比男生看起来有钱得多?
声明:本文中获取的数据仅供学习使用,未用作任何商业用途;如有转载,请注明作者和原文出处
项目成果
- 如何获取网页源码
re
模块中正则表达式的使用- 如何写入
csv
文件 jieba
分词wordcloud
绘制图云
爬取内容
()
表示提取其中的内容,找到3
个需要提取信息的源码特点,写出了如下的正则表达式:
- 名称:class=“d_name”.*?target="_blank">([\u4e00-\u9fa5+\w])
- 内容:class=“d_post_content j_d_post_content.*?”>(.*?)<
- 时间:class=“tail-info”>(20.*?)<
所有的时间都以20开头
数据
爬取的数据总共有15页,每页大概30条信息
单个网页
导入库
1 | import re # 正则表达式 |
requests使用
1 | url = "https://tieba.baidu.com/p/6792642821?pn=1" |
正则使用
username_list
通过获取username_list
为例,来讲解正则表达式的使用
效果如下:我们只需要username_list
部分,保存到相应的列表中
content_list
元素如果为空,表示回复的是图片,无法抓取到相应的内容
reply_time_list
源码
1 | # 爬取单个网页的内容到tieba1.csv中 |
全网爬取
过程
format()
方法实现URL地址的更新- requests库的使用
- 正则表达式获取3项内容
- csv模块使用,写入到文件中
1 | import re |
全网数据
通过爬取15
个页面得到的数据如下的表格:
- 3个属性字段
- 464条记录
我们进行的处理是content
字段,分析哪些词语是高频词语
Jieba
参考
https://blog.csdn.net/FontThrone/article/details/72782971
https://github.com/fxsjy/jieba
安装jieba
这是我第一次使用jieba
来进行分词操作,所以需要先进行安装
1 | pip install -i https://pypi.douban.com/simple jieba |
分词
jieba.cut
方法接受4个输入参数:- 需要分词的字符串
- cut_all 参数用来控制是否采用全模式
- HMM 参数用来控制是否使用 HMM 模型
- use_paddle 参数用来控制是否使用paddle模式下的分词模式,paddle模式采用延迟加载方式,通过enable_paddle接口安装paddlepaddle-tiny,并且import相关代码;
jieba.cut_for_search
方法接受2个参数:- 需要分词的字符串;
- 是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
注意点
-
待分词的字符串可以是 unicode 或 UTF-8 字符串、GBK 字符串。注意:不建议直接输入 GBK 字符串,可能无法预料地错误解码成 UTF-8
-
jieba.cut
以及
jieba.cut_for_search返回的结构都是一个可迭代的
generator,可以使用 for 循环来获得分词后得到的每一个词语(unicode),或者用
-
jieba.lcut
以及
jieba.lcut_for_search直接返回 list
-
jieba.Tokenizer(dictionary=DEFAULT_DICT)
新建自定义分词器,可用于同时使用不同词典。
jieba.dt` 为默认分词器,所有全局分词相关函数都是该分词器的映射。
demo
这个是jieba
在GitHub
上面给的一个入门案例,仅供参考学习
1 | # encoding=utf-8 |
处理
- 我们需要处理的
content
字段。jieba
处理的是列表类型的数据,所以现将全部的content
字段中的信息放到一个列表中:
- 将上述步骤中实现的列表
strings
中每个字符串进行分词
1 | # encoding=utf-8 |
分词之后的效果如下:
- 将分词的结果放入到另一个列表
comment
中,方便后续wordcloud
的处理
1 | # encoding=utf-8 |
wordcloud
参考
安装
第一次使用,所以还是需要先进行安装
1 | pip install -i https://pypi.douban.com/simple wordcloud |
数据处理
wordcloud
处理的是一个字符串信息。因此,在进行绘制词云图之前,我们需要先将上面comment
字典中的全部元素放置在一起,然后转成一个整体的字符串。
1 | text = " ".join(i for i in comment) |
效果如下:
生成词云
初步处理
wordcloud
生成词云图是依赖Matplotlib
包,所以需要先安装Matplotlib
(如果没有)
1 | # -*- coding: utf-8 -*- |
wordcloud
默认的图片背景生成的初步效果如下:
进一步处理
从上面的词云图中看出来,有多个非常明显没有任何价值的字符信息,比如:
1 | "男生","女生","就是","因为","可以","不是","自己","什么","知道","这个","地方","而且","东西","这些","或者","基本","所以","怎么","时候","你们","我们","content","女孩","的","我",",","视频","关于","也","就","了","*","是","不","," |
大写的$\color{red}{男生、女生}$占据了整个词云图的绝大部分空间,这样的效果肯定不是我们需要的。我们先在待处理的信息中将它们人为地删除掉:
1 | # 人为设置无效的信息 |
进行删除操作之后,comment
中的无效信息会被删除,再绘制一次词云图。
不同的是,在这里使用了一个图片作为最终结果的背景:
1 | # 人为设置无效的信息 |
效果如下:
另一种颜色对比:
结论
关键词
从改进后的词云图中可以看出来,回复的评论中出现频率高、且有意义(作者的意见😃)的词语是:
- 家里
- 有钱
- 男朋友
- 电脑、游戏、键盘(应该是男生相关的)
- 穷养
- 富养
- 花钱
- 化妆品
结论
- 男生都喜欢电脑和游戏,把钱花在了游戏和装备上
- 女生则喜欢化妆品
- 女生的钱可能一部分来自家庭,一部分来自男朋友
- 家庭对男生、女生的养育态度不同:穷养与富养
大学女生就是有钱😊