文档章节

学会这些,你就可以用python爬取网易云的歌单数据了

IT-Mamba
 IT-Mamba
发布于 03/28 15:00
字数 1037
阅读 19
收藏 0

此脚本可按照风格分类爬取该分类下所有歌单的歌曲,部分带特殊符号的歌单没做转码,所以跳过,比如 R&B/Soul,访问时需要转成 R%26B%2FSoul

所以用了 try except 抛一下异常就好了,然后继续执行脚本

由于学习不久,以及功能改变较多,最后才形成这个版本,所以代码有点乱,有空再优化~

注意:有个细节  网页访问时 有个 # 号,https://music.163.com/#/discover/playlist/

用url请求时要把 # 号去掉才能拿到完整的数据。

此外,网易云还提供一些 api,比如根据歌单id返回歌单数据的json,这样可以很方便的直接解析

http://music.163.com/api/playlist/detail?id=2720965607

 

 

 

 

#!/usr/bin/python
# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import json
import random
import csv
from requests.adapters import HTTPAdapter
import traceback
import time
import datetime

#设置请求头
headers = {
    'Host': 'music.163.com',
    'Referer': 'http://music.163.com/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36'
}
#代理ip池 用自己的ip请求多了 会被反爬 封ip
proxies = [{"http": "http://117.191.11.123:8080"},
           {"http": "http://118.144.149.123:8080"},
           {"http": "http://27.191.234.123:8080"},
           {"http": "http://58.249.55.123:8080"}]
proxy = random.choice(proxies)   #随机获取一个代理池的ip
print("proxy:"+str(proxy))    #输出记录请求的ip
count = 1   #歌曲数
listnum = 1   #歌单数
# 创建csv文件用于存储数据
nowTime = datetime.datetime.now().strftime('%Y%m%d%H%M%S')#现在
out= open('D:\music_csv_orderByTag'+str(nowTime)+'.csv', 'a', newline='', encoding='utf-8-sig')
csv_write = csv.writer(out, dialect='excel')
csv_write.writerow(["id", "song_id", "song_name", "singer_name", "tags", "playlist_id"])  # 写入列名
#爬取到的数据写入到csv中
urltag = "https://music.163.com/discover/playlist/?order=new"       #该地址可以获取歌单的标签分类
rtag = requests.session()
rtag = rtag.get(urltag, headers=headers, proxies=proxy)   #获取返回结果
text = rtag.text      #这两步是防止中文被转成16进制
rtag = rtag.content
soup = BeautifulSoup(str(text).replace(' ', ' '), "lxml")
#拿到标签列表
resultTag = soup.find_all('a', {'class': 's-fc1'})      #查找所有a标签 class为 s-fc1 的值 ,即标签的值
for mu in resultTag:
    cat = mu['data-cat']
    if cat == '全部':
        print("cat为全部,跳过")   #这里爬的是各个分类的歌单歌曲,所以遇到分类“全部”就跳过
    else:
        offset = 0                #偏移量 url拼接使用     
        offsetMax = 35    #每一页有35个歌单  初始值设为35  读取到所有歌单数后再修改
        urloffset = 'https://music.163.com/discover/playlist/?order=new&cat=' + str(cat)
        print("-------urloffset----urloffset----------------")
        print(urloffset)
        roffset = requests.session()
        roffset = BeautifulSoup(roffset.get(urloffset, headers=headers, proxies=proxy).content)
        soupoffset = BeautifulSoup(str(roffset).replace(' ', ' '), "lxml")
        # 拿到页码歌单数列表
        pages = soupoffset.find_all('a', {'class': 'zpgi'})
        print("-------urloffset----pages----------------")
        print(pages)
        pagelen = len(pages)
        page = pages[pagelen - 1]
        str1 = str(page['href']).split('offset=')
        print("-------urloffset----str1----------------")
        print(str1)
        if 'offset=' in page['href']:
            offsetMax = int(str1[1])
            print(str1[1])
        else:
            pass
        while offset <= offsetMax:
            try:
                url = 'https://music.163.com/discover/playlist/?cat=' + str(cat) + '&order=new&limit=35&offset=' + str(offset)
                r = requests.session()
                r = BeautifulSoup(r.get(url, headers=headers, proxies=proxy).content)
                result = r.find_all('a', {'class': 'msk'})
                offset += 35
                print(url)
                for res in result:
                    url2 = "http://music.163.com/api/playlist/detail?" + res['href'][10:23]
                    print(str(listnum) + ":" + url2)
                    listnum += 1
                    r5 = requests.session()
                    #设置超时重试次数
                    r5.mount('http://', HTTPAdapter(max_retries=1))
                    r5.mount('https://', HTTPAdapter(max_retries=1))
                    proxy1 = random.choice(proxies)
                    print("proxy1:"+str(proxy1))
                    #r5 = r5.get(url2, headers=headers).content
                    try:
                        r5 = r5.get(url2, headers=headers, proxies=proxy1, timeout=5).content #超时时间5s
                        r2 = str(r5, 'utf-8')
                        print("------------result json------------")
                        #print(r2)
                        if str(r2).startswith('b'):
                            print("startwith b ")
                            r3 = str(r2)[2:]
                            r2 = r3[:-1]
                        text = json.loads(r2)
                        tracks = text['result']['tracks']
                        tags = text['result']['tags']
                        for track in tracks:
                            #print(str(count)+":"+str(track['id'])+","+track['name']+","+track['artists'][0]['name']+","+str(tags))
                            singer_name = track['artists'][0]['name']
                            csv_write.writerow([count, str(track['id']), str(track['name']), str(singer_name), str(tags), str(res['href'][10:23])])
                            count += 1
                    except Exception as err:
                        print("出现部分异常,跳过该页-----" + url2)
                        print(err)
                    sleeptime = random.uniform(0.05, 0.3)   #随机休眠后再进行访问
                    print("进入休眠 sleeptime:" + str(sleeptime))
                    time.sleep(sleeptime)
            except Exception as err:
                print("出现部分异常,跳过该标签-----" + str(cat))
                print(err)
