1. 程式人生 > >Python3 scrapy下載網易雲音樂所有(大部分)歌曲

Python3 scrapy下載網易雲音樂所有(大部分)歌曲

很早之前就說要寫這個的,但是中間我去寫其他爬蟲了,所以一直拖著沒更( ˃᷄˶˶̫˶˂᷅ )
BUT,說好的要寫這個爬蟲那就一定要寫!!

先說怎樣找到我們要爬取的資料
我的思路是這樣的:

主頁→歌單頁面→分類的各個歌單介面→分類歌單裡的每一個歌單→歌單中的每一首歌(歌名,歌手,歌曲id)→歌曲下載連結

按照上述步驟
我們先到網易雲音樂的主頁:http://music.163.com/#
這裡一定要注意,在編寫爬蟲程式碼時,後面的‘#’我們不能要!
所以程式碼裡你要寫入的連結是:http://music.163.com
這裡寫圖片描述
很輕鬆既可以找到‘歌單’這一分類的地址

接下來是‘歌單’分類的介面:
這裡寫圖片描述

這裡寫圖片描述
這裡也可以很輕鬆的找到所有類別的歌單地址與下一頁的地址

接著我們進入某一歌單的頁面:
這裡寫圖片描述

到這裡你會發現,根據Elements編寫的xpath路徑根本找不到每一首歌的連結,因為Elments裡的程式碼其實並不是真實原始碼,而是經過瀏覽器渲染後的程式碼,我們要找的原始碼在這裡:
這裡寫圖片描述
這裡的才是真實原始碼,所以我們需要根據這個來進行xpath路徑編寫

找到歌曲地址後,我們進入歌曲介面獲取歌名、歌手、所屬專輯:
這裡寫圖片描述

接下來就是編寫程式碼了,寫好以後是,執行時是這樣的:
這裡寫圖片描述

下載的部分歌曲:
這裡寫圖片描述
可能會下到一些空資料夾,具體是為什麼我沒去找原因,大家有興趣可以研究一下

關於下載地址,把歌曲id填入這裡就好了:

http://music.163.com/song/media/outer/url?id=這裡填歌曲id.mp3
問我哪裡來的…百度來的…
歌曲id哪裡來?抓取到的歌曲連結的最後那串數字就是id了,用split()切一下就拿出來了嘛~

最後扔上部分程式碼:

'''Music_spider.py'''

import scrapy
from ..items import Music163Item

all_page=[]

class Music_spider(scrapy.Spider):
    name = 'music'

    def start_requests(self)
:
url = ['http://music.163.com'] for u in url: yield scrapy.Request(u,callback=self.parse_songlist) def parse_songlist(self,response): url = response.xpath("//ul[@class='nav']/li[3]/a/@href").extract_first() url = response.urljoin(url) yield scrapy.Request(url,callback=self.parse_list_type) def parse_list_type(self,response): url = response.xpath("//dl[@class='f-cb']/dd/a/@href").extract() for i in url: url = response.urljoin(i) yield scrapy.Request(url,callback=self.parse_next) def parse_next(self,response): next = response.xpath("//div[@class='u-page']/a[contains(text(),'下一頁')]/@href").extract() if 'javascript' not in next[0]: url = response.urljoin(next[0]) global all_page all_page.append(url) yield scrapy.Request(url,callback=self.parse_next) else: for i in all_page: all_page = all_page[1:] yield scrapy.Request(i,callback=self.parse_list,dont_filter=True) def parse_list(self,response): url = response.xpath("//ul[@class='m-cvrlst f-cb']/li/div/a/@href").extract() for i in url: url = response.urljoin(i) yield scrapy.Request(url, callback=self.parse_list_song) def parse_list_song(self,response): url = response.xpath("//ul[@class='f-hide']/li/a/@href").extract() for i in url: url = response.urljoin(i) yield scrapy.Request(url,callback=self.parse_song) def parse_song(self,response): i = Music163Item() src = [] song_id = response.url.split('=')[1] song_name = response.xpath("//em[@class='f-ff2']/text()").extract_first() album = response.xpath("//p[@class='des s-fc4']/a[@class='s-fc7']/text()").extract_first() singer = '&'.join(response.xpath("//p[@class='des s-fc4']/span/a/text()").extract()) song_src = 'http://music.163.com/song/media/outer/url?id={}.mp3'.format(song_id) src.append(song_src) i['file_urls'] = src i['song_name'] = song_name i['singer'] = singer yield i

這次的文章就到這裡了,下次見(可能懶得寫,所以會要很久以後?大概吧..不過github會經常更新)