首页 > 编程语言 >使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码

使用Python 和 Selenium 抓取 酷狗 音乐专辑 附源码

时间:2024-08-05 16:56:00浏览次数:15  
标签:album title Python 专辑 song Selenium url 源码 get

在这篇博客中,我将分享如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息。我们将使用BeautifulSoup解析HTML内容,并提取歌曲和专辑信息。

依赖库

  • requests
  • beautifulsoup4
  • selenium

准备工作

首先,我们需要安装一些必要的库:

pip install requests beautifulsoup4 selenium

步骤

第一步:初始化参数

我们使用Options配置Chrome浏览器为无头模式,并设置其他参数以确保浏览器在服务器环境中正常运行。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

第二步:URL参数编码

我们使用urllib.parse.quote对输入的歌手名进行URL编码,以便在搜索URL中使用。

import urllib.parse

keyword = input('请输入歌手:')
search_url = f'https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord={urllib.parse.quote(keyword)}'

第三步:使用Selenium打开页面

我们使用Selenium打开酷狗音乐的搜索页面,并等待页面加载完成。

driver = webdriver.Chrome(options=chrome_options)
driver.get(search_url)
driver.implicitly_wait(10)
html_content = driver.page_source
driver.quit()

第四步:解析HTML内容

我们使用BeautifulSoup解析页面源代码,并提取歌曲和专辑信息。

from bs4 import BeautifulSoup as be

soup = be(html_content, 'html.parser')
albums = soup.find_all('a', class_='album_name')
songs = soup.find_all('a', class_='song_name')

第五步:打印结果

我们迭代提取的歌曲和专辑信息,并打印每首歌的名称、专辑和链接。

import requests

assert len(songs) == len(albums)

for song, album in zip(songs, albums):
    song_title = song.get('title')
    album_title = album.get('title')
    album_url = album.get('href')

    if not album_title:
        album_title = "无专辑"

    print(f'歌名: {song_title}, 专辑: {album_title}, url: {album_url}')

    album_response = requests.get(album_url)
    album_soup = be(album_response.text, 'html.parser')
    audio_elements = album_soup.find_all('audio')

    for audio in audio_elements:
        mp3_url = audio.get('src')
        if mp3_url:
            print(f'专辑链接: {mp3_url}')

完整代码

以下是完整的代码:

import os
import requests
from bs4 import BeautifulSoup as be
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import urllib.parse

# 初始化参数
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

# URL参数编码
keyword = input('请输入歌手:')
search_url = f'https://www.kugou.com/yy/html/search.html#searchType=song&searchKeyWord={urllib.parse.quote(keyword)}'

# 第一步:使用Selenium打开页面
driver = webdriver.Chrome(options=chrome_options)
driver.get(search_url)

# 等待页面加载完成
driver.implicitly_wait(10)

# 获取页面源代码
html_content = driver.page_source

# 关闭浏览器
driver.quit()

# 第二步:解析HTML内容以提取所需的歌曲信息
soup = be(html_content, 'html.parser')
albums = soup.find_all('a', class_='album_name')

songs = soup.find_all('a', class_='song_name')

# 确保 songs 和 albums 的长度相同
assert len(songs) == len(albums)

# 同时迭代 songs 和 albums
for song, album in zip(songs, albums):
    song_title = song.get('title')
    album_title = album.get('title')
    album_url = album.get('href')

    # 如果专辑名为空,打印 "无专辑"
    if not album_title:
        album_title = "无专辑"

    print(f'歌名: {song_title}, 专辑: {album_title}, url: {album_url}')

    # 请求专辑页面
    album_response = requests.get(album_url)
    album_soup = be(album_response.text, 'html.parser')

    # 查找专辑页面中的音频文件链接
    audio_elements = album_soup.find_all('audio')

    for audio in audio_elements:
        mp3_url = audio.get('src')
        if mp3_url:
            print(f'专辑链接: {mp3_url}')

