Python网络爬虫-爬取云音乐评论(4)

768 阅读2分钟

「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

我们先复习下昨天文章的内容,1.定位位置目标;2.下载网页;3.设置加载速度,找到目标文件。先随便打开网易云的一首歌

https://music.163.com/#/song?id=25723157

每首歌的id就是后面那串数字。所以原则上我们只要搜集对应歌曲进到播放页,就能拿到id号。这样很容易做成循环,爬取多首歌的所有评论了。

def get_comments(url):
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36',
        'referer': 'http://music.163.com/'
        }

    params = "EuIF/+GM1OWmp2iaIwbVdYDaqODiubPSBToe5EdNp6LHTLf+aID/dWGU6bHWXS0jD9pPa/oY67TOwiicLygJ+BhMkOX/J1tZMhq45dcUIr6fLuoHOECYrOU6ySwH4CjxxdbW3lpVmksGEdlxbZevVPkTPkwvjNLDZHK238OuNCy0Csma04SXfoVM3iLhaFBT"
    encSecKey = "db26c32e0cd08a11930639deadefda2783c81034be6445ca8f4fbedd346e1f9567375083aeb1a85e6ad6d9ae4532a49752c2169db8bcc04d38a79f9bed7facea42ee23f1b33538c34f82741318d9b4b846663b53b0b808dd0499dccfbc6c61fbf180c6fb24b1c2dd3c2c450ce09917d74be9424dab836fd2e671988ffbc6ae1b"
    data = {
        "params": params,
        "encSecKey": encSecKey
        }

    name_id = url.split('=')[1]
    target_url = "http://music.163.com/weapi/v1/resource/comments/R_SO_4_{}?csrf_token=".format(name_id)

    res = requests.post(target_url, headers=headers, data=data)

    return res

params 和 encSecKey 是服务器想要的数据,这两是加密过的内容。 拿到的core.js文件,由于该js文件非常庞大,我们可以根据关键词encSecKey检索,定位到关键代码段 同样,POST上去的这两个参数,同样可以用在其他歌曲上。

image.png

评论找到了,之后,我们就要提取关键的数据。我们可以看出,爬到的数据是JSON格式。JSON是一种轻量级的数据交换格式,在网络传输中经常会用到它。

使用JSON.LOADS()方法可以将字符串还原为Python的数据结构:

comments_json = json.loads(res.text)

这样字典中的“hotComments”键对应的值就是所有的精彩评论!

def get_hot_comments(res):
    comments_json = json.loads(res.text)
    hot_comments = comments_json['hotComments']
    with open('hot_comments.txt', 'w', encoding='utf-8') as file:
        for each in hot_comments:
            file.write(each['user']['nickname'] + ':\n\n')
            file.write(each['content'] + '\n')
            file.write("---------------------------------------\n")

至此,将前面的部分结合起来,就可以得到我们想要的效果了!

image.png

另外网易云音乐 API接口形式如下:music.163.com/api/v1/reso…

需要说明的是,爬虫如果频率过快,数量过多,服务器会封IP。因此更完备的爬虫项目,是需要设置代理和IP池的。

另外,不想执着于破解post表单参数的朋友,可以试着用python+selenium+PhantomJs的方式模拟用户操作,点击翻页后,再直接解析页面元素,这样可以做到“可见即可爬”,不过效率会略低一些。