吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1724|回复: 87
收起左侧

[Python 原创] 简单做个爬虫下点歌听

  [复制链接]
buluo533 发表于 2024-7-31 22:30
找到个不错的听歌网站,爬虫安排上
比较简单的一个爬虫
[Python] 纯文本查看 复制代码
import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import os


def Menu(key):
    global dic
    url = f"https://www.gequbao.com/s/{key}"
    response = requests.get(url, headers=headers).text
    soup = BeautifulSoup(response, "lxml")
    song_list = soup.find_all("div", class_="row")
    count = len(song_list)
    print("共有歌曲:", count - 2)
    for i in song_list[1:count - 1]:
        song_name = i.find("div", class_='col-5').find("a").text.replace("\n", "").replace("\r", "").replace(" ", "")
        singer_name = i.find("div", class_='col-4').text.replace("\n", "").replace("\r", "").replace(" ", "")
        url = i.find("div", class_='col-3').find("a").get("href")
        down_url = 'https://www.gequbao.com' + url
        dic[song_name] = down_url
        print(f"歌曲:{song_name}----歌手:{singer_name}")


def Download(song_name):
    url = dic[song_name]
    id= url.split('/')[4]
    data_url=f'https://www.gequbao.com/api/play_url?id={id}&json=1'
    response = requests.get(data_url, headers=headers).json()
    sava_url = response['data']['url']
    sava(sava_url, song_name)

def sava(song_down, song_name):
    if not os.path.exists("./歌曲"):
        os.mkdir("./歌曲")

    response = requests.get(song_down, headers=headers).content
    with open(f"./歌曲/{song_name}.mp3", "wb") as f:
        f.write(response)
    print("下载成功")



if __name__ == '__main__':
    key = input("输入歌曲搜索关键词:")
    ua = UserAgent().random
    headers = {
        "User-Agent": ua
    }
    dic = {}
    Menu(key)
    song_key = input("输入下载歌曲名:")
    Download(song_key)


大致实现过程是通过他的一个搜索接口进行关键词搜索,找到自己需要的歌,然后下载
大佬可以是封装,我还没搞懂pyqt5的线程和信号槽,主线程要卡死就不献丑了

5.png
6.png

免费评分

参与人数 11吾爱币 +16 热心值 +10 收起 理由
jingfengshulong + 1 + 1
Arrears + 1 + 1 我很赞同!
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
melooon + 1 + 1 我很赞同!
sealoyal + 1 用心讨论,共获提升!
timeni + 1 + 1 谢谢@Thanks!
Mortalie + 1 我很赞同!
grrr_zhao + 1 + 1 谢谢@Thanks!
移情√似水 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
为之奈何? + 1 + 1 我很赞同!
fengxinyu + 1 + 1 棒棒的

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

kongwu596 发表于 2024-8-1 02:52
我这种菜鸡饭喂到嘴都不会吃
silenough 发表于 2024-8-4 20:04
本帖最后由 silenough 于 2024-8-4 20:06 编辑

顺手优化下:
1、用索引做key,避免搜出多个同名歌曲,只能down最后一个,实际可能不是想找的song;
2、加个循环,用q和s控制,免得每次都要运行;


import requests
from bs4 import BeautifulSoup
from fake_useragent import UserAgent
import os

g_http = 'https://www.xxx.com'  # 使用前把xxx替换下

def Menu(key):
    global dic
    url = f"{g_http}/s/{key}"
    response = requests.get(url, headers=headers).text
    soup = BeautifulSoup(response, "lxml")
    song_list = soup.find_all("div", class_="row")
    count = len(song_list)
    print("共有歌曲:", count - 2)
    for index, i in enumerate(song_list[1:count - 1]):
        song_name = i.find("div", class_='col-5').find("a").text.replace("\n", "").replace("\r", "").replace(" ", "")
        singer_name = i.find("div", class_='col-4').text.replace("\n", "").replace("\r", "").replace(" ", "")
        url = i.find("div", class_='col-3').find("a").get("href")
        down_url = g_http + url
        dic[index] = (song_name, down_url)
        print(f"序号:{index}, 歌曲:{song_name}, 歌手:{singer_name}")

def Download(index):
    url = dic[index][1]
    id = url.split('/')[4]
    data_url = f'{g_http}/api/play_url?id={id}&json=1'
    response = requests.get(data_url, headers=headers).json()
    sava_url = response['data']['url']
    sava(sava_url, dic[index][0])

def sava(song_down, song_name):
    if not os.path.exists("./歌曲"):
        os.mkdir("./歌曲")

    response = requests.get(song_down, headers=headers).content
    with open(f"./歌曲/{song_name}.mp3", "wb") as f:
        f.write(response)
    print("下载成功")

if __name__ == '__main__':
    while (True):
        key = input("输入歌曲搜索关键词:")
        if key == "q":
            exit(0)
        ua = UserAgent().random
        headers = {
            "User-Agent": ua
        }
        dic = {}
        Menu(key)

        down_loop = True
        while (down_loop):
            key2 = input("输入下载歌曲序号:")
            if key2 == "q":
                exit(0)
            if key2 == "s":
                break
            Download(int(key2))
nowns 发表于 2024-8-1 00:25
p1nk 发表于 2024-8-1 00:50
谢谢作者大大啦
zhilai 发表于 2024-8-1 01:51
也许直接用python的线程?不需要一定要pyqt的线程吧。
ccz 发表于 2024-8-1 06:10
多谢楼主分享
xszraa 发表于 2024-8-1 06:14
python运行代码显示缺少模块
zhufuan 发表于 2024-8-1 06:41
老师,这个有exe程序吗,我不会py
jinghuasy001 发表于 2024-8-1 08:07
感谢作者的分享
luofengdi 发表于 2024-8-1 08:16
kongwu596 发表于 2024-8-1 02:52
我这种菜鸡饭喂到嘴都不会吃

同菜,直接搜成品好了  
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-14 15:48

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表