代码解析:

  1. 初始化参数:我们使用Options配置Chrome浏览器为无头模式,并设置其他参数以确保浏览器在服务器环境中正常运行。
  2. URL参数编码:我们使用urllib.parse.quote对输入的歌手名进行URL编码,以便在搜索URL中使用。
  3. 使用Selenium打开页面:我们使用Selenium打开酷狗音乐的搜索页面,并等待页面加载完成。
  4. 解析HTML内容:我们使用BeautifulSoup解析页面源代码,并提取歌曲和专辑信息。
  5. 打印结果:我们迭代提取的歌曲和专辑信息,并打印每首歌的名称、专辑和链接。

运行结果: 

相关类型推荐

  • 使用Python和Selenium抓取网页数据
  • BeautifulSoup使用教程
  • 如何使用Selenium进行网页自动化测试

   爬虫项目推荐

    其他项目推荐

扩展示例 1:保存歌曲信息到 CSV 文件

我们可以将抓取到的歌曲信息保存到 CSV 文件中,以便后续分析和处理。

import csv

with open('songs.csv', 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['歌名', '专辑', '链接']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)

    writer.writeheader()
    for song, album in zip(songs, albums):
        song_title = song.get('title')
        album_title = album.get('title')
        song_url = song.get('href')

        if not album_title:
            album_title = "无专辑"

        writer.writerow({'歌名': song_title, '专辑': album_title, '链接': song_url})

扩展示例 2:多线程抓取

为了提高抓取效率,我们可以使用多线程来并行抓取歌曲信息。

import threading

def fetch_song_info(song, album):
    song_title = song.get('title')
    album_title = album.get('title')
    song_url = song.get('href')

    if not album_title:
        album_title = "无专辑"

    print(f'歌名: {song_title}, 专辑: {album_title}, url: {song_url}')

    song_response = requests.get(song_url)
    song_soup = be(song_response.text, 'html.parser')
    lyrics = song_soup.find('div', class_='lyrics')

    if lyrics:
        print(f'歌词: {lyrics.text}')

threads = []
for song, album in zip(songs, albums):
    thread = threading.Thread(target=fetch_song_info, args=(song, album))
    threads.append(thread)
    thread.start()

for thread in threads:
    thread.join()

扩展示例 3:使用代理

为了避免被网站封禁,我们可以使用代理来进行抓取。

proxies = {
    'http': 'http://your_proxy:port',
    'https': 'https://your_proxy:port',
}

for song, album in zip(songs, albums):
    song_title = song.get('title')
    album_title = album.get('title')
    song_url = song.get('href')

    if not album_title:
        album_title = "无专辑"

    print(f'歌名: {song_title}, 专辑: {album_title}, url: {song_url}')

    song_response = requests.get(song_url, proxies=proxies)
    song_soup = be(song_response.text, 'html.parser')
    lyrics = song_soup.find('div', class_='lyrics')

    if lyrics:
        print(f'歌词: {lyrics.text}')

总结

在这个项目中,你学习了以下内容:

  1. 如何使用Selenium打开网页并获取页面源代码。
  2. 如何使用BeautifulSoup解析HTML内容。
  3. 如何提取并打印歌曲和专辑信息。

结论

通过这个项目,你学习了如何使用Python和Selenium抓取酷狗音乐网站上的歌曲信息,并使用BeautifulSoup解析HTML内容。希望这个项目对你有所帮助!欢迎在评论区留言。继续探索和学习,祝你在深度学习的旅程中取得更多的成果!

标签:album,title,Python,专辑,song,Selenium,url,源码,get
From: https://blog.csdn.net/m0_74972192/article/details/140834632

