设为首页 加入收藏

TOP

Python爬虫实战一之爬取QQ音乐(一)
2017-10-08 11:49:58 】 浏览:10874
Tags:Python 爬虫 实战 音乐

一、前言


      前段时间尝试爬取了网易云音乐的歌曲,这次打算爬取QQ音乐的歌曲信息。网易云音乐歌曲列表是通过iframe展示的,可以借助Selenium获取到iframe的页面元素,

  而QQ音乐采用的是异步加载的方式,套路不一样,这是主流的页面加载方式,爬取有点难度,不过也是对自己的一个挑战。

 

二、Python爬取QQ音乐单曲


之前看的慕课网的一个视频, 很好地讲解了一般编写爬虫的步骤,我们也按这个来。

          爬虫步骤

1.确定目标

首先我们要明确目标,本次爬取的是QQ音乐歌手刘德华的单曲。

(百度百科)->分析目标(策略:url格式(范围)、数据格式、网页编码)->编写代码->执行爬虫

2.分析目标

 歌曲链接:https://y.qq.com/n/yqq/singer/003aQYLo2x8izP.html#tab=song&

从左边的截图可以知道单曲采用分页的方式排列歌曲信息,每页显示30条,总共30页。点击页码或者最右边的">"会跳转到下一页,浏览器会向服务器发送ajax异步请求,从链接可以看到begin和num参数,分别代表起始歌曲下标(截图是第2页,起始下标是30)和一页返回30条,服务器响应返回json格式的歌曲信息(MusicJsonCallbacksinger_track({"code":0,"data":{"list":[{"Flisten_count1":......]})),如果只是单独想获取歌曲信息,可以直接拼接链接请求和解析返回的json格式的数据。这里不采用直接解析数据格式的方法,我采用的是Python Selenium方式,每获取和解析完一页的单曲信息,点击 ">" 跳转到下一页继续解析,直至解析并记录所有的单曲信息。最后请求每个单曲的链接,获取详细的单曲信息。

 

右边的截图是网页的源码,所有歌曲信息都在类名为mod_songlist的div浮层里面,类名为songlist_list的无序列表ul下,每个子元素li展示一个单曲,类名为songlist__album下的a标签,包含单曲的链接,名称和时长等。

 

3.编写代码

1)下载网页内容,这里使用Python 的Urllib标准库,自己封装了一个download方法:

 1 def download(url, user_agent='wswp', num_retries=2):
 2     if url is None:
 3         return None
 4     print('Downloading:', url)
 5     headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'}
 6     request = urllib.request.Request(url, headers=headers)  # 设置用户代理wswp(Web Scraping with Python)
 7     try:
 8         html = urllib.request.urlopen(request).read().decode('utf-8')
 9     except urllib.error.URLError as e:
10         print('Downloading Error:', e.reason)
11         html = None
12         if num_retries > 0:
13             if hasattr(e, 'code') and 500 <= e.code < 600:
14                 # retry when return code is 5xx HTTP erros
15                 return download(url, num_retries-1)  # 请求失败,默认重试2次,
16     return html

 


2)解析网页内容,这里使用第三方插件BeautifulSoup,具体可以参考BeautifulSoup API 。

 1 def music_scrapter(html, page_num=0):
 2     try:
 3         soup = BeautifulSoup(html, 'html.parser')
 4         mod_songlist_div = soup.find_all('div', class_='mod_songlist')
 5         songlist_ul = mod_songlist_div[1].find('ul', class_='songlist__list')
 6         '''开始解析li歌曲信息'''
 7         lis = songlist_ul.find_all('li')
 8         for li in lis:
 9             a = li.find('div', class_='songlist__album').find('a')
10             music_url = a['href']  # 单曲链接
11             urls.add_new_url(music_url)  # 保存单曲链接
12             # print('music_url:{0} '.format(music_url))
13         print('total music link num:%s' % len(urls.new_urls))
14         next_page(page_num+1)
15     except TimeoutException as err:
16         print('解析网页出错:', err.args)
17         return next_page(page_num + 1)
18     return None
 1 def get_music():
 2      try:
 3         while urls.has_new_url():
 4             # print('urls count:%s' % len(urls.new_urls))
 5             '''跳转到歌曲链接,获取歌曲详情'''
 6             new_music_url = urls.get_new_url()
 7             print('url leave count:%s' % str( len(urls.new_urls) - 1))
 8             html_data_info = download(new_music_url)
 9             # 下载网页失败,直接进入下一循环,避免程序中断
10             if html_data_info is None:
11                 continue
12             soup_data_info = BeautifulSoup(html_data_info, 'html.parser')
13             if soup_data_info.find('div', class_='none_txt') is not None:
14                 print(new_music_url, '   对不起,由于版权原因,暂无法查看该专辑!')
15                 continue
16             mod_songlist_div = soup_data_info.find('div', class_='mod_songlist')
17             songlist_ul = mod_songlis
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Python开发【笔记】:git&github .. 下一篇Python,我来了

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目