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會經常更新)