在 17 的四月份, 我曾经写了一篇关于网易云音乐爬虫的文章, 还写了一篇关于评论数据可视化的文章在这大半年的时间里, 有时会有一些朋友给我发私信询问一些关于代码方面的问题所以我最近抽空干脆将原来的代码整理了一下, 做成了一个 Python 模块 NetCloud 放在 Pypi 上了目前只是对原来的代码做了一些整理与重构, 功能还很不完善, 后续打算抽空继续完善, 如果有人用的话可能会长期维护下去
目前只需要使用命令 pip install NetCloud 即可以完成模块的安装, 支持 Windows 与 Linux 系统, 以前代码是基于 python2 的, 现在支持 Python3(我简单测试了一下 python3.6 应该也没问题了),python2 下运行应该也基本没问题, 但是考虑到编码问题, 以及 Python 社区即将在 2020 年不再支持 2.x 的版本, 所以强烈建议使用 Python3.x 运行模块代码 github 的地址是 Netcloud
关于实现功能以及一些主要接口的说明:
1. 主要实现了:
- 对于一首歌曲全部评论的抓取, 保存为 csv 文件格式
- 对于一个歌手全部热门评论的抓取, 存为 csv 文件
- 对于一首歌曲下全部评论用户基本信息的抓取, 包括: 用户主页 url, 用户年龄, 听歌次数, 动态次数, 用户所在地区, 用户动态总数等, 这些信息也存为 csv 文件格式
- 利用全部评论以及热门评论分词生成词云, 统计关键词的频率
- 利用一首歌曲全部评论用户的信息, 基于 pyecharts 可视化, 包括: 用户所在地区分布使用 geo 表示(地图), 用户年龄的分布, 用户听歌数目的分布, 用户动态的数目分布, 歌曲评论数量关于时间的分布等等以前是基于 matplotlib 来做的, 但是只能生成静态的图片, 而 pyecharts 可以产生基于网页的交互式的显示效果, 我感觉效果可能会更好一点
- 以前抓取是单线程的, 效率较低, 现在支持多线程了, 可以极大地提高抓取效率
2. 还需要去完善的(Todolist)
- 如何很好的应对反爬我实验发现, 在开启多线程的情况下, 抓取一段时间服务器可能会限制抓取(封 ip), 目前应对的措施主要是开启代理 ip, 不过如何找到较高质量的代理 ip 地址, 就只能自己去想办法了
- 目前还不支持模拟登录网易云音乐, 查看个人信息, 听歌记录等, 不过 Python 里应该已经有其他模块做到了这一点, 而且这个应该也不是特别难, 后面有空会加上
- 目前还不支持对于歌单的批量抓取, 以及获取用户听歌的详细记录, 后续考虑增加如果有这部分数据, 可以深挖更多东西, 比如预测用户听歌风格, 对用户按听歌洗喜好分类, 以及做推荐等等
- 目前的分析仅限于简单的分析统计等等, 后续考虑加入更深入的 NLP 分析
3. 安装以及主要的函数接口
- 安装很简单, 只需要 pip install NetCloud, 因为模块以来于一些第三方库, 所以在安装这些第三方库的时候可能会出现问题, 可以参考 4 的说明
- 快速使用, 一个简单的例子如下:
- from NetCloud.NetCloudCrawler import NetCloudCrawl
- from NetCloud.NetCloudAnalyse import NetCloudAnalyse
- if __name__ == '__main__':
- song_name = "敢爱"
- song_id = 186888
- singer_name = "张国荣"
- singer_id = 6457
- crawler = NetCloudCrawl(song_name,song_id,singer_name,singer_id)
- crawler.generate_all_necessary_files(threads=10)
- analyse = NetCloudAnalyse(song_name,singer_name,song_id,singer_id)
- analyse.generate_all_analyse_files(threads=20)
3.1 上面的 10 行左右的代码就完成了对于张国荣的敢爱这首歌的全部评论的抓取, 张国荣歌曲热门评论的抓取, 以及歌曲用户基本信息的抓取, 并生成了相应的词云图片, 以及一些基本的可视化分析产生的文件结构如下图所示:
首先生成文件全部都会在 songs 这个文件夹下, 然后对于每一首歌曲会产生以歌手名字命名的文件夹, 然后是歌曲名字的文件夹, 最后是相应的抓取文件, 比如敢爱. csv 就是敢爱的全部评论文件, 敢爱. jpg 就是歌曲评论的词云图片, hot_comments.csv 是歌手的热门评论文件, 最后所有的可视化结果都存放在 plots 文件夹下, 可视化文件为 html 文件需要在浏览器打开查看可视化结果
3.2 模块主要是两个类, 一个是 NetCloudCrawl, 用于数据抓取; 另一个是 NetCloudAnalyse 用于数据的分析 NetCloudCrawl 的 generate_all_necessary_files 函数会生成必要的全部评论文件, 热门评论文件, 支持多线程, 默认是开启 10 个线程抓取 NetCloudAnalyse 的 generate_all_analyse_files 顾名思义会产生全部的可视化文件, 首先它会抓取用户的全部信息存入文件, 然后产生一系列的可视化分析文件(html 格式), 最后会产生评论的词云文件基本上调用这两个函数就可以轻松使用 NetCloud 的主要功能了
3.3 如果你想自定义抓取, 或者不想使用提供的可视化函数接口, 也可以使用模块的其他基本函数完成抓取和分析, 模块的主要函数接口调用格式说明如下:
NetCloudCrawl 类
- AES_encrypt(text,key,iv) 这个函数用于网易云 API 的解密, 基本用不到, 不用管
- get_params(page) 获得必要的解密参数
- get_all_comments() 获取全部评论
- get_hot_comments() 获取热门评论
- get_json(url,params, encSecKey) 获取网易 API json 文件
- threading_save_all_comments_to_file(threads = 10) 使用多线程将全部评论文件存入文件, 默认是 10 个线程
- save_pages_comments(begin_page,end_page) 将 begin_page 到 end_page 页的评论存入文件, 主要是供 threading_save_all_comments_to_file 函数调用
- save_to_file(comments_list,filename) 将评论信息列表 comments_list 存入 filename 文件
- save_all_comments_to_file() 单线程按顺序保存全部评论文件
- get_singer_hot_songs_ids(singer_url) 得到歌手全部热门歌曲 id 列表, singer_url 为歌手信息页 url
- save_singer_all_hot_comments_to_file() 将歌手的全部热门评论存入文件
- generate_all_necessary_files(threads = 10) 生成全部必要的文件, 包括歌手的全部热门评论文件, 以及歌曲的全部评论文件
- _test 开头的均为测试函数, 请不要调用
NetCloudAnalyse 类
- load_comments_csv() 加载全部评论文件为 dataframe 格式(pandas)
- save_users_info_to_file() 保存歌曲评论下全部用户 (已去重) 的信息到文件(单线程)
- threading_save_users_info_to_file(threads = 10) 采用多线程保存用户信息到文件, 默认是 10 个线程
- save_users_info(users_url,total) 供 threading_save_users_info_to_file 调用的中间函数, 不用管
- count_comments_lines() 统计全部评论文件的行数
- from_timestamp_to_date(time_stamp,format = "%Y-%m-%d %H:%M:%S") 将时间戳转日期的函数, 默认格式是: 年 - 月 - 日 时: 分: 秒
- load_users_url() 返回全部评论用户主页 url 列表, 用于后续用户信息抓取
- load_users_info_csv() 从用户信息 csv 文件加载用户信息 dataframe
- draw_wordcloud(full_comments = True) 绘制评论关键词的词云, full_comments = True 表示绘制 全部评论, False 表示绘制热门评论
- core_visual_analyse() 核心的对于评论用户信息的可视化分析, 产生的 html 文件有 12 个, 说明如下:
1. age_count_bar.html 年龄分布(bar 为 柱状图表示, 下同)
2. agree_count_bar.html 赞同数分布
3. comments_keywords_bar.html 评论关键字分布(已去除停用词)
4. comments_year_month_bar.html 评论数量按年月的分布
5. comments_year_month_day_bar.html 评论数量按年月日的分布
6. description_keywords_bar.html 用户简介关键词分布
7. events_count_bar.html 用户动态数目分布
8. fans_count_bar.html 用户粉丝数量分布
9. follow_count_bar.html 用户关注者数量分布
10. listening_songs_count_bar.html 用户听歌数量分布
11. users_city_geo.html 用户所在地区分布, 使用地图可视化表示
12. users_location_bar.html 用户所在地区分布, 使用柱状图表示
一些可视化实际的效果图如下:
- load_stopwords() 加载停用词列表
- load_all_cities() 加载中国全部城市名称列表
- generate_all_analyse_files(threads = 10) 生成全部的分析文件, 包括评论关键字词云以及评论用户信息的可视化, 默认线程数为 10
- _test 开头的为测试文件, 请不要调用
4. 一些可能会出现的问题
4.1 在 pip install NetCloud 的过程中, 如果是在 Windows 下, wordcloud 以及 pycrypto 模块也许会安装失败, 此时可以去 python 非官方第三方库下载下载对应 pyhton 版本的预编译 wheel 文件, 然后手动 pip 安装即可另外, numpy 需要 numpy+mkl 形式的库, 也可以在这个网站下载
4.2 由于我没有测试完全, 而且代码水平有限, 因此代码肯定存在一些意想不到的 bug, 如果您对这个模块感兴趣, 在使用的过程中出现任何问题或者有任何建议, 欢迎给我留言, 当然最好的方式是去 github 提 issue, 地址是 NetCloud, 同时欢迎 star 和 fork, 谢谢支持
来源: https://www.cnblogs.com/lyrichu/p/8414434.html