【爬取音乐,并将音乐信息储存到数据库中】

爬取音乐,并将音乐信息储存到数据库中

  • 确定音乐网站的url并分析网站
  • 分析二级页面
  • 创建数据库
  • 使用Xpath解析,进行多层爬取
  • 保存信息
  • 完整代码
  • 结果

确定音乐网站的url并分析网站

请添加图片描述

分析二级页面

请添加图片描述
请添加图片描述

创建数据库

# 创建一个链接对象
conn = pymysql.connect(host='master', user='root', password='123456', port=3306, db='spider')
# 创建游标
cur = conn.cursor()
sql_createTb = """CREATE TABLE music (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255),signer  VARCHAR(255),zuoci VARCHAR(255),zuoqu VARCHAR(255),album VARCHAR(255),PRIMARY KEY(id))"""

使用Xpath解析,进行多层爬取

print("开始爬取欧美音乐榜单")
url = 'https://music.xxxxxxx.cn/v3/music/top/eur_usa'
driver_chom = webdriver.Chrome()
driver_chom.get(url)
# 使用xpath解析获取音乐的榜单
music_list = driver_chom.find_elements(By.XPATH, '//div[@id="js_songlist"]/div')
print(music_list)# 进一步获取单个音乐的连接 进入详细页面 获得歌词 歌名 歌手 等信息
for url in music_list:detail_url = url.find_element(By.XPATH,'div[3]/span/a').get_attribute('href')print(detail_url)driver_edge = webdriver.Edge()driver_edge.get(detail_url)time.sleep(6)try:title = driver_edge.find_element(By.XPATH,"//div[@class='info_contain']/h2").textprint(title)singer = driver_edge.find_element(By.XPATH, "//div[@class='info_singer']/a").textprint(singer)zuoci = driver_edge.find_element(By.XPATH,"//div[@class='info_about']/p[1]/span").textprint(zuoci)zuoqu = driver_edge.find_element(By.XPATH,"//div[@class='info_about']/p[2]/span").textprint(zuoqu)album = driver_edge.find_element(By.XPATH, "//div[@class='info_about']/p[3]/span/a").textprint(album)

保存信息

# 将歌曲的信息写入到数据库中print("将歌曲的信息写入到数据库中!")number = 0insert_sql = f"insert into music() values({number},'{title}','{singer}','{zuoci}','{zuoqu}','{album}')"try:cur.execute(insert_sql)except Exception as e:# 回滚事件conn.rollback()conn.commit()print("写入完成!")# 数据库的信息写入完毕开始保存歌曲的歌词file = open(f'./output/歌词信息/{title}_{singer}.txt', 'w',encoding='utf-8')try:geci = driver_edge.find_elements(By.XPATH,"/html/body/div[3]/div/div/div/p")for i in geci:file.write(i.text+'\n')except Exception as e:geci = driver_edge.find_element(By.XPATH, "/html/body/div[3]/div/div/div/p")file.write(geci.text+'\n')# 关闭歌词文件写入file.close()

