通过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")

 

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

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

相关文章

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:位置设置)

设置组件的对齐方式、布局方向和显示位置。 说明: 从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 align align(value: Alignment) 设置容器元素绘制区域内的子元素的对齐方式。 卡片能力: 从API…

【系统分析师】-系统配置与性能评价

1、性能指标 主频:又称时钟频率,1GHZ表示1秒有1G个时钟周期 1s10^9ns 主频外频 * 倍频 时钟周期 主频的倒数指令周期:取出并执行一条指令的时间 总线周期:一个访存储器或IO操作所用时间平均执行周期数:CPI表示…

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题?

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题? 等待服务器维护:首先,确保网络连接稳定,然后查看游戏官方或社区论坛,了解是否有服务器维护的消息。这是解决丢包问题的一种直接且有效的方法。 更新显卡驱动&a…

Siemens-NXUG二次开发-获取prt中体与类型、实体面与类型、实体边与类型、边上点的Tag标识[Python UF][20240302]

Siemens-NXUG二次开发-获取prt中体与类型、实体面与类型、实体边与类型、边上点的Tag标识[Python UF][20240302] 1.python uf函数1.1 NXOpen.UF.Obj.CycleObjsInPart1.2 NXOpen.UF.Obj.AskTypeAndSubtype1.3 NXOpen.UF.Modeling.AskBodyFaces1.4 NXOpen.UF.Modeling.AskFaceEdg…

RISC-V特权架构 - 机器模式下的异常处理

RISC-V特权架构 - 机器模式下的异常处理 1 进入异常1.1 从mtvec 定义的PC 地址开始执行1.2 更新CSR 寄存器mcause1.3 更新CSR 寄存器mepc1.4 更新CSR 寄存器mtval1.5 更新CSR 寄存器mstatus 2 退出异常2.1 从mepc 定义的PC 地址开始执行2.2 更新CSR 寄存器mstatus 3 异常服务程…

Android Tombstone 分析

1.什么是tombstone Tombstone是指在分布式系统中用于标记数据已被删除的记录,通常包含删除操作的时间戳和相关信息。 当一个动态库(native程序)开始执行时,系统会注册一些连接到 debuggerd 的signal handlers。当系统发生崩溃时…

Spark Shuffle Tracking 原理分析

Shuffle Tracking Shuffle Tracking 是 Spark 在没有 ESS(External Shuffle Service)情况,并且开启 Dynamic Allocation 的重要功能。如在 K8S 上运行 spark 没有 ESS。本文档所有的前提都是基于以上条件的。 如果开启了 ESS,那么 Executor 计算完后&a…

MySQL 表的基本操作,结合项目的表自动初始化来讲

有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 CRUD Boy 即将到来(😁)。 查表 查看当前数据库中所有的表,使用 show tables; 命令 由于当前数据库中还没有…

基于Python3的数据结构与算法 - 09 希尔排序

一、引入 希尔排序是一种分组插入排序的算法。 二、排序思路 首先取一个整数d1 n/2,将元素分为d1个组,每组相邻量取元素距离为d1,在各组内直接进行插入排序;取第二个整数d2 d1/2, 重复上述分组排序过程&#xff0…

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)

一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…

Unity 切换场景

场景切换前必须要将场景拖动到Build中 同步加载场景 using System.Collections; using System.Collections.Generic; //using UnityEditor.SearchService; using UnityEngine; // 场景管理 需要导入该类 using UnityEngine.SceneManagement;public class c3 : MonoBehaviour {…

redis五大基础类型【重点】

之前写过一点小知识&#xff1a;https://blog.csdn.net/qq_45927881/article/details/134959181?spm1001.2014.3001.5501 参考链接 https://xiaolincoding.com/redis/data_struct/command.html#%E4%BB%8B%E7%BB%8D 目录 1. string&#xff08;字符串&#xff09;2. Hash&#…

MySql安全加固:配置不同用户不同账号禁止使用旧密码禁止MySql进程管理员权限

MySql安全加固&#xff1a;配置不同用户不同账号&禁止使用旧密码&禁止MySql进程管理员权限 1.1 检查是否配置不同用户不同账号1.2 检查是否禁止使用旧密码1.3 禁止MySql进程管理员权限 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496…

【c++】通讯录管理系统

1.系统功能介绍及展示 2.创建项目 3.菜单实现 4.退出功能实现 5.添加联系人—结构体设计 6.添加联系人—功能实现 7.显示联系人 8.删除练习人—检测联系人是否存在 9.删除联系人—功能实现 10.查找联系人 11.修改联系人 12.清空通讯录 #include <iostream> #include <…

什么是VR虚拟社区|VR元宇宙平台|VR主题馆加盟

VR虚拟社区是指一种基于虚拟现实技术构建的在线社交平台或环境&#xff0c;用户可以在其中创建虚拟化的个人形象&#xff08;也称为avatars&#xff09;并与其他用户进行交流、互动和合作。在VR虚拟社区中&#xff0c;用户可以选择不同的虚拟场景和环境&#xff0c;如虚拟公园、…

fly-barrage 前端弹幕库(3):滚动弹幕的设计与实现

项目官网地址&#xff1a;https://fly-barrage.netlify.app/&#xff1b; &#x1f451;&#x1f40b;&#x1f389;如果感觉项目还不错的话&#xff0c;还请点下 star &#x1f31f;&#x1f31f;&#x1f31f;。 Gitee&#xff1a;https://gitee.com/fei_fei27/fly-barrage&a…

显示器开机正常,插入HDMI线却不显示画面,换了HDMI线还是不行?

环境&#xff1a; 惠普/P24VG4 DELL笔记本 问题描述&#xff1a; 显示器开机正常&#xff0c;插入HDMI线却不显示画面&#xff0c;换了HDMI线还是不行&#xff0c;是不是显示器坏了&#xff1f; 解决方案&#xff1a; 1.前往显示器设置菜单里面查看input 2.把输入源默认设…

二百二十五、海豚调度器——用DolphinScheduler调度执行Flume数据采集任务

一、目的 数仓的数据源是Kafka&#xff0c;因此离线数仓需要用Flume采集Kafka中的数据到HDFS中 在实际项目中&#xff0c;不可能一直在Xshell中启动Flume任务&#xff0c;一是项目的Flume任务很多&#xff0c;二是一旦Xshell页面关闭Flume任务就会停止&#xff0c;这样非常不…

案例研究|DataEase助力众陶联应对产业链数据可视化挑战

佛山众陶联供应链服务有限公司&#xff08;以下简称为“众陶联”&#xff09;成立于2016年&#xff0c;是由34家陶瓷企业共同创办的建陶行业工业互联网平台&#xff0c;股东产值占整个行业的22.5%。众陶联以数据赋能为核心&#xff0c;积极探索新的交易和服务模式&#xff0c;构…

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版

帝国cms7.5仿非小号区块链门户资讯网站源码 带手机版 带自动采集 开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 包含火车头采集规则和模块&#xff0c;采集目标站非小号官网。 专业的数字货币大数据平台模板&#xff0c;采用帝国cms7.5内核仿制&#xff0…