通过GitHub探索Python爬虫技术
1.检索爬取内容案例。
2.找到最近更新的。(最新一般都可以直接运行)
3.选择适合自己的项目,目前测试下面画红圈的是可行的。
4.方便大家查看就把代码粘贴出来了。
#图中画圈一代码
import requests
import os
import rewhile True:music_id = input("请输入歌曲id或歌曲链接: ")if music_id.startswith("http"):music_id = re.search(r"id=(\d+)", music_id).group(1)get_lyric = requests.get(url="https://music.163.com/api/song/lyric", params={"id": music_id, "lv": 1, "kv": 1, "tv": -1}).json()print(get_lyric)if get_lyric.get("lrc").get("lyric") == "":print("该歌曲没有歌词")else:if not os.path.exists("./OutLyric"):os.makedirs("./OutLyric")with open(f"./OutLyric/{music_id}.lrc", "w", encoding="utf-8") as save_lyric:if get_lyric.get("tlyric").get("lyric") == "":save_lyric.write(get_lyric.get("lrc").get("lyric"))else:zh_cn_lyric = re.sub(r'\[[^0-9]*:[^0-9.]*]\n', '', get_lyric.get("tlyric").get("lyric"))save_lyric.write(f'{get_lyric.get("lrc").get("lyric")}\n{zh_cn_lyric}')print(f"下载成功,可将该文件重命名至与歌曲相同的名字使用,lrc文件保存至./OutLyric/{music_id}.lrc")
#图中画圈2代码
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import requests as rq
from requests import exceptions
from bs4 import BeautifulSoup as BS
import os
import re
import csvSONG_NUM = 0def getMusic(ID, path, num):cloud = 'http://music.163.com/song/media/outer/url?id='kv = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36'}try:url = cloud+ID+'.mp3'tmp = rq.get(url, headers=kv)tmp.raise_for_status()print(num+"、歌曲正在下载...")with open(path, 'wb') as f:f.write(tmp.content)f.close()print(num+"、歌曲下载成功!")except exceptions.HTTPError as e:print(e)except Exception as e:print(e)def getMusicText(ID, path, num):muTextUrl = 'http://music.163.com/api/song/lyric?id=' + ID + '&lv=1&kv=1&tv=-1'headers = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}try:res = rq.get(muTextUrl, headers=headers)res.raise_for_status()false = False # 解决eval报错 name 'false' is not definedtrue = Truenull = Nonelrc_dict = eval(res.text) # 转换为dict字典lrc_dict = lrc_dict['lrc']music_lyric = lrc_dict['lyric']print(num+"、歌词正在下载...")with open(path, 'w', encoding="utf-8") as f:f.write(music_lyric)f.close()print(num+"、歌词下载成功!")except exceptions.HTTPError as e:print(e)except Exception as e:print(e)def create_csv_head():headers = ['song_num', 'song_name', 'singer', 'song_duration']with open("./music/musicMsg.csv", "a", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=headers)head = {'song_num': '榜单序号', 'song_name': '歌曲名称','singer': '歌手', 'song_duration': '歌曲时长'}writer.writerow(head)def save_musicMsg(music_dict):headers = ['song_num', 'song_name', 'singer', 'song_duration']with open("./music/musicMsg.csv", "a", newline="", encoding="utf-8") as f:writer = csv.DictWriter(f, fieldnames=headers)writer.writerow(music_dict)def split_Msg(msg):msg = msg.split('"')item = msg[1]return itemdef getMusicMsg(ID):global SONG_NUMsong_url = 'https://music.163.com/song?id=' + IDheaders = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}try:s = rq.session()res = s.get(song_url, headers=headers)soup = BS(res.content, 'lxml')# 获取歌手singer = str(soup.find('meta', {'property': 'og:music:artist'}))singer = split_Msg(singer)# 获取歌曲名song_name = str(soup.find('meta', {'property': 'og:title'}))song_name = split_Msg(song_name)# 获取歌曲时长song_duration = str(soup.find('meta', {'property': 'music:duration'}))song_duration = split_Msg(song_duration)m, s = divmod(int(song_duration), 60)song_duration = ("%02d:%02d" % (m, s))music_dict = {'song_num': SONG_NUM,'song_name': song_name,'singer': singer,'song_duration': song_duration}save_musicMsg(music_dict)# 歌曲名中/\\替换为空if '/' in song_name or '\\' in song_name or ':' in song_name:song_name = song_name.replace('/', '')song_name = song_name.replace('\\', '')song_name = song_name.replace(':', '')# 歌手名中/\\替换为&if '/' in singer or '\\' in singer or ':' in singer:singer = singer.replace('/', '&')singer = singer.replace('\\', '&')singer = singer.replace(':', '')dirName = singer+'-'+song_nameprint(dirName)return dirNameexcept exceptions.HTTPError as e:print(e)except Exception as e:print(e)def getMusicList():headers = {'Referer': 'https://music.163.com','Host': 'music.163.com','User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9'}base_url = 'https://music.163.com/discover/toplist's = rq.session()url = base_urlresponse = s.get(url, headers=headers)soup = BS(response.content, "lxml")main = soup.find('ul', {'class': 'f-hide'})ls = main.find_all('a')songID_dic = {} # key song_name ,value songIDprint('一共有'+str(len(ls))+'首歌')a = 1for music in ls:name = music.textID = str(music['href'].replace('/song?id=', ''))name = name+'_'+str(a)a += 1songID_dic[name] = IDprint("Name:{:30}\tID{:^10}".format(name, ID))print('一共有'+str(len(songID_dic))+'')return songID_dicdef main():global SONG_NUMsongID_dic = getMusicList()rootDir = 'music'if os.path.exists(rootDir):print(rootDir+"文件夹已存在")else:os.mkdir(rootDir)print("创建文件夹"+rootDir)create_csv_head()for item in songID_dic:item_clear = item.split('_')[0]SONG_NUM += 1dirName = getMusicMsg(songID_dic[item])if dirName[-2:-1] == '.':dirName = dirName.replace('.', '·')musicDir = './'+rootDir+'/' + dirNameif os.path.exists(musicDir):print(musicDir+"文件夹已存在")else:os.mkdir(musicDir)print("创建文件夹"+musicDir)if len(item_clear) > 75:item_clear = item_clear[:70]+'···'elif '.' in item_clear:item_clear = item_clear.replace('.', '·')print(item_clear, end=" \n")mp3_path = musicDir+'/'+item_clear+'.mp3'm4a_path = musicDir+'/'+item_clear+'.m4a'lyric_path = musicDir+'/'+item_clear+'.txt'num = str(SONG_NUM)print('='*50)getMusic(songID_dic[item], mp3_path, num)getMusic(songID_dic[item], m4a_path, num)print('*'*50)getMusicText(songID_dic[item], lyric_path, num)print('='*50)if __name__ == '__main__':main()# getMusicList()# getMusicText("1994955842", "path")# getMusicMsg("1998931166")
相关文章:

