浅谈Python爬虫(五)

  • 目的:爬取网易云歌单所有歌曲的信息及热评
  • Python环境:3.7
  • 编译器:PyCharm2019.1.3专业版
  • 存储格式:JSON

1、分析网页

进入网易云音乐首页,点击排行版,任选一个歌单(这里以云音乐飙升榜为例),按下F12,点击NetWork,按F5刷新。点击Doc,发现有一个名为toplist的数据,猜测是有用的数据(蹩脚英语翻译)。点开验证(搜索歌名,看里面有没有需要的数据)。如图。

发现包含着音乐名字和音乐id。而进入下层页面需要的正是音乐id。如第一首“嘿”的链接是https://music.163.com/#/song?id=1383742572。
进入歌曲详情页之后,按照同样的步骤进行网页分析。发现Doc里面有一个以音乐id命名的数据,点进去发现只有歌曲基本的信息,如歌曲名字、歌手、所属专辑,但是这也是我们需要的。然而没有找到评论的信息,我们选择去XHR找。
在XHR有一个名为“R_SO_4_1383742572?csrf_token=”的数据,里面包含着评论信息。这是一个POST请求,且参数是采用AES加密算法加密的,笔者没有能力破解,但是笔者偶尔在一篇文章里发现一个链接,可以获取完整的评论信息,所以笔者选择使用这个链接进行爬取。

2、代码编写

首先,第一步需要获取网页源码,这里选择将其写成一个函数,方便后面继续调用。代码如下。

def get_html(url):headers = {'User-Agent': 'Mozilla/5.0'}response = requests.get(url, headers=headers)html = etree.HTML(response.text)return html

然后我们写获取音乐id的函数。代码如下。

def get_song_id(html):# 分析网页找到的音乐id所处的位置id = html.xpath('//ul[@class="f-hide"]/li/a/@href')for i in range(len(id)):# 用正则表达式将数字筛选出来id[i] = re.findall(r'\d+', id[i])return id

由歌曲id可以组成两个链接,一个是歌曲的链接https://music.163.com/song?id=(歌曲id),一个是评论的链接http://music.163.com/api/v1/resource/comments/R_SO_4_(歌曲id)?limit=20&offset=0。我们访问评论链接,发现是一个json数据,所以还需要一个解析json数据的函数。代码如下。

def get_json(url):headers = {'User-Agent': 'Mozilla/5.0'}response = requests.get(url, headers=headers)return response.json()

由音乐id,可以获取音乐的基本信息。代码如下。

def get_song_info(html):song_name = str(html.xpath('//em[@class="f-ff2"]/text()')).replace('[\'', '').replace('\']', '')songer = html.xpath('//p[@class="des s-fc4"]//a[@class="s-fc7"]//text()')[0]special = html.xpath('//p[@class="des s-fc4"]//a[@class="s-fc7"]//text()')[1]data_dict = {'歌名': song_name,'歌手': songer,'专辑': special}return data_dict

由评论信息的json数据,可以获取对应的热评信息。由于由的热评较多,所以我们选择前5个热评,不足5个的则全部获取。代码如下。

def get_comment(json):data_dict = {}if len(json['hotComments']) >= 5:# 当热评数量大于5个时for i in range(5):data_dict['用户名' + str(i+1)] = json['hotComments'][i]['user']['nickname']data_dict['评论' + str(i+1)] = str(json['hotComments'][i]['content']).replace('\n', '')data_dict['获赞数量' + str(i+1)] = json['hotComments'][i]['likedCount']data_dict['发表时间' + str(i+1)] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(json['hotComments'][i]['time'])/1000))else:# 当热评数量不大于5个时for i in range(len(json['hotComments'])):data_dict['用户名' + str(i+1)] = json['hotComments'][i]['user']['nickname']data_dict['评论' + str(i+1)] = str(json['hotComments'][i]['content']).replace('\n', '')data_dict['获赞数量' + str(i+1)] = json['hotComments'][i]['likedCount']data_dict['发表时间' + str(i+1)] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(json['hotComments'][i]['time'])/1000))return data_dict

当把音乐信息及热评信息都获取过来之后,我们选择将其合并,并转换成下面这种格式的JSON数据,然后保存到本地。

