[爬虫]Python爬取网易云音乐搜索并下载歌曲!

Python爬取网易云音乐搜索并下载歌曲!

1.准备工作

我在网易云音乐试了一下,发现是它是一个动态网页,里面的内容都是JS生成的,所以不太好爬取。这时候就要有第三方网站“帮”我们爬取了。
我找了个第三方软件,可以用它来爬出歌曲ID,我们在爬取它的源代码,把ID取出来(好像有点绕口)

2.“实地”观察

我们进入到这个网站,发现这个网站一个有5个下载源可以搜索:
下载源
今天我们的目标是下载网易云音乐的歌曲,有兴趣的小伙伴可以试着爬取其他网站的歌曲,原理是一样的。我们随便搜索一个歌曲,查看网址。
网址栏
我们发现网址"kw="后面代表是歌曲的名称,而"lx="后面代表的是下载源。
我们再来看看源代码:
源代码
我们看到,一个a标签里面正有我们想要的东西:下载链接和歌曲名称。
a
有了下载链接和歌曲名称就好办了,接下来是码代码环节!

3.开始码代码!

我这里做了一个用户界面和UI,还有一个新的下载方式:链接下载。想看链接下载的小伙伴可以跳过本章,看第4章节:搜索并下载。
链接下载
首先,我们得知道一个网址:http://music.163.com/song/media/outer/url?id=?.mp3
这是什么呢?这是一个下载链接,在"id="处填上歌曲的ID就可以下载了。
网址ID
我们随便打开一个音乐,发现网址上正好有"id=???"这样的格式,我们只要用正则表达式来提取ID,再在把ID填到上面的网址中就可以了,代码:

import re
import urllib.request
import tkinter.messagebox as box
# 设置下载函数
def urldownload():
    url = lefturl.get() # 这里是我UI的输入框,不想用UI的可以直接input
    try:
        # 解析歌曲id
        urlid = re.findall('id=(.*)', url)[0]
        # 获取下载网页
        durl = 'http://music.163.com/song/media/outer/url?id=%s.mp3' % urlid
        # 下载歌曲
        urllib.request.urlretrieve(durl, '绝对路径\名称.mp3')
        # 提示下载完毕
        box.showinfo(title='提示', message='音乐已下载完毕!\n已保存至download文件夹!')
    except:
        box.showerror(title='错误', message='下载链接错误!')

4.搜索并下载

想要得到下载链接和名称,我们首先得得到网页的源代码:

# 搜索函数
def searchdownload(name):
    # 从网站的Requests Header中获取
    url = 'https://music.hwkxk.cn/?kw=%s&lx=wy' % name
    html = requests.get(url=url).text
    print(html)

可是运行完后,输出的是乱码,这是怎么回事?
这时候,我们可以先把网页内容转成单字节编码,再转成UTF-8,修改如下:

import requests
# 搜索函数
def searchdownload(name):
    # 从网站的Requests Header中获取
    url = 'https://music.hwkxk.cn/?kw=%s&lx=wy' % name
    html = requests.get(url=url).text
    html = html.encode('ISO-8859-1')
    html = html.decode('UTF-8')
    print(html)

这时候,就没有乱码了。
接下来,就来爬取歌曲名称和下载链接:
a
我们看到,这个歌曲的a标签的class名是“btn btn-xs btn-success”,但是这只是一个歌曲的class,我们要找到"所有歌曲的class"。
我们看到右边的"styles",发现这个class才是"所有a标签的class"。
all_a
现在来码代码:

import bs4
import requests
# 搜索函数
def searchdownload(name):
    # 从网站的Requests Header中获取
    url = 'https://music.hwkxk.cn/?kw=%s&lx=wy' % name
    html = requests.get(url=url).text
    html = html.encode('ISO-8859-1')
    html = html.decode('UTF-8')
    
  • 67
    点赞
  • 310
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
基于Python Scrapy实现的网易云音乐music163数据爬取爬虫系统 含全部源代码 基于Scrapy框架的网易云音乐爬虫,大致爬虫流程如下: - 以歌手页为索引页,抓取到全部歌手; - 从全部歌手页抓取到全部专辑; - 通过所有专辑抓取到所有歌曲; - 最后抓取歌曲的精彩评论。 数据保存到`Mongodb`数据库,保存歌曲的歌手,歌名,专辑,和热评的作者,赞数,以及作者头像url。 抓取评论者的头像url,是因为如果大家喜欢,可以将他做web端。 ### 运行: ``` $ scrapy crawl music ``` #!/usr/bin/python #-*-coding:utf-8-*- import time from pprint import pprint from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector from scrapy.http import Request from woaidu_crawler.items import WoaiduCrawlerItem from woaidu_crawler.utils.select_result import list_first_item,strip_null,deduplication,clean_url class WoaiduSpider(BaseSpider): name = "woaidu" start_urls = ( 'http://www.woaidu.org/sitemap_1.html', ) def parse(self,response): response_selector = HtmlXPathSelector(response) next_link = list_first_item(response_selector.select(u'//div[@class="k2"]/div/a[text()="下一页"]/@href').extract()) if next_link: next_link = clean_url(response.url,next_link,response.encoding) yield Request(url=next_link, callback=self.parse) for detail_link in response_selector.select(u'//div[contains(@class,"sousuolist")]/a/@href').extract(): if detail_link: detail_link = clean_url(response.url,detail_link,response.encoding) yield Request(url=detail_link, callback=self.parse_detail) def parse_detail(self, response): woaidu_item = WoaiduCrawlerItem() response_selector = HtmlXPathSelector(response) woaidu_item['book_name'] = list_first_item(response_selector.select('//div[@class="zizida"][1]/text()').extract()) woaidu_item['author'] = [list_first_item(response_selector.select('//div[@class="xiaoxiao"][1]/text()').extract())[5:].strip(),] woaidu_item['book_description'] = list_first_item(response_selector.select('//div[@class="lili"][1]/text()').extract()).strip() woaidu_item['book_covor_image_url'] = list

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值