陈为靖---第一次个人编程作业

课程实况

博客班级 2018级计算机和综合实验班
作业要求 第一次个人编程作业
作业目标 爬取腾讯视频《在一起》评论、利用分词器对评论做词频统计、通过echarts绘制词云图
作业源代码 GitHub源码地址
学号 211806158

时间安排

过程 预计时间 实际时间
分析网页爬取规律 0.5h 0.5h
编写评论爬取代码 1.5h 2.5h
爬取评论数据 5h 10h
将评论进行词频处理 2h 3h
绘制词云图 2h 3h
上传相关材料到github 1h 3h

爬虫实现过程

一、分析网页URL结构

打开腾讯视频《在一起》网页查看网页,每次点击“查看更多评论”可在原网页基础上出现更多的评论,可以很明显的发现网页数据属于异步加载

点击影评旁的红框标出的评论数,可以进入评论的网页

通过F12进入开发者模式,重新刷新网页,会发现当前评论存放的地址

在评论网页点击“查看更多评论”,会发现每多点击一次,会多生成一个以v2?callback=_article 命名的文件,其中Request URL是新显示评论的源网址

对比两个不同的Request URL 会发现:

  • 两个article后面红框的数字:确定《在一起》每集评论的地址
  • 黄框cursor后的数字确定单集评论中部分评论(一般为10条评论)的地址
  • 值得注意的是,每集最初的评论网页中cursor的值为0(cursor=0)
  • 蓝框部分在构造爬取地址时可以直接舍去,对爬取过程没有影响

单个评论网页可以构造为:

url = 'https://coral.qq.com/article/'+id+'/comment/v2?callback=_article'+id\
              +'commentv2&orinum=10&oriorder=o&pageflag=1&cursor=' +cursor

在单个网页中可以发现:


  • last: 数字对应网址URL中cursor中的数字
  • oricommitList:存放评论内容(基本为10条)

在构造20集不同的地址时,出于偷懒直接将控制20集地址不同的数值直接保存下来,用作循环

    ID = ['5963120294','5963137527','5963276398','5963339045','5963339045','5974620716','5979269414',
          '5979342237','5979747069','5979699081','5980549863','5980559005','5990521528','5984189515',
          '5984155079','5984165842','5995355954','5995862740','5991853633','5991863028']  #《在一起》20集集评论不同的地址
    for id in ID: # 循环得到20集全部评论
        url = 'https://coral.qq.com/article/'+id+'/comment/v2?callback=_article'+id\
              +'commentv2&orinum=10&oriorder=o&pageflag=1&cursor=0' # 构造每一集评论的初始地址

二、在爬取数据时产生的问题和部分解决

  1. 部分网页没有10条评论数,所以需通过每个网页中orireqnum来确定该网页的评论数
    num = json1["data"]["oriretnum"] #确定每页评论数
    with open('comments.json', 'a+', encoding='utf-8') as file: # 每页评论写入json文件
        for i in range(int(num)):
            comments = str(json1["data"]["oriCommList"][i]["content"]).replace("(","").replace(")","")
            file.write(json.dumps(comments, ensure_ascii=False)+'\n')
  1. 单集评论数可能出现部分遗漏,且github上传评论数据集时,好像大于1MB便不能直接查看,故上传时将评论数据集分成了3份,如需要使用,将三份数据合并后使用。

3.《在一起》评论数太多,故在深夜爬取,睡一觉起来还没爬完...所幸的是没有遭到防爬。

数据处理及生成词频

在分词处理过程中,采用了jieba分词器,详细可以查看结巴中文分词

1. 将每条评论进行关键词的提取并做词频统计

        seg_list = jieba.analyse.extract_tags(jsonstr, topK=10)  #关键词过滤

2. 筛选关键词,通过导入停用词表将没用的标点符号和部分中文去除,同时排除出现次数<=5的词(PS:个人觉得出现次数太少不具代表性)