{"歌名": ,"歌手": ,"专辑": ,"热评": {"用户名1": ,"评论1": ,"获赞数量1": ,"发表时间1": ,}
}

代码如下。

# data包含着歌曲基本信息,comment包含着评论信息
data['热评'] = commentdata_json = json.dumps(data, ensure_ascii=False)with open('F://SpiderData//网易云.json', encoding='utf8', mode='a') as f:f.write(data_json + ',')print(i)

完整代码如下。

import requests
from lxml import etree
import re
import json
import timedef get_html(url):headers = {'User-Agent': 'Mozilla/5.0'}response = requests.get(url, headers=headers)html = etree.HTML(response.text)return htmldef get_json(url):headers = {'User-Agent': 'Mozilla/5.0'}response = requests.get(url, headers=headers)return response.json()def get_song_id(html):# 分析网页找到的音乐id所处的位置id = html.xpath('//ul[@class="f-hide"]/li/a/@href')for i in range(len(id)):# 用正则表达式将数字筛选出来id[i] = re.findall(r'\d+', id[i])return iddef get_song_info(html):song_name = str(html.xpath('//em[@class="f-ff2"]/text()')).replace('[\'', '').replace('\']', '')songer = html.xpath('//p[@class="des s-fc4"]//a[@class="s-fc7"]//text()')[0]special = html.xpath('//p[@class="des s-fc4"]//a[@class="s-fc7"]//text()')[1]data_dict = {'歌名': song_name,'歌手': songer,'专辑': special}return data_dictdef get_comment(json):data_dict = {}if len(json['hotComments']) >= 5:for i in range(5):data_dict['用户名' + str(i+1)] = json['hotComments'][i]['user']['nickname']data_dict['评论' + str(i+1)] = str(json['hotComments'][i]['content']).replace('\n', '')data_dict['获赞数量' + str(i+1)] = json['hotComments'][i]['likedCount']data_dict['发表时间' + str(i+1)] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(json['hotComments'][i]['time'])/1000))else:for i in range(len(json['hotComments'])):data_dict['用户名' + str(i+1)] = json['hotComments'][i]['user']['nickname']data_dict['评论' + str(i+1)] = str(json['hotComments'][i]['content']).replace('\n', '')data_dict['获赞数量' + str(i+1)] = json['hotComments'][i]['likedCount']data_dict['发表时间' + str(i+1)] = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(json['hotComments'][i]['time'])/1000))return data_dictif __name__ == '__main__':url = 'https://music.163.com/discover/toplist'song_id = get_song_id(get_html(url))for i in range(len(song_id)):song_url = 'https://music.163.com/song?id={}'.format(song_id[i][0])comment_url = 'http://music.163.com/api/v1/resource/comments/R_SO_4_{}?limit=20&offset=0'.format(song_id[i][0])data = get_song_info(get_html(song_url))comment = get_comment(get_json(comment_url))data['热评'] = commentdata_json = json.dumps(data, ensure_ascii=False)with open('F://SpiderData//网易云.json', encoding='utf8', mode='a') as f:f.write(data_json + ',')print(i)

爬取的数据截图如下。

3、结语

如果你按照笔者的步骤来,相信数据是可以顺利的保存到本地的,如果有任何问题,欢迎在下面评论或者私信笔者。谢谢各位的观看。