相关文章

  • 使用 Python和PyQt5 打造 你的专属文件查询工具! 附源码
    本文将介绍如何使用Python和PyQt5创建一个简单的文件查询工具。该工具允许用户选择一个目录,并在该目录中搜索特定的文件。依赖库首先,确保你已经安装了PyQt5库:pipinstallPyQt5步骤第一步:导入库我们需要导入必要的库,包括sys、os和PyQt5。importsysimportosfromP......
  • 用Python和PyQt5打造你的专属音乐播放器!轻松创建带封面的音乐列表
    在本文中,我们将介绍如何使用Python的PyQt5库创建一个简单的音乐播放器。这个音乐播放器可以显示歌曲的封面,并且点击封面就可以播放对应的歌曲。依赖库首先,我们需要安装PyQt5库。可以使用以下命令进行安装:pipinstallPyQt5功能如下:显示歌曲列表:程序会在指定的目录(在......
  • 了解 Databricks 文件系统 (DBFS) 中的文件访问与使用 Python 和 Spark 的卷的比较
    我当前正在尝试从Databricks文件系统(DBFS)读取和显示文件,但遇到了问题。这是我使用的代码:file_path="/dbfs/cluster-logs/use_case/default_job_cluster/cluster_id/init_scripts/cluster_id/20240801_proxy-init.sh.stderr.log"withopen(file_path,'r')asfile:......
  • 机器学习用python还是R,哪个更好?
    选择使用Python还是R进行机器学习取决于多个因素,包括您的具体需求、项目要求、个人偏好以及团队的技能水平。以下是一些关键点,可以帮助您做出决定:Python的优势广泛使用:Python是目前最流行的编程语言之一,特别是在数据科学和机器学习领域。它有一个庞大的社区和丰富的资源。......
  • python 元类:在调用“__set_name__”方法后编辑命名空间?
    假设我们用元类定义一个类。在类主体中,分配了对象,这些对象实现__set_name__以在类的数据结构中注册自身。是否可以在运行方法之后编辑命名空间?比如,分离填充的数据结构,将其分成两部分,然后在新属性下添加部分?__set_name__问题在于,在元类中调用之......
  • 无法加入进程,只能终止[Python 3.11,多处理]
    我有一个问题要问对Python的多处理库有更​​多经验的人,此时我几乎迷失了方向。我目前正在构建一个应该在Windows11和Windows11上运行的图像处理应用程序装有DebianLinux的OrangePi5。我的设置是,除了主程序之外,还有另外两个进程,一个用于处理不间断的......
  • Python 将Word转换为JPG、PNG、SVG图片
    将Word文档以图片形式导出,既能方便信息的分享,也能保护数据安全,避免被二次编辑。文本将介绍如何使用 Spire.DocforPython 库在Python程序中实现Word到图片的批量转换。Python将Word转换为JPG、JPEG、PNG、BMP等图片格式Python将Word文档转换为SVG格式 Python库安装: ......
  • C 和 Python 代码的函数的不同十六进制转储值
    这是我的示例C代码,用于从user32.dll中转储MessageBoxA:#include<windows.h>#include<stdio.h>voidDumpFun(HANDLEprocess,LPVOIDaddress,SIZE_Tdump_size){BYTE*buffer=(BYTE*)malloc(dump_size);if(buffer==NULL){pri......
  • 是否有对数累积分布函数 (CDF) 和分位数函数的数值稳定的 Python 实现?
    我正在寻找以下函数的数值稳定实现。由于我的应用涉及t分布,所以我这里以t分布为例。LogCDF#NaivePythonimplementationofthefunctionIneedimportscipyimportnumpyasnpdeft_log_cdf(x,df):p=scipy.stats.t.cdf(x,df=df)returnnp.log(......
  • 如何将 *args 参数作为字符串传递给 Python 函数
    我正在使用pytubefix制作一个Youtube下载器。API允许我编写如下代码:YouTube(url).streams.filter(progressive=True)但是假设我有一个字符串存储在像args="progressive=True"这样的变量中,我如何使用args字符串来调用函数,就像......