最近爬取了简书上面自己文章的数据,进行了数据分析处理和可视化呈现,同时也制作了最终的词云图,主要是想知道最近2
年都干了什么
这次爬取和以往很大的不同的是:网页是ajax
动态加载的,对网页构造的分析和花费了很长的时间,还去B站上看了崔庆才大佬的视频,所以整体上还是加大了难度。
爬虫真的不简单呀😄东西越学越多,也越难,但是当爬取到数据之后也更开心咯!哈哈哈😃
本文中获取到的数据仅供学习使用,未用作任何商业用途;如有转载,请注明出处及作者
周末美食
这是本周的美食,很赞👍制作特点总结一下:
- 蒜多点
- 放点红椒或者胡萝卜丁,颜色更好些
- 最后焖的时候,水少些😃
爬取内容
- 题目name
- 简介abstract
- 砖石数Masonry(后来省略)
- 观看Watch
- 评论comment
- 点赞like(praise)
- 时间time
以简书上面的一篇文章为例来进行解释。本来也想把砖石数爬取下来进行分析,但不是每篇都有文章都有砖石数,所以没有获取这个数据Masonry
数据
总共有530
篇文章,但是不知道为什么爬出来总是只有527=58*9+5
篇。在最后一页的爬取中总是只有5
条
因为网页的代码结构是一样的,爬不出来,很是无解😭暂且就这样子咯
实际爬到的数据只有527
条:
网页结构
ajax网页
这是第一次爬取ajax
动态加载的网页数据,知乎上看到一篇关于ajax
的讲解:
AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。
举一个例子,打开这个页面,先不要动,观察右边滚动条的长度,然后当你把滚动条下拉到底之后,滚动条就变短了,即页面变长了,也就是说有一部分数据是这个时候才加载出来的。这个过程就是动态加载,基于ajax技术。我们可以看到在拉动滚动条的时候,页面上的数据变多了,但是URL始终没有变化,它不是像翻页那样将数据存到了另一个网页。
https://zhuanlan.zhihu.com/p/35682031
网页更新
比如在这个网页的源码中,当右侧栏中的滚动条静止不动的时候,只有9篇文章即9个<li></li>
标签对
现在当滚动条向下滑动的时候,li
标签会自动更新
网页规律
针对ajax
加载的网页,在右键—检查—Networks—XHR
中查看:
通过headers
获取一条URL
地址:
这样我们就找到了整个爬取的URL地址,可以实现全网数据的爬取
爬取数据
导入库
1 | import re |
获取网页内容
使用requests库获取网页内容
1 | url = "https://www.js.com/u/635acc145?order_by=shared_at&page=1" |
爬取单个字段
以name
为例:
其他字段的正则表达式为:
1 | abstract = re.findall('<p class="abstract">\s*(.*?)\n\s*</p>', result, re.S) |
最好是检查每个字段每页的个数是否为9个:
时间的爬取到的只是具体的时间,不要年月日
全网爬取
URL地址和请求头需要进行更换
1 | # from multiprocessing import Pool |
数据处理
全网数据
通过上面的代码得到了全网的数据:
字段信息
time字段
排序
首先根据time
字段进行排序
1 | df_sort = df.sort_values("time") |
属性改变
解决的是将time
字段的object
数据类型改成和时间相关的。
后面发现:不用处理好像也可以正常处理time字段😭
散点图
横坐标是文章的名称name
,纵坐标是发表的时间time
,颜色是点赞次数like
1 | fig = px.scatter(df_sort,x="name",y="time",color="like",height=900,width=1350) |
time标记处理
处理规则
人为地将发表文章的时间分为4个阶段,并且用不同的数值表示:
- 零点-早上8点:1
- 早上8点-下午2点:2
- 下午2点-晚上8点:3
- 晚上8点-晚上12点:4
增加flag字段
增加一个新的字段flag
来标记上述信息:
1 | for i in range(len(df_sort)): |
1 | fig = px.scatter(df_sort,x="flag",y="time",color="flag",height=800,width=1350) |
绘图
结论
通过上述图形可以看出来,在第4个阶段里面发表文章的概率是比较大的,说明大部分文章是晚上发表的:和实际情况也是符合的😃
read字段
数据信息
绘图
1 | # 绘图 |
结果
结果的部分截图,可向右侧滑动
另一种绘图方式:
1 | px.bar(x=read.index,y=read.values,color=read.index,range_color=[10,100000],height=800,width=30000) |
comment字段
绘图
主要是对每篇文章的评论数量进行统计分析和制图
结论
从上面的饼图看出来:评论数为0的文章占据了绝大多数,接近90%;评论数为2的文章其次
还是很少人评论呀😭😭
like字段
数据
绘图
1 | # 绘图 |
结论
- 点赞1次的文章最多,2次的文章其次
- 最多的点赞次数是38次
- 居然还有一篇文章一个赞👍都没有😭
词性分析与词云图
-
处理的是文章标题字段
name
,分析标题中哪些出现的频率高,则作为重点学习的对象 -
主要是使用
jieba
分词与wordcloud
制作词云图
Jieba词性分析
生成列表
实现分词
1 | # 2-实现分词 |
分词结果放入列表
1 | # 3-将分词的结果全部放入一个列表中,方便后续处理 |
jieba使用总结
- 将待处理的句子放入列表中
- 对列表中的每个句子分词
- 将上面步骤中的分词结果放入到另一个列表中,方便后续处理
Wordcloud词云图
绘图
1 | from wordcloud import WordCloud |
初步结果
图中的札记实在是眨眼呀
这是因为自己Python札记写了很多的原因;另外3个比较突出的词语:利用、进行、数据分析是因为自己看了《利用Python进行数据分析》这本书
进一步处理
删除几个无价值的信息之后再进行绘图,选择了一个背景图:
1 | noUse = ["札记","利用","进行","打卡","笔记","学习"] |
1 | from os import path |
结论
从上面优化后的图形中可以看出来:
Python
是最突出的。的确如此,写的文章很多是关于Python
的数据分析
是一个亮点:因为《利用Python进行数据分析》这本书,还有就是很多pandas的文章MySQL
也是另一个亮点:学习了很多数据库的知识,包含:MySQL、SQL、Sqlzoo、数据库等- 机器一词是出自于机器学习中的,吴恩达老师带我入门的,学了很多的入门知识:吴恩达老师的视频、算法、数据结构等
深圳
二字主要是因为到了深圳之后,在深圳写了很多文章,甚至有些文章也是关于深圳的
数据还是非常准确的,很有参考价值👍数据不会说谎