print("write over")
out.close()
print("finish")

此脚本仅用于学习,不可用于其他用途,后果自负。

 

 

© 著作权归作者所有

IT-Mamba
粉丝 10
博文 133
码字总数 56499
作品 0
惠州
程序员
私信 提问
加载中

评论(7)

dhis
dhis

引用来自“dhis”的评论

已经上班了,不想搞😂

引用来自“IT-Mamba”的评论

那代码贼烂......不过答辩应该不看代码.....
能运行就可以,自己写个论文
dhis
dhis

引用来自“dhis”的评论

我最近在用scrapy爬京东图书

引用来自“IT-Mamba”的评论

我下班再去折腾那个毕业设计...要部署到tomcat上很累
好的,麻烦了
IT-Mamba
IT-Mamba 博主

引用来自“dhis”的评论

已经上班了,不想搞😂
那代码贼烂......不过答辩应该不看代码.....
dhis
dhis
已经上班了,不想搞😂
IT-Mamba
IT-Mamba 博主

引用来自“dhis”的评论

我最近在用scrapy爬京东图书
我下班再去折腾那个毕业设计...要部署到tomcat上很累
IT-Mamba
IT-Mamba 博主

引用来自“dhis”的评论

我最近在用scrapy爬京东图书
😂你有技术底为什么不自己做毕业设计
dhis
dhis
我最近在用scrapy爬京东图书
15行Python代码搞定网易云热门歌单

引言 马上314情人节就要来了,是否需要一首歌来抚慰你,受伤或躁动的心灵。来吧,今天教你用15行代码搞定热门歌单。学起来并听起来吧。 本文使用的是Selenium模块,它是一个自动化测试工具,...

上海小胖
03/10
75
0
python各类爬虫案例,爬到你手软!

小编整理了一些爬虫的案例,代码都整理出来了~ 先来看看有哪些项目呢: python爬虫小工具(文件下载助手) 爬虫实战(笔趣看小说下载) 爬虫实战(VIP视频下载) 爬虫实战(百度文库文章下载...

糖宝lsh
04/14
814
0
Python实用教学:如何用Python玩转各大网站

Hi~,各位小伙伴,Python是目前编程语言中的主流语言之一,也是公认最容易入门的编程语言,因为Python语言近几年的火爆,有很多小伙伴都开始学习这门语言。 编程语言学习,最重要的是“多看代...

W3Cschool小编
2018/07/31
0
0
手把手教你写网络爬虫(1):网易云音乐歌单

原文出处:拓海 大家好,《手把手教你写网络爬虫》连载开始了!在笔者的职业生涯中,几乎没有发现像网络爬虫这样的编程实践,可以同时吸引程序员和门外汉的注意。本文由浅入深的把爬虫技术和...

拓海
2018/04/27
0
0
js解密剖析—爬虫之网易云音乐加密破解

前言 网络爬虫的大障碍,就是各种加密。这其中包过登录的验证码以及加密。js混淆、js参数加密等等。其实以前也就了解过js加密。但是没有深入研究,借着这次实践研究了一下网易云音乐的加密方...

bigsai
06/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

XXL-JOB使用命令行的方式启动python时,日志过多导致阻塞的解决方式

一、Runtime.getRuntime().exec()的阻塞问题 这个问题也不能算是XXL-JOB的问题,而是Java的Runtime.getRuntime().exec()造成的,BufferedReader的缓冲区大小有限,当不能及时从缓冲区中把输出...

codeobj
5分钟前
1
0
java后端获取字符串标签里面的具体值

1、如下:怎么获取value值,使用Jsoup解决 <select id='department' name='department' class='select' tabindex='6' onchange='changeDept()'><option value=''>院系</optio......

木九天
12分钟前
2
0
Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型

Xamarin图表开发基础教程(10)OxyPlot框架支持的图表类型 OxyPlot组件支持26种图表,这些图表按照功能和样式可以分为4大类,分别为线型图表、条型图表、金融图表和其它图表。 线型图表 OxyP...

大学霸
15分钟前
2
0
移动端input“输入框”常见问题及解决方法

移动端input“输入框”常见问题及解决方法 1. ios中,输入框获得焦点时,页面输入框被遮盖,定位的元素位置错乱: 当页input存在于吸顶或者吸底元素中时,用户点击输入框,输入法弹出后,fie...

tyou
17分钟前
2
0
初探Android线程池

前言 最近在看OkHttp的源码,看的时候发现有关线程池的运用,自己就仔细想了一下,这个块知识好像不是很牢固。没办法,再研究一下有关线程池的相关知识吧。学习就是一个查漏补缺的过程,最终...

二营长的意大利炮手
24分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部