Python 爬虫 小练习

2023-05-16

获得某易云音乐 对应歌单下的所有歌曲的歌曲、专辑图片、歌手图片、lrc歌词

import requests
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import urllib.request
import json
import re

headers = {
    'Referer': 'http://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/62.0.3202.75 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
}
play_url = 'http://music.163.com/playlist?id=752199922'

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome('D:/chromedriver_win32/chromedriver.exe', chrome_options=chrome_options) # 下载的chromedriver_win32的路径
browser.get(play_url)
browser.switch_to.frame('contentFrame')

trList = browser.find_element_by_class_name('m-table ').find_element_by_css_selector('tbody').find_elements_by_tag_name(
    'tr')
assets = []
for i in range(len(trList)):
    asset = []
    tdList = trList[i].find_elements_by_tag_name('td')
    musicID = str(tdList[1].find_element_by_tag_name('a').get_attribute('href')).split('?')[1]
    musicName = tdList[1].find_element_by_tag_name('a').find_element_by_tag_name('b').get_attribute('title')
    singer = tdList[3].find_elements_by_tag_name('a')
    singerList = []
    for j in range(len(singer)):
        singerUrl = singer[j].get_attribute('href')
        singerList.append(singerUrl)
    albumUrl = tdList[4].find_element_by_tag_name('a').get_attribute('href')
    musicUrl = 'http://music.163.com/song/media/outer/url?' + musicID + '.mp3'
    lyricUrl = 'http://music.163.com/api/song/lyric?' + musicID + '&lv=1&kv=1&tv=-1'
    asset.append(musicName)
    asset.append(musicUrl)
    asset.append(lyricUrl)
    asset.append(albumUrl)
    asset.append(singerList)
    assets.append(asset)

for i in assets:
    # 歌曲名称 歌曲下载地址 歌词lrc下载地址 专辑地址
    musicName = i[0]
    musicDownUrl = i[1]
    lrcDownUrl = i[2]
    albumUrl = i[3]
    singerUrl = i[4]
    try:
        # 下载歌曲
        urllib.request.urlretrieve(musicDownUrl, 'D:/歌曲/%s.mp3' % musicName)

        # 下载歌词
        html = requests.get(lrcDownUrl, headers=headers).text
        json_obj = json.loads(html)
        try:
            lrc = json_obj['lrc']['lyric']
            with open('D:歌词/{}.lrc'.format(musicName), 'a', encoding='utf-8') as fp:
                fp.write(lrc)
        except KeyError as e:
            pass

        # 下载专辑图片
        html = requests.get(albumUrl, headers=headers).text
        img = re.findall(r'<meta property="og:image" content="(.*?)" />', html, re.DOTALL)[0]
        req = requests.get(img)
        with open('D:/专辑图片/{}.jpg'.format(musicName), 'wb') as fp:
            fp.write(req.content)

        # 下载专辑图片
        html = requests.get(albumUrl, headers=headers).text
        img = re.findall(r'<meta property="og:image" content="(.*?)" />', html, re.DOTALL)[0]
        req = requests.get(img)
        albumName = re.findall(r'meta property="og:title" content="(.*?)" />', html, re.DOTALL)[0]
        with open('D:/专辑图片/{}.jpg'.format(albumName), 'wb') as fp:
            fp.write(req.content)

        # 下载歌手图片
        for k in singerUrl:
            html = requests.get(k, headers=headers).text
            img = re.findall(r'<meta property="og:image" content="(.*?)" />', html, re.DOTALL)[0]
            req = requests.get(img)
            singerName = re.findall(r'<meta name="keywords" content="(.*?)" />', html, re.DOTALL)[0]

            with open('D:/歌手图片/{}.jpg'.format(singerName), 'wb') as fp:
                fp.write(req.content)
        print('下载成功')
    except:
        print('下载失败')

