其实我们都是“歌手”

本文探讨了音乐作为人类情感高级表达的方式,指出即使五音不全的人也能通过哭和笑等基本情绪反应感知音乐。音乐家通过组合音调表达更细腻的情感,揭示了每个人都是潜在的“歌手”。

        有人说音乐真是一种奇妙的艺术,它能陶冶人们的情趣,也能激发深藏不漏的情感。其实音乐离我们并不遥远,我们每个人都是"歌手”

        小时候经常看抗战剧,剧中经常响起《松花江上》。每每听到这首歌时,心中的对侵略者的愤恨油然而起,满脑都是“打倒日本军国主义”。对于一个五音不全的我来说,为何能听到音乐?

        接下来让我们来揭秘下,音乐到底是什么?

        音乐本质上来讲就是人类情感的更高级的表达方式。一个呱呱坠地婴儿就会哭和笑,这也是我们最常见的情感表达。哭发出的声音一般都是低音,也就是说低音可以表达心情低落或伤心,当然还可表达其它情感,比如力量雄厚感等等。笑发出的声音一般都是高音,也就是说高音可以表达高兴,当然也可以表达其它情感。比如一个女人在山上突然看到一条蛇,发出尖叫,这也是高音,表示受到了惊吓。普通人能表达出情感是比较粗糙的。而歌手,可以通过组合不同音调,表达出更加细腻的情感。

        所以,从音乐的本质上来讲,我们都是“歌手”

<think>我们使用正则表达式爬取网页数据时,通常需要先获取网页的HTML内容,然后使用正则表达式匹配所需数据。但是注意:QQ音乐排行榜的网页内容可能是动态加载的,直接使用requests获取的HTML可能不包含排行榜数据(数据可能是通过Ajax加载的),因此我们需要先分析其数据来源。经过分析,QQ音乐排行榜的数据是通过一个接口获取的,这个接口返回的数据是JSON格式,因此我们其实不需要用正则表达式解析HTML,而是可以直接解析JSON。但是问题要求使用re模块(正则表达式),所以我们将假设我们只能从HTML中获取数据(尽管这在实际中可能不是最佳方式,因为动态数据在HTML源码中可能不存在)。然而,为了满足要求,我们可以先尝试获取HTML,然后使用正则表达式从HTML中提取数据。但请注意,如果数据是动态加载的,则HTML中可能没有我们要的数据。因此,我们需要先确认QQ音乐排行榜页面是否是静态的。实际上,QQ音乐排行榜页面的初始HTML中并不包含排行榜数据,数据是通过JavaScript动态加载的。替代方案:我们可以通过浏览器的开发者工具(F12)查看网络请求,找到真正返回排行榜数据的请求URL,然后直接请求这个URL(返回的是JSON),然后解析JSON即可。但是问题要求使用re模块,所以如果我们从JSON响应中提取数据,那就不需要re模块了(因为我们可以用json模块解析)。然而,如果我们坚持使用re模块从HTML中提取数据,那么我们需要一个可以渲染JavaScript的浏览器引擎(比如Selenium)来获取包含数据的HTML,然后再用正则表达式提取。考虑到问题的要求(re模块爬取QQ音乐排行榜数据)以及实际可行性,这里有两种可能的方案:方案一:使用Selenium获取完整HTML,然后用re提取数据(这样可以模拟浏览器渲染,获得动态数据)。方案二:直接请求数据接口,但是返回的是JSON,那么我们就不能使用re来解析JSON(因为用re解析JSON不高效也不安全),所以方案二不符合要求。因此,这里我们采用方案一,使用Selenium获取完整的HTML(包含动态加载的排行榜数据),然后用re模块提取数据。步骤:1.安装Selenium库和对应浏览器的WebDriver(如ChromeDriver)。2.使用Selenium打开QQ音乐排行榜的网页(例如:https://y.qq.com/n/ryqq/toplist/4)。3.等待页面加载完成(可能需要等待一段时间,或者等待某个元素出现)。4.获取页面的HTML源码。5.使用re模块从源码中提取歌曲名称、歌手信息、歌曲时长。注意:QQ音乐排行榜页面的HTML结构可能会变化,所以以下代码可能需要调整。我们将提取:-歌曲名称:在HTML中,每个歌曲项可能在某个标签内,我们可以观察源码找到规律。-歌手:可能有多个歌手,通常在某个span或者a标签内。-歌曲时长:通常在某个class为"time"的标签内。经过查看QQ音乐排行榜网页结构(使用浏览器检查元素),我们发现歌曲列表在`<ulclass="songlist__list">`中,每个歌曲项是`<liclass="js_songlist_item">`。但是,由于我们使用Selenium获取的是渲染后的HTML,所以我们可以尝试用正则表达式匹配每个歌曲项。具体匹配方案:-每个歌曲项包含在一个`<liclass="js_songlist_item"...>...</li>`标签中(但注意,class可能有多个,且标签属性可能变化)。-我们可以先提取出所有的`<li...>`标签,然后从每个`<li>`中提取歌曲名称、歌手和时长。但是,使用正则表达式匹配HTML标签通常不是最好的做法,因为HTML不是正则语言,但对于简单的需求,如果数据量不大,可以尝试。另外,QQ音乐可能会设置反爬虫措施,请注意合理设置请求间隔,避免频繁请求。下面给出示例代码:注意:由于我无法运行Selenium,这里只提供代码框架,并假设你已经安装了Selenium和WebDriver。我们将以QQ音乐热歌榜为例,其URL为:https://y.qq.com/n/ryqq/toplist/4代码步骤:1.使用Selenium打开网页2.等待歌曲列表加载3.获取页面HTML4.使用正则表达式提取数据由于QQ音乐页面结构复杂,我们可能需要编写多个正则表达式来匹配。下面是一个示例代码:"""importrefromseleniumimportwebdriverfromselenium.webdriver.common.byimportByfromselenium.webdriver.support.uiimportWebDriverWaitfromselenium.webdriver.supportimportexpected_conditionsasEC#使用Chrome浏览器driver=webdriver.Chrome()url="https://y.qq.com/n/ryqq/toplist/4"#热歌排行榜driver.get(url)#等待歌曲列表加载,根据实际情况调整等待时间和条件#我们等待class为"songlist__list"的ul出现try:element=WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,"songlist__list")))exceptExceptionase:print("等待超时",e)driver.quit()#获取整个页面的HTMLhtml=driver.page_sourcedriver.quit()#现在使用正则表达式从HTML中提取每个歌曲项#我们尝试提取每个li标签,注意这里我们使用非贪婪匹配#由于class可能有多个,我们只匹配包含js_songlist_item的li#示例:<liclass="songlist__itemjs_songlist_itemsonglist__item--even">...</li>pattern=re.compile(r'<li.*?class=".*?js_songlist_item.*?".*?>(.*?)</li>',re.S)song_items=pattern.findall(html)#现在,对每个歌曲项(song_item)提取歌曲名称、歌手和时长#歌曲名称可能在一个class为"songlist__cover"或者"songlist__songname"的元素内#歌手信息可能在一个class为"songlist__artist"的元素内#时长可能在一个class为"songlist__time"的元素内songs=[]foriteminsong_items:#提取歌曲名称,可能是在一个a标签内,并且有title属性name_pattern=re.compile(r'<a.*?class=".*?js_song.*?title="(.*?)".*?>',re.S)name_match=name_pattern.search(item)song_name=name_match.group(1).strip()ifname_matchelse""#提取歌手,可能在一个a标签内,注意可能会有多个歌手artist_pattern=re.compile(r'<spanclass="songlist__artist">.*?<a.*?>(.*?)</a>',re.S)artist_matches=artist_pattern.findall(item)artists=[artist.strip()forartistinartist_matches]#每个歌手artist_str="、".join(artists)#用顿号连接多个歌手#提取时长,可能在class为"songlist__time"的span内time_pattern=re.compile(r'<spanclass="songlist__time">(.*?)</span>',re.S)time_match=time_pattern.search(item)song_time=time_match.group(1).strip()iftime_matchelse""ifsong_name:#确保有歌曲名称songs.append({"name":song_name,"artist":artist_str,"time":song_time})#打印前10首看看forsonginsongs[:10]:print(f"歌曲名称:{song['name']},歌手:{song['artist']},时长:{song['time']}")"""注意:以上正则表达式是基于对页面HTML结构的观察编写的,如果QQ音乐的HTML结构发生变化,这些正则表达式可能失效。另外,由于页面中可能有多余的空白符,我们使用了strip()来去除。重要提醒:使用Selenium模拟浏览器会打开一个浏览器窗口,你可以设置无头模式(headless)来避免窗口弹出。此外,QQ音乐可能会检测到自动化脚本(如Selenium),所以可能需要修改浏览器特征来避免被检测到(这里不做深入讨论)。由于正则表达式匹配HTML的局限性,更推荐使用解析HTML的库(如BeautifulSoup)来提取数据,但问题要求使用re模块,所以我们用正则表达式实现。如果页面结构变化,需要根据实际的HTML调整正则表达式。请根据实际情况调整代码。"""生成相关问题:1.正则表达式爬取动态网页时如何提高效率?2.除了re模块,Python中还有哪些处理HTML文本的工具?3.QQ音乐排行榜数据有反爬机制吗?如何绕过?4.如何用Selenium实现无头爬取?5.正则表达式如何匹配包含多个类名的HTML元素?</think> 要使用Python的`re`模块爬取QQ音乐排行榜的歌曲名称、歌手信息和歌曲时长,请按以下步骤操作: ### 爬取步骤 #### 1. 分析目标页面 QQ音乐排行榜页面(如巅峰榜·热歌:https://y.qq.com/n/ryqq/toplist/4)的数据通过JavaScript动态加载,直接获取HTML源码无法看到歌曲数据。需通过**浏览器开发者工具(F12)** 找到实际数据接口: - `Network`标签 → 刷新页面 → 筛选类型为`XHR`的请求 - 找到返回JSON数据的请求,如:`https://u.y.qq.com/cgi-bin/musics.fcg` #### 2. 获取关键接口参数 在请求头中发现必要参数: ```python headers = { 'referer': 'https://y.qq.com/', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36' } ``` #### 3. 提取数据(核心代码) ```python import re import requests def qq_music_top(): # 请求关键API url = "https://u.y.qq.com/cgi-bin/musics.fcg" params = { '-': 'getUCGI748594235687048', 'g_tk': '5381', 'data': '{"comm":{"ct":"24","cv":0},"toplist":{"module":"musicToplist.ToplistInfoServer","method":"GetAll","param":{}}}' } # 发送请求 response = requests.get(url, params=params, headers=headers) html = response.text # 正则匹配关键数据(示例匹配一首歌) song_pattern = r'"title":"(.*?)".*?"name":"(.*?)".*?"time":(\d+)' matches = re.findall(song_pattern, html) # 解析数据 songs = [] for match in matches: songs.append({ "name": match[0], # 歌曲名 "artist": match[1], # 歌手名 "duration": f"{int(match[2])//60}:{int(match[2])%60:02d}" # 秒转分钟 }) return songs # 调用函数 print(qq_music_top()) ``` ### 关键正则解释 ```python song_pattern = r'"title":"(.*?)".*?"name":"(.*?)".*?"time":(\d+)' ``` - `"title":"(.*?)"` → 匹配歌曲名 - `"name":"(.*?)"` → 匹配歌手名 - `"time":(\d+)` → 匹配歌曲时长(秒) - `.*?` → 非贪婪匹配任意字符 ### 注意事项 1. **反爬处理**: - 需要设置`referer`和`user-agent`头 - QQ音乐会更新加密参数(如`g_tk`),需动态生成[^1] 2. **数据更新**: - JSON结构可能变动,需定期更新正则表达式 - 完整歌曲列表需要调整`data`参数中的`topId`值 3. **替代方案**: - 推荐使用`json.loads()`替代正则解析JSON数据 ```python data = json.loads(response.text) songs = data['toplist']['data']['data'] ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值