通过GitHub探索Python爬虫技术
1.检索爬取内容案例。 2.找到最近更新的。(最新一般都可以直接运行) 3.选择适合自己的项目,目前测试下面画红圈的是可行的。 4.方便大家查看就把代码粘贴出来了。 #图中画圈一代码 import requests import os import rewhile True:music_id input("请输入歌曲…...

【Python】-----基础知识
注释 定义:让计算机跳过这个代码执行用三个单引号/双引号都表示注释信息,在Python中单引号与双引号没有区别,但必须是成对出现 输出与输入 程序是有开始,有结束的,程序运行规则:从上而下,由内…...
如何学习、上手点云算法(二):点云处理相关开源算法库、软件、工具
写在前面 本文内容 一些用于点云处理的开源算法库、软件介绍,主要包含: CloudCompare, MeshLab, PCL, Open3D, VTK, CGAL等 不定时更新 平台/环境 Windows10, Ubuntu1804, CMake, Open3D, PCL 转载请注明出处: https://blog.csdn.net/qq_41…...

为什么会对猫毛过敏?如何缓解?浮毛克星—宠物空气净化器推荐
猫咪过敏通常是因为它们身上的Fel d1蛋白质导致的,这些蛋白质附着在猫咪的皮屑上。猫咪舔毛的过程会带出这些蛋白质,一旦接触就可能引发过敏症状,比如打喷嚏等。因此,减少空气中的浮毛数量有助于减轻过敏现象。猫用空气净化器可以…...
Linux学习-etcdctl安装
etcdctl3.5下载链接 1. 先通过上面链接下载gz包2. 解压 [rootk8s-master ~]# tar xf etcd-v3.5.11-linux-amd64.tar.gz [rootk8s-master etcd-v3.5.11-linux-amd64]# ls Documentation etcd etcdctl etcdutl README-etcdctl.md README-etcdutl.md README.md READMEv2-e…...
Qt应用软件【文件篇】读写文件技巧
文章目录 简介按照偏移读文件按照偏移写文件Qt按行写文件Qt按行读文件注意事项指定文件编码格式UTF8转GBK简介 Qt提供了丰富的API来处理文件读写操作,使得读写文件变得简单。 按照偏移读文件 QFile file("example.txt"); if (file.open(QIODevice::ReadOnly)) {q…...
GO常量指针
Go语言中的常量使用关键字const定义,用于存储不会改变的数据,常量是在编译时被创建的,即使定义在函数内部也是如此,并且只能是布尔型、数字型(整数型、浮点型和复数)和字符串型。 由于编译时的限制&#x…...

微服务间通信重构与服务治理笔记
父工程 依赖版本管理,但实际不引入依赖 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…...

unity 场景烘焙中植物叶片(单面网络)出现的白面
Unity版本 2021.3.3 平台 Windows 在场景烘焙中烘焙植物的模型的时候发现植物的叶面一面是合理的,背面是全白的,在材质球上勾选了双面烘焙,情况如下 这个问题可能是由于植物叶片的单面网格导致的。在场景烘焙中,单面网格只会在一…...

网工内推 | 国企运维,年薪最高30W,RHCE认证优先
01 上海华力微电子有限公司 招聘岗位:系统运维资深/主任工程师 职责描述: 1、负责IT基础设施(包括服务器、存储、中间件等系统基础技术平台)的设计建设和日常运维管理; 2、负责生产、开发和测试环境的技术支持&#x…...
WordPress排除调用某个分类下的文章
wordpress在调用分类下文章时,有时需要排除调用某个分类的文章,下面的这段代码,就可以轻松实现不调用特定ID的分类内容。 <?phpquery_posts("showposts10&cat-1"); //cat-1为排除ID为1的分类下文章while(have_posts()) : …...

Java多线程——信号量Semaphore是啥
目录 引出信号量Semaphore ?Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——信号量Semaphore是啥 信号量Semaphore ? Semaphore 通常我们叫它信号量, 可以用来控制同时访问特…...
L2785(Java). 将字符串中的元音字母排序
题目 1.如何以char类型便利字符串 2.自定义优先队列解决 class Solution {public String sortVowels(String s) {Map<Character,Integer> m new HashMap<>();m.put(a,1);m.put(e,1);m.put(i,1);m.put(o,1);m.put(u,1);m.put(A,1);m.put(E,1);m.put(I,1);m.put(O,…...

Android之Handler原理解析与问题分享
一、Handler运行原理剖析 1.关系剖析图 如果把整个Handler交互看做一个工厂,Thread就是动力MessageQueue是履带Looper是转轴Loooper的loop方法就是开关,当调用loop方法时整个工厂开始循环工作,处理来自send和post提交到MessageQueue的消息&a…...
YOLO快速入门
Yolo简介 概述 YOLO(You Only Look Once)是一种流行的目标检测算法,由Joseph Redmon等人开发。 YOLO算法以其高效的实时性能和准确的检测能力而闻名。自YOLO的首次提出以来,已经经 历了多个版本的更新和改进。以下是YOLO发展史的…...

基于 LLaMA 和 LangChain 实践本地 AI 知识库
有时候,我难免不由地感慨,真实的人类世界,本就是一个巨大的娱乐圈,即使是在英雄辈出的 IT 行业。数日前,Google 正式对外发布了 Gemini 1.5 Pro,一个建立在 Transformer 和 MoE 架构上的多模态模型。可惜,这个被 Google 寄予厚望的产品并未激起多少水花,因为就在同一天…...

GraphGeo参文2:Fourth-Order Runge–Kutta(四阶RK方法)
四级 RK 方法是数值积分微分方程用的最多的一种方法。 对于形式为: 的微分方程,由如下四级: 若 z 满足: 则有: 其中表示,在时间时,的情况下, 的取值。 其他的类似,括号里…...

解密Lawnchair:打造个性化极致的Android桌面体验
解密Lawnchair:打造个性化极致的Android桌面体验 1. 简介 Lawnchair是一款知名的Android桌面定制工具,旨在为用户提供个性化极致的桌面体验。作为一个开源项目,Lawnchair融合了简洁、灵活和强大的特点,让用户能够自由定制其Andro…...
c语言-函数-009
2.函数传参: 2.1赋值传递(复制传递)函数体内部想要使用函数体外部变量值的时候使用复制传递2.2全局变量传递#include <stdio.h>int Num1 100; int Num2 200; int Ret 0;void Add(void) {Ret Num1 Num2;return; }int main(void) {Add();printf…...

Spring事件发布监听器ApplicationListener原理- 观察者模式
据说监听器模式也是mq实现的原理, 不过mq我还没来得及深入学习, 先用spring来理解一下吧 Spring事件发布监听器ApplicationListener原理- 观察者模式 什么是观察者模式一个Demo深入认识一下观察者模式Spring中的事件发布监听ps 什么是观察者模式 大家都听过一个故事叫做烽火戏…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)
本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢,连接红外测温传感器,可实时精准捕捉宠物体温变化,以便及时发现健康异常;水位检测传感器时刻监测饮用水余量,防止宠物…...