Python 爬虫之下载歌曲(二)

news/2024/7/19 12:10:09 标签: python, 爬虫, 开发语言

获取深夜emo云歌单信息


文章目录

  • 获取深夜emo云歌单信息
  • 前言
  • 一、基本流程
  • 二、代码编写
    • 1.基本要素代码
    • 2.获取歌名和链接信息
    • 3.获取歌曲的作者信息
    • 4.将上面三个列表遍历保存
  • 三、效果展示


前言

换个平台,爬歌深夜网抑云平台的歌单的相关信息,关于作者、歌名、链接等信息。


一、基本流程

打开网抑云平台的歌单,复制这个歌单的网页地址。输入到我下面写的程序里,然后执行程序,就OK了。如下图所示:

在这里插入图片描述


二、代码编写

1.基本要素代码

代码如下:

python">from selenium import webdriver
from selenium.webdriver.common.by import By
import time

# 播放歌单的网页地址  比如:https://music.163.com/#/playlist?id=26467411
video_url = ''
# 创建一个对象实例,用来表示用哪个浏览器爬取
driver = webdriver.Firefox()
# 某个歌单的地址
driver.get(video_url)
# 等待一下,等打开网页
time.sleep(5)

music_url_list = []
music_title_list = []
music_artist_list = []

# 先加载框架,否则下面的代码无法获取内容
driver.switch_to.frame(driver.find_element(by=By.ID, value='g_iframe'))

以上代码,基本上都是爬虫的基本套路,可以看看我之前写的爬虫教程就明白了。

主要是最后一行代码需要解释一下,以前没有遇到过:
这段代码的作用是在 Selenium 中切换到一个特定的 HTML iframe(内联框架)元素中。以下是对这段代码的详细解释:

driver.switch_to.frame(): 这是 Selenium 提供的一个方法,用于切换当前操作的上下文到指定的 iframe 元素中。在网页中,iframe 是一种常用的嵌入其他网页内容的技术,它可以在一个网页内部显示另一个网页的内容。

driver.find_element(by=By.ID, value='g_iframe'): 这段代码使用 find_element() 方法来查找具有给定 ID 的 HTML 元素。在这个例子中,我们通过 By.ID 参数指定查找方式为 ID,然后通过 value='g_iframe' 指定了要查找的元素 ID 为 "g_iframe"。

整个语句 driver.switch_to.frame(driver.find_element(by=By.ID, value='g_iframe')) 的作用是:首先找到 ID 为 "g_iframe" 的 iframe 元素,然后将 Selenium 的操作上下文切换到这个 iframe 中。这样,后续的 Selenium 操作(如查找元素、点击按钮等)就会在这个 iframe 范围内进行,而不是在主页面上。

之所以需要这样做,是因为在某些情况下,网页中的某些元素(如按钮、链接等)可能存在于 iframe 中,而不在主页面上。如果不先切换到对应的 iframe,Selenium 将无法找到或操作这些元素。因此,这段代码是确保后续操作能够正确执行的重要步骤。


2.获取歌名和链接信息

代码如下:

python"># 获取歌名和链接相关信息
music_list = driver.find_elements(by=By.CSS_SELECTOR, value='.txt a')
# 遍历获取到的所有信息
for music in music_list:

    # 获取其中的歌名和链接
    music_url = music.get_attribute('href')
    music_title = music.find_element(by=By.TAG_NAME, value='b').get_attribute('title')

    # 将歌曲名字列表中的\xa0 换成空格
    for i in range(len(music_title_list)):
        music_title_list[i] = music_title_list[i].replace('\xa0', ' ')
    # 将信息添加到列表中
    music_url_list.append(music_url)
    music_title_list.append(music_title)
  1. 东西很杂,先把相关的信息都获取到,合成一个列表。
  2. 遍历这些信息,从中筛选出歌名和链接。
  3. 上面获取的信息中的空格会变成 \xa0,所以需要把它转换回来。
  4. 然后将筛选出的信息各自添加到列表中去。

3.获取歌曲的作者信息

代码如下:

python"># 获取所有的歌曲的作者
music_artists = driver.find_elements(by=By.CSS_SELECTOR, value='.text')

# 遍历获取到的所有信息
for music_artist in music_artists:

    # 获取其中作者的名字
    music_artis = music_artist.get_attribute('title')
    if music_artis:

        # 将作者的名字添加到列表中
        music_artist_list.append(music_artis)

基本上就是重复上一节的步骤。


4.将上面三个列表遍历保存

代码如下:

python"># 将每首歌的以上信息一一对应起来
i = 0
while i < len(music_url_list):
    song_info = f'歌曲名称:{music_title_list[i]}   歌曲作者:{music_artist_list[i]}   歌曲链接:{music_url_list[i]}'
    print(song_info)
    i += 1
    with open('music.txt', 'a', encoding='utf-8') as f:
        f.write(song_info + '\n')

一个简单的一边遍历一边保存的操作。


三、效果展示

在这里插入图片描述


http://www.niftyadmin.cn/n/5301990.html

相关文章

了解Web 基础与 HTTP 协议

本章内容 了解静态网页与动态网页 理解 HTTP 协议的 GET 和 POST 方法 理解 HTTP 协议请求流程 随着互联网的高速发展&#xff0c;企业信息化应用大部分已采用网页的形式构建&#xff0c;掌握网页 的相关知识和 HTTP 的请求流程&#xff0c;是掌握互联网技术的第一步&#x…

ros2激光雷达<gazebo>仿真资料

Lidar sensor激光雷达传感器 We dont want our robot to touch the wall at all because this may cause some damage, so instead of the contact sensor we can use the Lidar. Lidar is an acronym for "light detection and ranging". This sensor can help us …

SpringBoot整合Mysql实现简单的增删改查

1. 添加依赖 在项目的pom.xml文件中添加Spring Boot和MySQL的依赖&#xff1a; <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><depe…

跨站脚本攻击漏洞XSS绕过22种方式总结

XSS漏洞简介 跨站脚本攻击在目前这个时间节点还是属于一个排位比较高的漏洞&#xff0c;在OWASP TOP10 2021中隶属于注入型漏洞&#xff0c;高居TOP3的排位&#xff0c;可见这个漏洞的普遍性。跨站脚本攻击的学习中我们主要需要明白的是跨站的含义&#xff0c;以及XSS的核心。…

一切皆可查的 find

文章目录 一切皆可查的 find语法无参数查找小于,等于和大于100MB的文件查找多长时间修改过稍微复杂但是很有用的命令更多信息一切皆可查的 find find命令用来在指定目录下查找文件,功能相当之强大。 官方定义为: find - search for files in a directory hierarchy Linux的…

计算机毕业设计 基于SpringBoot的工作量统计系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

MyBatis_传入参数的问题

一、单个参数 1、基本数据类型 (1)直接使用 #{}中的参数名与方法中的参数名一致 List<ChargeRuleDO> tests(long id);<select id"tests" resultType"com.xxx.bean.ChargeRuleDO">select * from t_charge_rule t where t.id #{id} </se…

基于SpringBoot的药店管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的药店管理系统,java项目…