简单音乐网站的爬取(正则表示式)

写代码之前要先理清思路
我们要做的是用 python 抓取浏览器中的音乐资源

        我们要知道,通常我们访问浏览器中的网页来听歌,读文章,看视频都是通过浏览器中的点击、输入等操作,对目标网站的服务器发送请求,服务器给予相对的响应得以实现的。

        这意味着,如果我们可以通过浏览器听歌,那么服务器中相应的音频文件就被浏览器获取了。这就为我们用程序大规模的抓取提供了可能。哪怕网页中没有下载的相关选项,我们也可以直接将准备用于播放的音频文件直接下载到本地

明白了原理我们就可以将思路简化

即:通过程序访问网址(目标服务器),找到音频文件位置,并下载到本地

首先补充一个小知识点

        我们对网页进行请求要用到python中的requests库

import requsets
resp = requests.get(url)

基本流程

爬虫程序的基本流程
获取网页
python中提供了requests、urllib等很多库来帮助我们获取页面信息。本篇文章使用的是requests库

提取信息
我们运用第三方库获取的网页信息是原始的,没有经过处理的数据,我们需要通过处理筛选提取自己所需要的数据,在这里我们利用的是bs4(BeautiSoup)库来提取信息的。

保存信息
我们通过筛选获取到的大量数据,我们可以按照用多种形式来保存。如:可以保存为txt文本、Excel文件或者存储到数据库中。甚至可以直接存储到服务器中。大家可以根据自己后期对该数据的使用或者查看方式来选择保存信息的方式。

(1)确认目标站点并进行身份伪装

import requests
import re
import os

# 目标站点https://www.hifini.com/
shouye_url = "https://www.hifini.com/"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}  # 身份伪装

(2)获取网页、发送请求、提取信息

向目标站点发送请求并进行判断

def get_data(url):  # 发送请求
    response = requests.get(url, headers=headers)
    if response.status_code == 200:   # 判断响应状态是否为200
        html_data = response.text  # 响应状态码为200,html_data接收网页源码
        return html_data  # 返回给parse_data进行解析

(3)解析数据

对目标站点首页进行解析数据

def parse_data(data):  # 解析数据
    z = '<li\sclass="media\sthread\stap\s\s".*?>.*?<div\sclass="subject\sbreak-all">.*?<a\shref="(.*?)">(.*?)</a>'
    result = re.findall(z, data, re.S)  # 接收
    # print(result)
    for i in result:  # for循环遍历
        # https://www.hifini.com/thread-25970.htm
        href = "https://www.hifini.com/"+i[0]  # 取值
        name = i[1]
        print(href)
        print(name)
        print('==================')
        get_song_link(href)   # 调用 get_song_link 请求 href

对音乐播放链接进行解析

# 音乐播放链接:https://www.hifini.com/get_music.php?key=SbXBgQfjOS96gIcUeVNHsgjKyGOxm7xebx+YYpjMiZ6VJWMG3LeY55ayMVTEGxF4z5i0Cl1RD4qIKxCiwdU
def get_song_link(link):  # 向详情页发送请求    获得网页源码  link==href
    song_html_data =get_data(link)
    # print(song_html_data)
    song_re = "music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)',"
    r = re.findall(song_re, song_html_data, re.S)
    print('歌曲信息', r)
    for i in r:
        song_name = i[0]
        song_link = "https://www.hifini.com/"+i[1]
        print('歌名', song_name)
        print('歌曲播放资源链接:', song_link)
        print('++++++++++++++++')

(4)保存数据

def save_data(song_link, song_name):  # 保存数据
    data_bytes = requests.get(song_link, headers=headers).content
    if not os.path.exists('歌曲'):  # 检测是否有歌曲文件夹
        os.makedirs('歌曲')  # 没有就创建一个歌曲文件夹
    with open('歌曲\{}.m4a'.format(song_name), 'wb') as f:  # 二进制数据写入到歌曲文件夹
        f.write(data_bytes)

整体代码

import requests
import re
import os

# 目标站点https://www.hifini.com/
shouye_url = "https://www.hifini.com/"
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}  # 身份伪装
# response=requests.get(url, headers=headers)
# print(response.text)  # 查看响应源码
# print(response.status_code)  #  查看响应状态码


def get_data(url):  # 发送请求
    response = requests.get(url, headers=headers)
    if response.status_code == 200:   # 判断响应状态是否为200
        html_data = response.text  # 响应状态码为200,html_data接收网页源码
        return html_data  # 返回给parse_data进行解析


def parse_data(data):  # 解析数据
    z = '<li\sclass="media\sthread\stap\s\s".*?>.*?<div\sclass="subject\sbreak-all">.*?<a\shref="(.*?)">(.*?)</a>'
    result = re.findall(z, data, re.S)  # 接收
    # print(result)
    for i in result:  # for循环遍历
        # https://www.hifini.com/thread-25970.htm
        href = "https://www.hifini.com/"+i[0]  # 取值
        name = i[1]
        print(href)
        print(name)
        print('==================')
        get_song_link(href)   # 调用 get_song_link 请求 href

# 音乐播放链接:https://www.hifini.com/get_music.php?key=SbXBgQfjOS96gIcUeVNHsgjKyGOxm7xebx+YYpjMiZ6VJWMG3LeY55ayMVTEGxF4z5i0Cl1RD4qIKxCiwdU

def get_song_link(link):  # 向详情页发送请求    获得网页源码  link==href
    song_html_data =get_data(link)
    # print(song_html_data)
    song_re = "music:\s\[.*?title:\s'(.*?)',.*?url:\s'(.*?)',"
    r = re.findall(song_re, song_html_data, re.S)
    print('歌曲信息', r)
    for i in r:
        song_name = i[0]
        song_link = "https://www.hifini.com/"+i[1]
        print('歌名', song_name)
        print('歌曲播放资源链接:', song_link)
        print('++++++++++++++++')
        # 再次像歌曲播放资源发起请求 获得二进制数据
        # data_bytes = requests.get(song_link, headers=headers).content
        # if not os.path.exists('歌曲'):  # 检测是否有歌曲文件夹
        #     os.makedirs('歌曲')   # 没有就创建一个歌曲文件夹
        # with open('歌曲\{}.m4a'.format(song_name), 'wb')as f:  # 二进制数据写入到歌曲文件夹
        #     f.write(data_bytes)
        save_data(song_link, song_name)


def save_data(song_link, song_name):  # 保存数据
    data_bytes = requests.get(song_link, headers=headers).content
    if not os.path.exists('歌曲'):  # 检测是否有歌曲文件夹
        os.makedirs('歌曲')  # 没有就创建一个歌曲文件夹
    with open('歌曲\{}.m4a'.format(song_name), 'wb') as f:  # 二进制数据写入到歌曲文件夹
        f.write(data_bytes)


if __name__ == '__main__':  # main函数,不同数据之间进行调用
    h = get_data(shouye_url)  # 调用 shouye_url
    parse_data(h)  # 调用parse_data, h返回进去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值