• 多线程爬取网易云音乐热歌榜 200首音乐


    # 导入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

  • 相关阅读:
    一个很好的国外的算法网站
    Windows 2008 R2 强制删除Cluster
    .net 4.5 新特性 async await 一般处理程序实例
    基于RSA的加密/解密示例C#代码
    解决WCF 调用方未由服务器进行身份验证或消息包含无效或过期的安全上下文令牌
    SQL Server查看所有表大小,所占空间
    关于Latch
    关闭SQL Server 数据库所有使用连接
    MysqliDb 库的一些使用简单技巧(php)
    Linux 常用命令
  • 原文地址:https://www.cnblogs.com/Niuxingyu/p/10485460.html
Copyright © 2020-2023  润新知