导语
今天需要跟大家分享关于如何爬取网易云热门评论的。
对于网易云,相信大家都不陌生。博主便常常使用网易云音乐,一方面是为了听歌,愉悦身心,另一位方面是冲着网易云评论来的。在网易云音乐,相信你总能阅读到各种好玩又古怪的评论,或爱情、友情、或是段子、搞笑。当然的,也不乏相当精彩的美句,亦或相当精辟的人生哲理。而我们今天需要做的便是将这些精彩评论 爬取下来,保存到本地or服务器中,以供自己欣赏,或者运用。
在这里,我们选择运用Python来完成这项任务,你需要具备一些基础的Python知识,以及相关库的运用知识。以下是本教程运用到的Python第三方库:re
requests
sqlalchemy
apscheduler
在导入使用这些库前,你需要使用Pip进行安装,这里不再累赘,不会的小伙伴请自行百度补习。
此外如果你选择将数据上传到服务器,你需要具备一定的数据库知识,这里以Mysql为例。
热身
对于requests、re相信大家早已轻车熟路,能够运用自如,这里不再多说。
但值得一提的是,部分小伙伴可能对sqlalchemy (Python对象关系映射工具Object Relational Mapping)不大熟悉,甚至没听说过。这里有必要跟大家简单讲解一下。简而言之,ORM(对象关系映射)将数据库中的表与面向对象编程语言(Python便是一门面向对象的语言)中的类(Python中的Class)建立起一对应的映射关系,当我们需要操作数据库or数据库中的表格时,只需要通过操作 类 类或类实例来完成,从而简化、方便我们的数据库操作,不用像在服务器一样需要输入SQL命令来完成任务。
首先需要通过pip安装sqlalchemy,Python3.0上在命令行执行一下命令:pip install sqlalchemy
安装完成后,我们在python中导入sqlalchemy,并初始化DBSession,创建一个session回话。from sqlalchemy.orm import sessionmaker
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, VARCHAR, Integer, create_engine
# 定义User对象:
class MusicComment(Base):
# 表的名字:
__tablename__ = 'music_comment'
# 表的结构:
id = Column(Integer, primary_key=True, autoincrement=True)
music_name = Column(VARCHAR(128), nullable=False, index=True, comment="音乐名称")
music_author = Column(VARCHAR(128), nullable=True, index=True, comment="音乐演唱者")
music_platform = Column(VARCHAR(32), index=True, nullable=False, comment="音乐平台")
music_url = Column(VARCHAR(512), index=True, nullable=False, comment="音乐网址")
comment_user = Column(VARCHAR(64), index=True, nullable=False, comment="评论用户")
comment_liked = Column(Integer, nullable=False, comment="评论被赞次数")
comment_text = Column(VARCHAR(1024), index=True, nullable=False, comment="音乐评论内容")
def __repr__(self):
return f"MusicComment: {self.comment_user} - {self.music_name}-{self.music_author}"
# 初始化数据库连接:
engine = create_engine('mysql+pymysql://username:password@host:port/database_name')
# 创建DBSession类型:
DBSession = sessionmaker(bind=engine)
# 创建sesion回话
session = DBSession()
如上所示,我们定义了一个MusicComemnt类,其继承于sqlalchemy下的declarative_base, 使我们的Python类与数据库中的表格建立起某种关系,当我们需要添加、删除评论时,只需要操作这个类即可实现。
另外有些知识你需要知道的是,MusicComment中的__tablename__代表数据库中的表格名称。若你此前已经建立关于 音乐评论 的表格,__tablename__应当与其保持一致。
在MusicComment类中,一行属性代表一列(除__tablename__外),以music_name 一行为例。music_name既是变量名称,也是数据库表格中列的名称,Column表示一列,Column中的 VARCAHR(128) 表示最大128字节的变化字符串,nullable=False 表示该行必填,不可省略, index=True 表示支持索引操作,comment="音乐名称"为添加注释,注明该行的意义。此外 primary_key=True 表示将该行设置为主键, autoincrement=True 表示该行变量自动递增。nullable、index、comment都是可选参数。
Create_engine方法中的参数表示的是 数据库链接地址。//前面部分基本不变(你需要提前使用 pip 安装 pymysql),后面表示数据库的相关连接信息,如英文意思所示。
到这里,如果你的设置正确,MuiscComment与你的数据库已建立对象映射关系,下面的数据库操作将变得非常简单。new_user = MusicComment(music_name="Cooper's music",
music_author="Cooper",
music_platform="NetEaseCloud",
music_url="http://music.163.com/song?id=xxxxxx",
comment_user="Cooper's fan",
comment_liked=9999999,
comment_text="技术改变世界,科技创造未来!")
session.add(new_user)
session.commit()
session.close()
在这里,我们实例化了一个MuiscComment类,并传递了相关的必要参数,其中id是数据库表格中的自动增量,不需要我们填写。实例化之后,我们将这个实例添加到session回话中,后将回话进行提交操作,最后关闭回话,这样一条评论就被我们顺利地添加到我们的mysql数据库中存储起来了。
到这里,你已经基本掌握了sqlalchemy的基本用法,若你能逐行地理解、弄懂,你已经基本入门Python关于ORM的操作,而对于我们这个教程而言,这基本的操作已经足够我们完成任务。更多sqlalchemy 知识,请自行探索。
正文
思路构思
现在,我们可以正式进入我们的爬虫环节了。
首先,我们需要思考两个问题:一是如何尽可能的收集尽可能多的评论,挑选出最精彩的评论;二是如何尽可能的过滤评论。
对于第一个问题,我们选择爬榜单的形式。在网易云音乐排行榜中,有许多个音乐榜单,诸如新歌榜、热歌榜等,每个榜单又囊括了数十到数百个音乐,而这些榜单是会更新的,因而我们只需要每天的定期重复执行我们的爬虫去收集,就可以实现我们的目标了。当然的,你也可以通过首页的 歌手 入口, 爬取歌手信息,进入歌手页面后再收集歌手音乐信息,进行一次性完成爬取任务,这里博主有编写相关的代码,但尚未完工,不在此过多讲解。
对于第二个问题,通常我们都认为,点赞数越高的评论 应当可以被认为是精彩的评论, 因而,我们只需要设定一个评论点赞数阈值,采集阀值以上即可。
抓包分析
待续