Niuxingyu
# 导入requests网络请求模块
import requests
# 导入lxml标签匹配模块
from lxml import etree
# 导入re 正则匹配模块
import re
#导入系统路径模块
import os
# 导入进程模块
import multiprocessing
import threading
# 创建爬虫类
class WangyiMusic(object):
    #创建请求方法 参数为要爬取的网址
    def data_content(self,url):
        #发送request请求获取网页源码  并加入请求头
        data = requests.get(url,headers={\'User-Agent\': \'Mozilla/5.0\'})
        #返回二进制数据
        return data.content
    #写入文件方法  方便数据清洗
    def With(self):
        # 调用请求方法 传入网址参数
        res = self.data_content(\'https://music.163.com/discover/toplist?id=3778678\')
        # 获取源码转车utf-8编码类型 因为网易云音乐为utf-8
        res = res.decode(\'utf-8\') 
        # 写入文件 open打开文件 第一个参数为路径和文件名 第二个参数为写入权限 第三个参数再次声明编码urt-8  as其别名
        with open(\'./index.html\',\'w\',encoding=\'utf-8\') as f:
            # 写入
            f.write(res)
    # 数据清洗
    def Re(self):
        # 读取数据  第一个参数为路径和文件名 第二个参数为读取权限 第三个参数再次声明编码urt-8  as其别名
        with open(\'./index.html\',\'r\',encoding=\'utf-8\') as f:
            # 遍历接收读取数据
            html = f.read()
        #正则匹配想要的数据
        res = re.findall(\'<li><a href="/song\?id=(.+?)">(.+?)</a></li>\',html)
        #定义列表用于存储url
        my_list = []
        #定义列表用于存储歌曲名称
        my_list_name = []
        for i in res:
            #因为网易云音乐的音乐源在 http://music.163.com/song/media/outer/url?id=歌曲id  内所以我们只要获取id即可 这里是拼接歌曲源网址
            my_list.append("http://music.163.com/song/media/outer/url?id="+i[0]+".mp3")
            #取歌曲名加入列表
            my_list_name.append(i[1])
        # 返回参数
        return my_list,my_list_name
    #爬取音乐方法
    def XiaZai(self, url, name):
        # 调用方法发送请求 接收返回数据
        data = self.data_content(url)
        # 写入文件 open打开文件 第一个参数为路径和文件名 第二个参数为写入权限二级制数据 第三个参数再次声明编码urt-8  as其别名
        with open(\'E:/网易云top200/\'+name+\'.mp3\',\'wb\') as f:
            #写入
            f.write(data)

#程序入库
if __name__ == \'__main__\':
    # 实例化对象
    wang = WangyiMusic()
    # 调用爬取网址页面并写入文件方法
    wang.With()
    # 调用数据清洗方法 接收参数
    url_list,name_list = wang.Re()
    # 循环 次数为音乐网址的个数
    for i in range(len(url_list)):
        # 调用线程 给予方法 给予参数
        t = threading.Thread(target=wang.XiaZai,args=(url_list[i],name_list[i]))
        #启动线程
        t.start()
    #守护子线程 让主线程等待所以子线程完成后在结束
    t.join()

 参考网址 https://www.jianshu.com/p/8e568a83675d

分类:

技术点:

相关文章: