python爬虫爬取音乐单曲_Python爬取qq音乐的过程实例

c815660dfd41931e6340055595aa8749.png

一、前言

 qq music上的音乐还是不少的,有些时候想要下载好听的音乐,但有每次在网页下载都是烦人的登录什么的。于是,来了个qqmusic的爬虫。至少我觉得for循环爬虫,最核心的应该就是找到待爬元素所在url吧。二、Python爬取QQ音乐单曲

爬虫步骤

1.确定目标首先我们要明确目标,本次爬取的是QQ音乐歌手刘德华的单曲。(百度百科)->分析目标(策略:url格式(范围)、数据格式、网页编码)->编写代码->执行爬虫2.分析目标歌曲链接:从左边的截图可以知道单曲采用分页的方式排列歌曲信息,每页显示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方法:

def download(url, user_agent='wswp', num_retries=2): ifurl is None: returnNone print('Downloading:', url) 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'} request = urllib.request.Request(url, headers=headers) # 设置用户代理wswp(Web Scraping with Python) try: html = urllib.request.urlopen(request).read().decode('utf-8') except urllib.error.URLError ase: print('Downloading Error:', e.reason) html = None ifnum_retries > 0: ifhasattr(e, 'code') and500 <= e.code < 600: # retry when returncode is 5xx HTTP erros returndownload(url, num_retries-1) # 请求失败,默认重试2次, return html

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

def music_scrapter(html, page_num=0): try: soup = BeautifulSoup(html, 'html.parser') mod_songlist_div = soup.find_all('div', class_='mod_songlist') songlist_ul = mod_songlist_div[1].find('ul', class_='songlist__list') '''开始解析li歌曲信息''' lis = songlist_ul.find_all('li') forli in lis: a = li.find('div', class_='songlist__album').find('a') music_url = a['href'] # 单曲链接 urls.add_new_url(music_url) # 保存单曲链接 # print('music_url:{0} '.format(music_url)) print('total music link num:%s'% len(urls.new_urls)) next_page(page_num+1) except Timeout Exception aserr: print('解析网页出错:', err.args) returnnext_page(page_num + 1) return None
def get_music(): try: whileurls.has_new_url(): # print('urls count:%s'% len(urls.new_urls)) '''跳转到歌曲链接,获取歌曲详情''' new_music_url = urls.get_new_url() print('url leave count:%s'% str( len(urls.new_urls) - 1)) html_data_info = download(new_music_url) # 下载网页失败,直接进入下一循环,避免程序中断 ifhtml_data_info is None: continue soup_data_info = BeautifulSoup(html_data_info, 'html.parser') ifsoup_data_info.find('div', class_='none_txt') is not None: print(new_music_url, ' 对不起,由于版权原因,暂无法查看该专辑!') continue mod_songlist_div = soup_data_info.find('div', class_='mod_songlist') songlist_ul = mod_songlist_div.find('ul', class_='songlist__list') lis = songlist_ul.find_all('li') del lis[0] # 删除第一个li # print('len(lis):$s'% len(lis)) forli in lis: a_songname_txt = li.find('div', class_='songlist__songname').find('span', class_='songlist__songname_txt').find('a') if'https'not in a_songname_txt['href']: #如果单曲链接不包含协议头,加上 song_url = 'https:'+ a_songname_txt['href'] song_name = a_songname_txt['title'] singer_name = li.find('div', class_='songlist__artist').find('a').get_text() song_time =li.find('div', class_='songlist__time').get_text() music_info = {} music_info['song_name'] = song_name music_info['song_url'] = song_url music_info['singer_name'] = singer_name music_info['song_time'] = song_time collect_data(music_info) except Exception aserr: # 如果解析异常,跳过 print('Downloading or parse music information error continue:', err.args)

4.执行爬虫

1<span style="font-size: 16px;">爬虫跑起来了,一页一页地去爬取专辑的链接,并保存到集合中,最后通过get_music()方法获取单曲的名称,链接,歌手名称和时长并保存到Excel文件中。</span><br><span style="font-size: 14px;"><img src="http://img.php.cn/upload/article/000/000/001/a1138f33f00f8d95b52fbfe06e562d24-4.png"alt=""width="748"height="483"><strong><img src="http://img.php.cn/upload/article/000/000/001/9282b5f7a1dc4a90cee186c16d036272-5.png"alt=""></strong></span>1<br>

三、Python爬取QQ音乐单曲总结1.单曲采用的是分页方式,切换下一页是通过异步ajax请求从服务器获取json格式的数据并渲染到页面,浏览器地址栏链接是不变的,不能通过拼接链接来请求。一开始想过都通过Python Urllib库来模拟ajax请求,后来想想还是用Selenium。Selenium能够很好地模拟浏览器真实的操作,页面元素定位也很方便,模拟单击下一页,不断地切换单曲分页,再通过BeautifulSoup解析网页源码,获取单曲信息。2.url链接管理器,采用集合数据结构来保存单曲链接,为什么要使用集合?因为多个单曲可能来自同一专辑(专辑网址一样),这样可以减少请求次数。

1<span style="font-size: 14px;">classUrlManager(object):</span><br><span style="font-size: 14px;"> def __init__(self):</span><br><span style="font-size: 14px;"> self.new_urls = set() # 使用集合数据结构,过滤重复元素</span><br><span style="font-size: 14px;"> self.old_urls = set() # 使用集合数据结构,过滤重复元素</span>
1<span style="font-size: 14px;"> def add_new_url(self, url):</span><br><span style="font-size: 14px;"> ifurl is None:</span><br><span style="font-size: 14px;"> return</span><br><span style="font-size: 14px;"> ifurl not in self.new_urls andurl not in self.old_urls:</span><br><span style="font-size: 14px;"> self.new_urls.add(url)</span><br><br><span style="font-size: 14px;"> def add_new_urls(self, urls):</span><br><span style="font-size: 14px;"> ifurls is None orlen(urls) == 0:</span><br><span style="font-size: 14px;"> return</span><br><span style="font-size: 14px;"> forurl in urls:</span><br><span style="font-size: 14px;"> self.add_new_url(url)</span><br><br><span style="font-size: 14px;"> def has_new_url(self):</span><br><span style="font-size: 14px;"> returnlen(self.new_urls) != 0</span><br><br><span style="font-size: 14px;"> def get_new_url(self):</span><br><span style="font-size: 14px;"> new_url = self.new_urls.pop()</span><br><span style="font-size: 14px;"> self.old_urls.add(new_url)</span><br><span style="font-size: 14px;"> returnnew_url<br><br></span>

3.通过Python第三方插件openpyxl读写Excel十分方便,把单曲信息通过Excel文件可以很好地保存起来。

1<span style="font-size: 14px;">def write_to_excel(self, content):</span><br><span style="font-size: 14px;"> try:</span><br><span style="font-size: 14px;"> forrow in content:</span><br><span style="font-size: 14px;"> self.workSheet.append([row['song_name'], row['song_url'], row['singer_name'], row['song_time']])</span><br><span style="font-size: 14px;"> self.workBook.save(self.excelName) # 保存单曲信息到Excel文件</span><br><span style="font-size: 14px;"> except Exception asarr:</span><br><span style="font-size: 14px;"> print('write to excel error', arr.args)</span><br><br>

四、后语最后还是要庆祝下,毕竟成功把QQ音乐的单曲信息爬取下来了。本次能够成功爬取单曲,Selenium功不可没,这次只是用到了selenium一些简单的功能,后续会更加深入学习Selenium,不仅在爬虫方面还有UI自动化。后续还需要优化的点:1.下载的链接比较多,一个一个下载起来比较慢,后面打算用多线程并发下载。2.下载速度过快,为了避免服务器禁用IP,后面还要对于同一域名访问过于频繁的问题,有个等待机制,每个请求之间有个等待间隔。3. 解析网页是一个重要的过程,可以采用正则表达式,BeautifulSoup和lxml,目前采用的是BeautifulSoup库, 在效率方面,BeautifulSoup没lxml效率高,后面会尝试采用lxml。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python类定义的讲解_python面向对象、自定义类等使用实例讲解