完整代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# time: 2023/12/7 19:32
import time
import pymysql
from selenium import webdriver
from selenium.webdriver.common.by import By# 创建一个链接对象
conn = pymysql.connect(host='master', user='root', password='123456', port=3306, db='spider')
# 创建游标
cur = conn.cursor()
sql_createTb = """CREATE TABLE music (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255),signer  VARCHAR(255),zuoci VARCHAR(255),zuoqu VARCHAR(255),album VARCHAR(255),PRIMARY KEY(id))"""
try:cur.execute(sql_createTb)
except Exception as e:# 回滚事件conn.rollback()
conn.commit()
print("数据库建立完毕!")# 爬取咪咕音乐 并且保存到数据库中
# 1.先确当url
print("开始爬取欧美音乐榜单")
url = 'https://music.migu.cn/v3/music/top/eur_usa'
driver_chom = webdriver.Chrome()
driver_chom.get(url)
# 使用xpath解析获取音乐的榜单
music_list = driver_chom.find_elements(By.XPATH, '//div[@id="js_songlist"]/div')
print(music_list)
# 进一步获取单个音乐的连接 进入详细页面 获得歌词 歌名 歌手 等信息
for url in music_list:detail_url = url.find_element(By.XPATH,'div[3]/span/a').get_attribute('href')print(detail_url)driver_edge = webdriver.Edge()driver_edge.get(detail_url)time.sleep(6)try:title = driver_edge.find_element(By.XPATH,"//div[@class='info_contain']/h2").textprint(title)singer = driver_edge.find_element(By.XPATH, "//div[@class='info_singer']/a").textprint(singer)zuoci = driver_edge.find_element(By.XPATH,"//div[@class='info_about']/p[1]/span").textprint(zuoci)zuoqu = driver_edge.find_element(By.XPATH,"//div[@class='info_about']/p[2]/span").textprint(zuoqu)album = driver_edge.find_element(By.XPATH, "//div[@class='info_about']/p[3]/span/a").textprint(album)# 将歌曲的信息写入到数据库中print("将歌曲的信息写入到数据库中!")number = 0insert_sql = f"insert into music() values({number},'{title}','{singer}','{zuoci}','{zuoqu}','{album}')"try:cur.execute(insert_sql)except Exception as e:# 回滚事件conn.rollback()conn.commit()print("写入完成!")# 数据库的信息写入完毕开始保存歌曲的歌词file = open(f'./output/歌词信息/{title}_{singer}.txt', 'w',encoding='utf-8')try:geci = driver_edge.find_elements(By.XPATH,"/html/body/div[3]/div/div/div/p")for i in geci:file.write(i.text+'\n')except Exception as e:geci = driver_edge.find_element(By.XPATH, "/html/body/div[3]/div/div/div/p")file.write(geci.text+'\n')# 关闭歌词文件写入file.close()except Exception as f:print("*********************Error*********************")continue
# 关闭数据库访问
cur.close()
conn.close()

结果

在这里插入图片描述
在这里插入图片描述

欢迎学习指正!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205437.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟网络技术:bond技术

网卡bond也称为网卡捆绑,就是将两个或者更多的物理网卡绑定成一个虚拟网卡。 bond的作用: 1.提高网卡的吞吐量 2.增加网络的高可用,实现负载均衡。 一、bond简介 bond技术即bonding,能将多块物理网卡绑定到一块虚拟网卡上&…

六、C语言数组

1. 数组的概念 数组是⼀组相同类型元素的集合;从这个概念中我们就可以发现2个有价值的信息: 数组中存放的是1个或者多个数据,但是数组元素个数不能为0。数组中存放的多个数据,类型是相同的。 数组分为⼀维数组和多维数组&#xf…

Prometheus 发现机制和告警

1.服务发现 Prometheus Server的数据抓取工作于Pull模型,因而,它必需要事先知道各Target的位置,然后才能从相应的Exporter或Instrumentation中抓取数据。在不同的场景下,需要结合不同的机制来实现对应的数据抓取目的。 对于小型的…

企业级 接口自动化测试框架:Pytest+Allure+Excel

1. Allure 简介 简介 Allure 框架是一个灵活的、轻量级的、支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有用信息。 Allure 是由 Java 语言开发…

【学习记录】从0开始的Linux学习之旅——字符型设备驱动及应用

一、概述 Linux操作系统通常是基于Linux内核,并结合GNU项目中的工具和应用程序而成。Linux操作系统支持多用户、多任务和多线程,具有强大的网络功能和良好的兼容性。基于前面应用与驱动的开发学习,本文主要讲述如何在linux系统上把应用与驱动…

参考信号速度变化存在跳跃时容易发生不稳定的阻抗调节

问题描述 当参考信号速度存在跳跃变化时,阻抗调节系统容易发生不稳定。这是因为阻抗调节系统需要根据参考信号的速度来调整其输出阻抗,以匹配负载阻抗,从而保持系统的稳定性。 当参考信号速度突然变化时,阻抗调节系统可能无法及…

『TypeScript』深入理解变量声明、函数定义、类与接口及泛型

📣读完这篇文章里你能收获到 了解TypeScript变量声明与类型注解掌握TypeScript函数与方法的使用掌握TypeScript类与接口的使用掌握TypeScript泛型的应用 文章目录 一、变量声明与类型注解1. 变量声明2. 类型注解3. 类型推断 二、函数与方法定义1. 函数定义2. 方法定…

