社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

爬虫实战!Python多线程爬取网易云热歌音乐

蚂蚁学Python • 4 年前 • 719 次点击  

多线程爬取网易云热歌音乐

前言

学习了蚂蚁老师的《零基础学Python简单爬虫》后我进步很大,开始自己实践爬取酷狗音乐,网易云音乐等各大音乐网站。在我成功的爬取了网易云热歌榜所有音乐后,我开始思考如何才能更快的爬取数据。蚂蚁老师的《python并发编程,用多线程加速程序运行》课程解决了我的问题,现在爬取速度快了十倍!!!


1.网站分析

首先大家打开网易云网站的主页,然后点击排行榜,再点击云音乐特色榜中的热歌榜。(https://music.163.com/#/discover/toplist?id=3778678)大家按F12进入开发者模式,用开发者工具搜索《孤勇者》,点击搜索结果找到网页源代码中的歌曲ID和歌曲名称。

2.导入python库

import os
import requests
import re
import threading

3.发送网络请求,访问网站

#网易云网址,以热歌榜单链接为例
url = "https://music.163.com/discover/toplist?id=3779629"  
headers = {
            'Cookie':'_iuqxldmzr_=32; _ntes_nnid=ae3b5b26314cae4ba35657b357d06348,1640060772701; _ntes_nuid=ae3b5b26314cae4ba35657b357d06348; NMTID=00OFTzvJD26ltfT4kPLk7b6nPCn51oAAAF92z1lmg; WNMCID=xyhddx.1640060773918.01.0; WEVNSM=1.0.0; WM_TID=i2DIsKQNGhZAUABUFBIq86abC%2BMqTYA3; JSESSIONID-WYYY=w0%5CqDCxwTCSuV6TSo71m4xqKq7x9%2F%2FhSWX04%5Ce%5CEREabbI%5CDvvCOFCt6GMD9UUeC2tamR6NwUGM9X9h%2Bmugrqq5u92NSN2hoycyrjb5ldDxE8cPwGcey7bDQvNynG6230m3Saux4JblnRBF%2BchXEp7%2FRNT96%5CHUEk%5CG3geohb6jo6q5p%3A1645762943177; WM_NI=PH%2BSXDfhBlYnm2%2BWub53aGvl0VFZ%2BjlmccwSVtT5KsJUNj33VSMU7BuSHREMe3IPpsTymGnW7W3G4xmYipYo786C8z5c2UE8Mpsu8vBVsbVBmnkWmD69VHJ2XXacu5rNZG8%3D; WM_NIKE=9ca17ae2e6ffcda170e2e6eea8eb3abae9979bf37b98b48fa6d85a879f9aaff821a9b2e5b3d8749bbfc0d7ce2af0fea7c3b92a9498e5b4db50a6b88e8ddc66afeee5b8f86af7edafa8f568f48a8abbaa62b0b3ad84f65996ac9cd6ca798a8b828bb239968d83b6b64ab78d88b3c847a7ed87b1f37998a7a3a8ed5df589fda8b774af87a791dc65f5e8faa4bb72f7bdfeb6c8348fb0bd96bb7e828abd83d54aafb2a5b8f050f6e79aa9c93a9c88af84f83fb29296a8bb37e2a3',
            'Referer':'https://music.163.com/',
            'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36',
            }
r = requests.get(url)

4.解析歌曲ID、歌名

正则匹配网易云歌曲ID、歌曲名字

#
  • 孤勇者

  • zip_data = re.findall('
  • (.*?)
  • '
    ,r.text)
    print(zip_data)     #打印查看

    上图我们可以看到,zip_data是一个大列表,其中每个元素都是一个元组,每个元组包含了歌曲ID和歌名。

    5.爬取音乐函数

    def craw(music_url,music_name):
        music_data = requests.get(music_url, timeout=30).content
        #新建一个music文件夹
        if not os.path.exists('./music'):
            os.mkdir('./music')
        #保存数据
        with open(f"./music/{music_name}.mp3"'wb'as f:
            f.write(music_data)

    6.创建多线程,准备批量爬取

    threads = []
    for data in zip_data:
        music_id = data[0]
        music_name = data[1]
        print(music_name)
        music_url = "http://music.163.com/song/media/outer/url?id=" + music_id
        print(music_url)
        threads.append(threading.Thread(target = craw,args = (music_url,music_name)))

    music_url由一个音乐下载接口和音乐ID拼接而成。我们可以打印出待爬取的url和歌名如下图所示

    7.启动多线程

    for thread in threads:
        thread.start()       

    8.等待结束

    for thread in threads:
        thread.join()        

    下载好热歌榜所有的音乐之后,大家可以快乐的一边听音乐,一边敲代码了,哈哈哈~


    推荐蚂蚁老师的全套Python课程

    先保存图片,然后抖音打开扫码购买,提供代码、课件、答疑服务




    Python社区是高质量的Python/Django开发社区
    本文地址:http://www.python88.com/topic/127560