python 面向对象相对别的语言来说缺少两个功能&#xff1a; 1、python不具备重载&#xff0c;重载是指在同一个类中&#xff0c;使得方法有相同的名称&#xff0c;但是有不同的参数列表&#xff0c;但由于python函数具有强大的参数处理功能&#xff0c;因此这不是一个问题。 2、…

ubutun 更换网络源_「ubuntu脚本1」开启ssh替换第三方源开启tab键补齐屏蔽nouveau

Ubuntu初始化脚本,安装显卡驱动专用初始化脚本替换apt源为国内清华源,增加docker-ce国内源开启tab键补齐桌面版开启ssh仅支持Ubuntu16/18桌面版安装gcc make屏蔽nouveau 自动重启服务器生效#!/bin/bash #检测网络是否通畅 ping -w 5 qq.com || { echo "网络异常,脚本终止&…

matlab meshgrid函数_matlab入门(三)图像可视化

matlab图像可视化基本要求(1)掌握图形窗口的创建与控制&#xff0c;以及图形窗口的基本操作&#xff1b;(2)熟练掌握二维和三维绘图基本的命令、线型控制&#xff1b;(3)初步掌握用特殊的图形来表现特殊数据的性质&#xff0c;如面积图、直方 图、饼图等。(4)掌握坐标轴的控制和…

hashmap remove 没释放内存_java从零开始手写 redis(13)HashMap 源码原理详解

为什么学习 HashMap 源码&#xff1f;作为一名 java 开发&#xff0c;基本上最常用的数据结构就是 HashMap 和 List&#xff0c;jdk 的 HashMap 设计还是非常值得深入学习的。无论是在面试还是工作中&#xff0c;知道原理都对会我们有很大的帮助。本篇的内容较长&#xff0c;建…

南京高中计算机老师,南京市教育局召开中小学教师信息技术应用能力提升工程2.0市级专家组工作会议...

2021年3月2日上午&#xff0c;南京市中小学教师信息技术应用能力提升工程2.0市级专家组工作会议在雨花台区教师发展中心召开。市教育局副局长祁寿东出席会议并讲话&#xff0c;市教研室、教科所、电教馆、教师发展学院主要负责同志&#xff0c;市级专家团队成员及各区教师发展中…

python计算执行时间的函数_[python] 统计函数运行时间

第一种&#xff1a; import time def time_me(fn): #fn 是要修饰/修改 的函数 def _wrapper(*args, **kwargs): #这个 _wrapper(*args, **kwargs) 则代指fn, *args 代表一般变量参数&#xff0c; **kwargs代表 字典&#xff0c;哈希等参数 start time.perf_counter() fn(*args…

arthas 排查内存溢出_Java 应用线上问题排查思路、常用工具小结

前言本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知&#xff0c;免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。只不过这里先提示一下。在线上应急过程中要记住&#xff0c;只有一个…

flutter listview 滚动到指定位置_Flutter 布局原理及实战

1. Flutter UI架构Flutter将视图数据抽象成为三个部分&#xff0c;即Widget树、Element树和RenderObject树。Widget树&#xff1a;控件的配置信息&#xff0c;不涉及渲染&#xff0c;更新代价极低。RenderObject树&#xff1a;真正的UI渲染树&#xff0c;负责渲染UI&#xff0c…

雷神开机logo更改_国产外星人雷神再发新品 911MT逐影者RTX2060光追游戏本评测

随着NVIDIA发布了笔记本20系显卡之后&#xff0c;宣示着全民进入了“RTX光线追踪时代”&#xff0c;各种新款的游戏也纷纷宣布支持“光线追踪”技术来吸引更多的玩家&#xff0c;似乎现在游戏本上没有个“RTX”贴纸就已经不好意思跟别人打招呼了。说到2019年的RTX新品&#xff…

AJAX框架衣柜内部布局,​最合理的衣柜内部布局解析,3大细节不容小觑

时常有业主或者朋友问小轻&#xff0c;最合理的衣柜内部布局应该是怎样的&#xff0c;确实这对于非业内人士一般都是不太清楚的&#xff0c;即使有的朋友已经有了丰富的生活经验&#xff0c;甚至是业内人士也不一定对此完全了解。那么到底最合理的衣柜内部布局是怎样的呢&#…

python爬取数据保存为csv时生成编号_将爬取到到数据以CSV格式存储