for key in list(dic.keys()):
    if key in stop_keyword or dic[key] <= 5:
        del dic[key] #出现次数小于等于5的词没有较大的参考意义,故删除
        continue

++这里我采用了中文常用停用词表中的哈工大停用词表,同时可以先跑一边程序,如果部分显出出来的词不尽人意,可以手动添加到停用词表中++

3. 将词频格式设置成echarts可用的格式。

commentlist = []
for key in dic.keys():
    comment = {}
    comment["name"] = key
    comment["value"] = dic[key] #将单个词和出现次数组成键值对
    commentlist.append(comment)

生成词云图

  1. 当前echarts官网中没有词云图的相关使用文档,故在官网中扩展下载中选择词云图(字符云)

  2. 根据词云图(字符云)提供的词云图模板

  3. 将我们自己的词频数据导入,就可以很快生成所需的词云图

        var option = {
            tooltip: {},
            series: [ {
                type: 'wordCloud',
                gridSize: 2,
                sizeRange: [12, 50],
                rotationRange: [-90, 90],
                shape: 'pentagon',
                width: 600,
                height: 400,
                drawOutOfBound: true,
                textStyle: {
                    color: function () {
                        return 'rgb(' + [
                            Math.round(Math.random() * 160),
                            Math.round(Math.random() * 160),
                            Math.round(Math.random() * 160)
                        ].join(',') + ')';
                    }
                },
                emphasis: {
                    textStyle: {
                        shadowBlur: 10,
                        shadowColor: '#333'
                    }
                },
                 data: [{'name': '点赞', 'value': 487}, {'name': '片酬', 'value': 94}, {'name': '出演', 'value': 111}, {'name': '这部', 'value': 681}, {'name': '演员', 'value': 566}, {'name': '追完', 'value': 52}, {'name': '抗疫', 'value': 696}, {'name': '致敬', 'value': 2421}, {'name': '最美', 'value': 657}, {'name': '再来', 'value': 35}, {'name': '英雄', 'value': 1411}, {'name': '行者', 'value': 733}, {'name': '一位', 'value': 221}, {'name': '一起', 'value': 737}, {'name': '护士', 'value': 315}, {'name': '使命感', 'value': 16}, {'name': '医生', 'value': 613}, {'name': '前线', 'value': 134}, {'name': '伟大', 'value': 805}, {'name': '不想', 'value': 87}]
            } ]
        };

        chart.setOption(option);
        window.onresize = chart.resize;
    </script>
</body>

效果图

GitHub上传

在做作业的过程中,发现将代码和文档上传至GitHub也是难题之一。(还是GitHub使用的太少了)所以看了一些廖雪峰老师的教程和万能的百度

单文件上传过程如下:

git checkout chart #切换到chart分支
git add index.html #将index.html文件添加到暂存区
git commit -m "xx:xxx" #将文件交暂存区到本地仓库并填写备注信息
git push -u origin chart # 将本地版本库的分支推送到远程服务器上对应的分支

将两个分支分别合并到主分支

git merge chart #将chart分支合并到主分支
git push  # 推送到对应分支

git在pull或者合并分支的时候可能会遇到这个界面

  1. 按键盘左上角"Esc"
  2. 输入:wq 按回车键即可(保存退出)

遇到的问题

  1. 爬取评论的过程中,没有将各个评论下的回复等一并爬取,造成了爬取信息的不完整。
  2. 由于遍完善代码边上传代码文件到GitHub,导致文件多时,部分文件命名可能没按要求且较为复杂,下次应认真避免。
  3. echarts运用不熟练,在绘制时基本按照他人模板修改。

参考资料

廖雪峰-Git教程
Commit message 和 Change log 编写指南
关于Echarts词云图自定义形状如何实现
结巴分词原理及使用

posted @ 2021-02-26 20:03  sleepyhead0  阅读(95)  评论(0编辑  收藏  举报