只不过感觉下载速度有点慢,才60个资源就下了好久,不知道是不是用了chromedriver的原因

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 爬虫 小练习 的相关文章

  • MediaPipe基础(9)手指计数

    本文实现手指计数 xff0c 可以实现0 5的计数 链接 xff1a https span class token punctuation span span class token operator span pan span class
  • OpenCV基础(19)使用 OpenCV 和 Python 检测 ArUco 标记

    在本教程中 xff0c 您将学习如何使用 OpenCV 和 Python 检测图像和实时视频流中的 ArUco 标记 1 使用 OpenCV 和 Python 检测 ArUco 标记 在本教程的第一部分 xff0c 您将了解 OpenCV
  • 目标跟踪(7)使用 OpenCV 进行简单的对象跟踪

    1 简述 目标跟踪的过程是 1 获取对象检测的初始集 例如边界框坐标的输入集 2 为每个初始检测创建唯一的ID3 然后跟踪每一个在视频中移动的对象 xff0c 保持唯一ID的分配 此外 xff0c 对象跟踪允许我们为每个跟踪对象应用唯一 I
  • 基于OpenCV的轮廓检测(1)

    1 目标 理解什么叫做轮廓学习如何寻找轮廓以及可视化轮廓找出轮廓的不同特征 xff0c 如面积 周长 质心 边框等将看到许多与轮廓相关的函数 2 什么叫做轮廓 轮廓可以简单地解释为连接所有连续点 xff08 沿着边界 xff09 的曲线 x
  • 自动驾驶数据标注技术:如何解决数据标注难题?

    自动驾驶数据标注技术是现代自动驾驶汽车发展过程中必不可少的一部分 xff0c 因为它能够提高自动驾驶汽车的性能 xff0c 确保其安全性和准确性 然而 xff0c 数据标注的难题也给自动驾驶汽车的发展带来了挑战 下面是关于自动驾驶数据标注技
  • 在mac m1上安装docker并在浏览器启动Ubuntu环境

    目录 一些前言 xff08 说明我要这样做的原因 xff0c 很啰嗦 xff0c 建议直接跳过 xff09 安装docker用docker启动ubuntu的环境在ubuntu中安装qt5qt5bug解决qt5卸载 一些前言 xff08 说明
  • 【3D打印机】原来配置Marlin2.0这么简单,别说我没告诉你。

    96 96 可能由于各人的打印机款式不同 xff0c 某些参数没有出现在文中 xff0c 但是只要你完全看完本指南 xff0c 就可以理解Marlin是如何工作的 xff0c 我相信在此基础上 xff0c 你在固件中找到哪些不同配置并不困难
  • Ubuntu18.0 PX4+ROS+MAVROS+Gazebo仿真环境搭建

    Ubuntu18 0 PX4 43 ROS 43 MAVROS 43 Gazebo仿真环境搭建 PX4 xff1a 更新git 连接VPN下载安装 xff0c https docs px4 io master en dev setup bu
  • PX4 APM ROS MAVROS Gazebo之间关系

    https www cnblogs com yilangUAV p 14476923 html 1 PX4与APM 参考 https bbs amovlab com forum php mod 61 viewthread amp tid 6
  • MAVROS机外(offboard)控制例程

    PX4与ROS各部分的关系 Simulator仿真器 xff08 Gazebo xff09 xff1a 模拟真实飞行 xff0c 即模拟计算出真实飞行时的传感器状态 xff0c 包括GPS xff0c IMU xff08 惯性测量单元 xf
  • 罗素“杀死了”康托尔

    英国数学家罗素提出的著名的 罗素悖论 xff0c 直接证明了作为数学大厦基础的 集合论 是有问题的 xff0c 这也导致了 集合论 的发现者康托尔一次又一次的经历着罗素的劫难却也解决不了这个问题 xff0c 最终死在了自己工作的哈佛大学精神
  • px4与gazebo的多无人机编队仿真 offboard模式

    转载 原文链接 xff1a https blog csdn net weixin 43409270 article details 114703341 多机仿真 1 修改launch文件 在 PX4 Autopilot launch目录下
  • ubuntu18.04的APM环境搭建过程

    ubuntu18 04的APM环境搭建过程 配置APM环境结合gazebo软件进行仿真Ardupilot之Mavros实现Ros节点控制 配置APM环境 官方文档 https ardupilot org dev docs building
  • 使用Dronekit控制无人机,DroneKit配置

    DroneKit Python是一个用于控制无人机的Python库 DroneKit提供了用于控制无人机的API xff0c 其代码独立于飞控 xff0c 单独运行在机载电脑 xff08 Companion Computer xff09 或
  • [pixhawk笔记]-飞行模式

    pixhawk笔记 飞行模式 参考 xff1a https www cnblogs com spyplus p 7351690 html 本文翻译自px4官方开发文档 xff1a https dev px4 io en concept fl
  • 常见网络摄像机的端口及RTSP地址

    之前用opencv抓视频流搞了很久 xff0c 终于找到一篇比较靠谱的文章 亲测雄迈ip摄像头有效 海康威视 默认IP地址 xff1a 192 168 1 64 DHCP 用户名admin 密码自己设 端口 xff1a HTTP 端口 xf
  • Vue i18n学习记录

    昨天接触到了Vue i18n国际化 先去搜索了官网 都看了一遍有个大致印象以后发现 不知道把他的列子写在哪里 xff08 我想找个视频教程都没得 xff09 就是像下面这个图一样 你到底是放在哪里的 xff1f xff1f xff1f xf
  • Vue项目i18n国际化语言切换

    1 安装依赖 npm install vue i18n 2 在目录下创建所需文件 目录结构 在main js中引入 import Vue from 39 vue 39 import App from 39 App vue 39 import
  • 噔噔噔噔~冒泡排序算法

    冒泡排序算法 冒泡排序算法原理 xff1a 1 比较相邻的元素 如果第一个比第二个大 xff0c 就交换他们两个 2 对每一对相邻元素作同样的工作 xff0c 从开始第一对到结尾的最后一对 最后的元素会是最大的数 3 针对所有的元素重复以上
  • 微信小程序Map组件全屏显示

    微信小程序Map组件全屏显示 本人今天遇到了这个问题 想要小程序Map组件全屏显示设置css样式height 100 xff1b 是不生效得 需要用单位vh 设置css样式为height 100vh xff1b 就可以了 仅供参考哦

随机推荐