CSV文件存储 CSV&#xff0c;全称为Comma-Separated Values&#xff0c;中文可以叫做逗号分隔值或字符分隔值&#xff0c;其文件以纯文本形式存储表格数据。该文件是一个字符序列&#xff0c;可以由任意数目的记录组成&#xff0c;记录间以某种换行符分隔。每条记录由字段组成&…

博达3956交换机配置手册_网络设备维保浅谈之交换机维保

随着信息化的飞速发展&#xff0c;交换机作为信息流通的承载者&#xff0c;是应用最为广泛的网络设备之一&#xff0c;其作用不言而喻。因此&#xff0c;在日产使用中&#xff0c;要注意交换机这种核心的设备的维护与保养&#xff0c;以免引发故障。交换机运维需要注意哪些问题…

java cas原理_Java并发之原子变量及CAS算法-上篇

Java并发之原子变量及CAS算法-上篇编辑​概述本文主要讲在Java并发编程的时候&#xff0c;如果保证变量的原子性&#xff0c;在JDK提供的类中是怎么保证变量原子性的呢&#xff1f;。对应Java中的包是&#xff1a;java.util.concurrent.atomic包下。因为涉及到了CAS算法&#x…

node ajax validator,使用validator.js对字符串数据进行验证

validator.js是一个对字符串进行数据验证和过滤的工具库&#xff0c;同时支持Node端和浏览器端&#xff0c;github地址是https://github.com/chriso/validator.js主要API如下&#xff1a;验证APIcontains(str, seed)验证str中是否含有seedequals(str, comparison)验证是否相等i…

css span 右端对齐_CSS标准文档流

web页面的制作&#xff0c;是个“流”&#xff0c;像水流一样&#xff0c;必须从上往下&#xff0c;一点点的编织&#xff0c;不像画画&#xff0c;可以这个地方画一个&#xff0c;另一个地方画一个&#xff0c;随意而为。标准文档流的一些微观现象1. 空白折叠现象1)标签与标签…

composer升级_Composer 使用姿势与 Lumen 升级指南

Composer 使用姿势这里主要说说 composer.json 和 composer.lock 文件的作用。composer.jsoncomposer.json 文件包含了项目的依赖和其它的一些元数据&#xff0c;使用 JSON format 编写。当初次调用 composer install 时&#xff0c;Composer 会根据 composer.json 文件&#x…

服务器间传文件$d,基于OpenSSH+WinSCP完成Windows服务器之间的文件传输

背景经常会遇到在不同服务器之间传输文件&#xff0c;Linux和Linux之间用命令rsync&#xff0c; windows和linux之间普遍是有图形化界面的ftp软件&#xff0c;老黄平时用的比较多的是FileZilla。Windows和Windows之间的话&#xff0c;90%都是在一台机器复制&#xff0c;到另一台…

dbgrideh 为什么只一行_Mysql性能优化:为什么count(*)这么慢?

导读在开发中一定会用到统计一张表的行数&#xff0c;比如一个交易系统&#xff0c;老板会让你每天生成一个报表&#xff0c;这些统计信息少不了sql中的count函数。但是随着记录越来越多&#xff0c;查询的速度会越来越慢&#xff0c;为什么会这样呢&#xff1f;Mysql内部到底是…

jmeter 高并发测试报告_JMeter分布式测试

一、为什么要使用分布式测试按照一般的压力机配置&#xff0c;jmeter的GUI模式下(Windows)&#xff0c;最多支持300左右的模拟请求线程&#xff0c;再大的话&#xff0c;容易造成卡顿、无响应等情况&#xff0c;这是限于jmeter其本身的机制和硬件配置。有时候为了尽量模拟业务场…

半圆阴影_六年级数学:怎么求阴影部分面积?正方形与半圆,割补法常考题

欢迎您来到方老师数学课堂&#xff0c;请点击上方蓝色字体&#xff0c;添加关注。所有的视频内容&#xff0c;全部免费&#xff0c;请大家放心关注&#xff0c;放心订阅。六年级数学&#xff1a;怎么求阴影部分面积&#xff1f;正方形与半圆&#xff0c;割补法常考题。大家先在…