浅谈Python爬虫(五)【网易云热评爬取实例】相关推荐

  1. Java爬虫——网易云热评爬取

    爬取目标网址 :   http://music.163.com/#/song?id=409649818 需要爬取信息 :   网易云top13热评 使用之前的 HttpURLConnection 获取 ...

  2. python网易云爬虫——实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取)

    Python网易云爬虫--实现网易云歌词的爬取(输入歌手的id,即可实现歌词的爬取) 开始动手 打开网易云音乐,找到任意一位歌手的歌曲界面(我们以邓紫棋的<来自天堂的魔鬼>为例). 第一步 ...

  3. 网易云评论 爬虫 java_网易云音乐资源爬取(登录+评论)

    如何爬取网易云音乐的评论呢? 1.文本以华晨宇的<我的滑板鞋2016>为例 2.使用浏览器的工具,查找获取评论的url 3.不难发现,此API是通过POST请求获得我们想要的评论信息的,需 ...

  4. mysql 去重con_python 爬虫 实现增量去重和定时爬取实例

    前言: 在爬虫过程中,我们可能需要重复的爬取同一个网站,为了避免重复的数据存入我们的数据库中 通过实现增量去重 去解决这一问题 本文还针对了那些需要实时更新的网站 增加了一个定时爬取的功能: 本文作者 ...

  5. Python爬虫实践-网易云音乐

    1.前言 最近,网易的音乐很多听不到了,刚好也看到很多教程,跟进学习了一下,也集大全了吧,本来想优化一下的,但是发现问题还是有点复杂,最后另辟捷径,提供了简单的方法啊! 本文主要参考 python编写 ...

  6. python爬取网易云热评

    在爬取了妹子图之后,感觉总想再爬点什么东西增加编程兴趣,因为平时喜欢听歌嘛,然后就想到了爬取网易云热评,一首歌无数个故事23333- 首先打开网易云音乐网页版,找到自己想要爬取的那首歌(我这里搜的是隔 ...

  7. python爬取网易云音乐_Python 从零开始爬虫(七)——实战:网易云音乐评论爬取(附加密算法)...

    前言 某宝评论区已经成功爬取了,jd的也是差不多的方法,说实话也没什么好玩的,我是看上它们分析简单,又没加密才拿来试手的.如果真的要看些有趣的评论的话,我会选择网易云音乐,里面汇聚了哲学家,小说家,s ...

  8. python 模拟浏览器selenium_浅谈python爬虫使用Selenium模拟浏览器行为

    前几天有位微信读者问我一个爬虫的问题,就是在爬去百度贴吧首页的热门动态下面的图片的时候,爬取的图片总是爬取不完整,比首页看到的少.原因他也大概分析了下,就是后面的图片是动态加载的.他的问题就是这部分动 ...

  9. 如何用python抓取文献_浅谈Python爬虫技术的网页数据抓取与分析

    浅谈 Python 爬虫技术的网页数据抓取与分析 吴永聪 [期刊名称] <计算机时代> [年 ( 卷 ), 期] 2019(000)008 [摘要] 近年来 , 随着互联网的发展 , 如何 ...

最新文章

  1. python gil_Python GIL(Global Interpreter Lock)
  2. Error creating bean with name ‘org.springframework.security.oauth2.config.annotation.web.configurati
  3. 五阶行列式的对角线之和,函数实现
  4. Private Data Manipulation in Optimal Sponsored Search Auction
  5. Android之可以做的两件坏事---破解锁屏密码和获取Wifi密码
  6. 有的人走着走着就散了!
  7. HDU Integer's Power(容斥原理)
  8. 利用DHT22和Arduino测量温湿度并显示在串口和OLED显示屏上
  9. Windows 8 Directx 开发学习笔记(五)山峰河谷模型的简单实现
  10. android studio进度条的应用,Android Studio实现进度条效果
  11. django获取客户ip
  12. [导入]Manning.Ajax.in.Action.Oct.2005.pdf(9.26 MB)
  13. ANSYS 有限元分析 网格划分
  14. 计算机开机时10声响,电脑开机报警的声音有什么含义?详细教您认识报警声音
  15. 51单片机(流水灯)
  16. 2019美国数学建模大赛A+D题翻译
  17. Windows Server 2016 路由和远程访问
  18. 我的window10
  19. Javashop多用户商城系统源码 云表-无代码开发平台 框架源码
  20. 后台打log(便于查看问题和调试)方法

热门文章

  1. 已解决error: legacy - install - failure
  2. S32K148 flash驱动优化
  3. 3.13 采购到货计划下达
  4. PCA9555PW 原厂封装 新到货
  5. python图片处理之图片缩放
  6. implicit 关键字
  7. 初识-语义依存分析SDP
  8. Linuxvim 中批量添加注释
  9. python3 format函数 详解
  10. java 线程 进度条_关于Java进度条多线程调用问题,一个很实用的问题,希望熟悉多线程编程的高手看看...