上某东的时候,突然给我弹了一个充气娃娃的广告,于是就点进去就看了一下评论,全是神评论啊。所以我就想着把大神们的评论们扒拉下来仔细瞅瞅,于是这篇文章就诞生了,纯属学习啊,不要想入非非啊,还有,不喜勿喷!
按照软件设计流程来:
需求分析-功能描述-技术文档-详细设计-编码-测试-交付-验收-后期维护
1.需求分析:
首先我先找了某东最火娃娃,里面评论近乎7万条,这里面神评论一定不少。所以决定从这个里面扒拉我们想要获取的数据
2.功能描述
- 充气娃娃这种东西,一般大家都在网上见得多,所以玩起来到底感觉怎么样。大家有可能知道,但是我不知道。所以我只能分析一下大伙的使用感受。这次我将获取到的数据统计以词云的方式呈现。这样呈现的数据比传统的统计图更直观且更有艺术感。
3.技术文档
1.使用requests获取某东上的所有评论;
2.使用jieba将获取到的评论切割成单个词语,为词云做铺垫;
3.使用wordcloud生成词云图用以展示数据。
4.详细设计
如上图所示,首先我们F12或者右键打开开发者模式,然后找到Network下面的All,然后随便复制一句评论在下面ctrl+F复制搜索。找到这句评论所在的位置。
找到评论的我所在位置之后,点击左边的Headers,如图上所示的Request URL就是我们所要爬取所有评论的link。
5.编码
找到评论所在的link之后,我们就可以上手coding了。评论有近七万条,每页只有十条评论,所以就是说有近七千多页。但是不要慌,我们先爬取一页数据看看,只要这一页成功了,剩下的页数问题都不大。
首先使用requests获取数据(requests的不会用的童鞋可自行百度哈)
但是,似乎,but没有拿到数据,什么鬼!
分析之后,确定是少了什么东西,首先我们来看看浏览器。
发现了吗?
就是少了这个Refer和UserAgent,回到代码继续完善。。。
可以看到接入Refer和UserAgent之后已经拿到了我们想要爬取的数据。
但是这个json格式的数据看起来怪怪的,怪在哪里呢?前面多了这些fetchJSON_comment98vv7990(,后面多了);
所以我们首先要去掉这些对我们无益的东西来拿到正确的json数据
通过改良,拿到了我们想要的数据。但是我们想要的只是评论啊,这里怎么还有好多评论之外的东西呢?我们返回浏览器继续查看
通过对比发现我们要的评论是在comments下面的content里面,按照这个逻辑,我们首先要进入到comments里面,然后在comments里面遍历出所有的content。
然后将数据保存我们命名的jd_comments.txt文件中。(本来获取到的数据是要放在数据库里面的,咱们在这里将它放入txt文档是为了后面词云的使用)
对比一下,看写入到file里面的内容与我们想要爬取的内容是否一致
接下来似乎单页内容的爬取已经大功告成了,现在我们举一反三来试试多页评论的爬取。
首先我们按照上面的步骤再次复制一段评论
然后通过同样的方法找出它的link对它们进行对比
对比发现除了它们的page不一样之外其余都是一样的。
也就是说它的分页是按照pagesize = 10 的每页十条记录和page = 0,1,2,3,。。。进行分页显示的。
每页十条记录显示是不变的,变的是不断递增的page,所以我们要把这个page设置为一个变量,让他循环增加。
这里说明一下
对get_spider_comments方法加入变量page,当我们指定page的值时,它就可以获取固定页面的评论。
在batch_spider_comments方法中sleep方法,用来模拟用户浏览,防止因为爬取太频繁导致ip被封。
首先我们爬取了100页的数据,可以看到爬取了984行。证明我们的多页爬取也是没有问题的。
为了更加直观方便的看出评论的内容,我们决定使用词云来进行展示。
首先需要我们对jieba和wordcloud进行了解,使用pip install jieba对jieba库进行安装。然后用jieba对获取到的评论进行分词。
然后使用pip install wordcloud再安装wordcloud。最后用generate方法生成词云图。
说明一下,默认生成的词云图是正方形的,但是我在这里引入了imageio的 imread方法 以获取原始图片ball.jpg的参数
然后使用mask=mask 传递形状参数,所以最后我们获取到的就是一张圆形的词云图
所以之后大家可以按照自己的意愿来设置图片的形状。
希望大家可以参考学习,共同进步!!