Jmeter 性能测试基础!

压力测试   压力测试分两种场景:一种是单场景,压一个接口的;第二种是混合场景,多个有关联的接口。压测时间,一般场景都运行10-15分钟。如果是疲劳测试,可以压一天或一周,根据实际情况来定。 压…

springboot 在自定义注解中注入bean,解决注入bean为null的问题

问题: 在我们开发过程中总会遇到比如在某些场合中需要使用service或者mapper等读取数据库,或者某些自动注入bean失效的情况 解决方法: 1.在构造方法中通过工具类获取需要的bean 工具类代码: import org.springframework.beans…

Spring到底是如何解决循环依赖问题的?

Spring作为当前使用最广泛的框架之一,其重要性不言而喻。所以充分理解Spring的底层实现原理对于咱们Java程序员来说至关重要,那么今天笔者就详细说说Spring框架中一个核心技术点:如何解决循环依赖问题? 什么是循环依赖问题&#x…

JVM理解

1、JVM是什么? JVM是Java Virtual Machine(Java虚拟机)的缩写,由一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域等组成。 他是帮助我们将java代码 生成编译后 的 class 文件。 2、JRE、JDK和JVM 的关系 …

用AI批量生成文章的工具有哪些?免费AI生成工具

人工智能(AI)技术不断演进,为许多领域带来了前所未有的便利。其中,AI生成文章技术作为一个备受关注的领域,为大家提供了独特的解决方案,特别是在批量文章生成的需求上。 1. AI生成文章的方法 开放式AI模型…

基于Browscap对浏览器工具类优化

项目背景 原有的启动平台公共组件库comm-util的浏览器工具类BrowserUtils是基于UserAgentUtils的,但是该项目最后一个版本发布于 2018/01/24,之至今日23年底,已有5年没有维护更新,会造成最新版本的部分浏览器不能正确获取到浏览器…

使用python操作excel文档

导入xlsxwriter包 python轻量化的语言,用来操作文档简直易如反掌,首先你需要导入的是import xlsxwriter包,他包括了操作文档所需要的全部工具方法,你只需要调用就好了。 操作excel指南 首先你需要创建一个文件xlsxwriter.Workb…

http与apache

目录 1.http相关概念 2.http请求的完整过程 3.访问浏览器背后的原理过程 4.动态页面与静态页面区别 静态页面: 动态页面: 5.http协议版本 6.http请求方法 7.HTTP协议报文格式 8.http响应状态码 1xx:提示信息 2xx:成功…

CPU密集型和IO密集型初学习

目录 1、CPU密集型 2、IO密集型 3、CPU密集型和IO密集型的区别 4、CPU密集型和IO密集型对CPU内核之间的关系 5、核心线程数计算公式 5、扩展:进程和线程 小结 1、CPU密集型 CPU密集型是指计算机程序或任务在执行过程中主要依赖于中央处理器(CPU&…

IOday5作业

使用两个线程完成两个文件的拷贝&#xff0c;分支线程1完成前一半内容拷贝&#xff0c;分支线程2完成后一半内容的拷贝&#xff0c;主线程完成资源的回收 #include<myhead.h> //定义结构体 struct file {const char* srcfile;//背拷贝文件路径const char* destfile;//拷…

C++ STL容器与常用库函数

STL是提高C编写效率的一个利器 STL容器&#xff1a; 一、#include <vector> 英文翻译&#xff1a;vector &#xff1a;向量 vector是变长数组(动态变化)&#xff0c;支持随机访问&#xff0c;不支持在任意位置O(1)插入。为了保证效率&#xff0c;元素的增删一般应该在末尾…

【设计模式-3.1】结构型——外观模式

说明&#xff1a;本文介绍设计模式中结构型设计模式中的&#xff0c;外观模式&#xff1b; 亲手下厨还是点外卖&#xff1f; 外观模式属于结构型的设计模式&#xff0c;关注类或对象的组合&#xff0c;所呈现出来的结构。以吃饭为例&#xff0c;在介绍外观模式之前&#xff0…