python爬虫之爬取百度音乐的实现方法


Posted in Python onAugust 24, 2019

在上次的爬虫中,抓取的数据主要用到的是第三方的Beautifulsoup库,然后对每一个具体的数据在网页中的selecter来找到它,每一个类别便有一个select方法。对网页有过接触的都知道很多有用的数据都放在一个共同的父节点上,只是其子节点不同。在上次爬虫中,每一类数据都要从其父类(包括其父节点的父节点)上往下寻找ROI数据所在的子节点,这样就会使爬虫很臃肿,因为很多数据有相同的父节点,每次都要重复的找到这个父节点。这样的爬虫效率很低。

因此,笔者在上次的基础上,改进了一下爬取的策略,笔者以实例来描述。

python爬虫之爬取百度音乐的实现方法

如图,笔者此次爬取的是百度音乐的页面,所爬取的类容是上面榜单下的所有内容(歌曲名,歌手,排名)。如果按照上次的爬虫的方法便要写上三个select方法,分别抓取歌曲名,歌手,排名,但笔者观察得知这三项数据皆放在一个li标签内,如图:

python爬虫之爬取百度音乐的实现方法

这样我们是不是直接抓取ul标签,再分析其中的数据便可得到全部数据了?答案是,当然可以。

但Beaufulsoup不能直接提供这样的方法,但Python无所不能,python里面自带的re模块是我见过最迷人的模块之一。它能在字符串中找到我们让我们roi的区域,上述的li标签中包含了我们需要的歌曲名,歌手,排名数据,我们只需要在li标签中通过re.findall()方法,便可找到我们需要的数据。这样就能够大大提升我们爬虫的效率。

我们先来直接分析代码:

def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S) 
 pattern2 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S) 
 
 wants = [] 
 for item in data: 
  # print(item) 
  final = re.findall(pattern1, str(item)) 
  if len(final) == 1: 
   # print(final[0]) 
   wants.append(final[0]) 
  else: 
   other = re.findall(pattern2, str(item)) 
   # print(other[0]) 
   wants.append(other[0]) 
 return wants

上面的代码是我分析网页数据的全部代码,这里不得不说python语言的魅力,数十行代码便能完成java100行的任务,C/C++1000行的任务。上述函数中,笔者首先通过Beautifulsoup得到该网页的源代码,再通过select()方法得到所有li标签中的数据。

到这里,这个爬虫便要进入到最重要的环节了,相信很多不懂re模块的童靴们有点慌张,在这里笔者真的是强烈推荐对python有兴趣的童靴们一定要学习这个非常重要的一环。首先,我们知道re的方法大多只针对string型数据,因此我们调用str()方法将每个list中的数据(即item)转换为string型。然后便是定义re的pattern了,这是个稍显复杂的东西,其中主要用到re.compile()函数得到要在string中配对的pattern,这里笔者便不累述了,感兴趣的童靴可以去网上查阅一下资料。

上述代码中,笔者写了两个pattern,因为百度音乐的网页里,li标签有两个结构,当用一个pattern在li中找不到数据时,便使用另一个pattern。关于re.findadd()方法,它会返回一个list,里面装着tuple,但其实我们知道我们找到的数据就是list[0],再将每个数据添加到另一个List中,让函数返回。

相信很多看到这里的小伙伴已经云里雾里,无奈笔者对re板块也知道的不多,对python感兴趣的同学可以查阅相关资料再来看一下代码,相信能够如鱼得水。

完整的代码如下:

import requests 
from bs4 import BeautifulSoup 
import re 
 
 
def get_one_page(url): 
 wb_data = requests.get(url) 
 wb_data.encoding = wb_data.apparent_encoding 
 if wb_data.status_code == 200: 
  return wb_data.text 
 else: 
  return None 
 
 
def parse_one_page(html): 
 soup = BeautifulSoup(html, 'lxml') 
 data = soup.select('div.ranklist-wrapper.clearfix div.bd ul.song-list li') 
 pattern1 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?title="(.*?)".*?</li>', re.S) 
 pattern2 = re.compile(r'<li.*?<div class="index">(.*?)</div>.*?title="(.*?)".*?target="_blank">(.*?)</a>', re.S) 
 
 wants = [] 
 for item in data: 
  # print(item) 
  final = re.findall(pattern1, str(item)) 
  if len(final) == 1: 
   # print(final[0]) 
   wants.append(final[0]) 
  else: 
   other = re.findall(pattern2, str(item)) 
   # print(other[0]) 
   wants.append(other[0]) 
 return wants 
 
 
if __name__ == '__main__': 
 url = 'http://music.baidu.com/' 
 html = get_one_page(url) 
 data = parse_one_page(html) 
 for item in data: 
  dict = { 
   '序列': item[0], 
   '歌名': item[1], 
   '歌手': item[2] 
  } 
  print(dict)

最后我们看到的输出结果如下:

python爬虫之爬取百度音乐的实现方法

好了,笔者今天就到这里了。希望喜欢python的萌新能够快速实现自己的spider,也希望一些大神们能够看到这篇文章时不吝赐教。

以上这篇python爬虫之爬取百度音乐的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在漏洞利用Python代码真的很爽
Aug 26 Python
Python中文件I/O高效操作处理的技巧分享
Feb 04 Python
python3使用requests模块爬取页面内容的实战演练
Sep 25 Python
你眼中的Python大牛 应该都有这份书单
Oct 31 Python
python2.7无法使用pip的解决方法(安装easy_install)
Apr 03 Python
python re库的正则表达式入门学习教程
Mar 08 Python
Python中新式类与经典类的区别详析
Jul 10 Python
PyQt5+Caffe+Opencv搭建人脸识别登录界面
Aug 28 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python实现人工蜂群算法
Sep 18 Python
Python&Matlab实现樱花的绘制
Apr 07 Python
python3 实现爬取TOP500的音乐信息并存储到mongoDB数据库中
Aug 24 #Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 #Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 #Python
简单分析python的类变量、实例变量
Aug 23 #Python
python3 selenium自动化 frame表单嵌套的切换方法
Aug 23 #Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 #Python
python3 selenium自动化测试 强大的CSS定位方法
Aug 23 #Python
You might like
php中session与cookie的比较
2015/01/27 PHP
js倒计时小程序
2013/11/05 Javascript
js 判断文件类型并控制表单提交示例代码
2013/11/14 Javascript
使用Node.js实现一个简单的FastCGI服务器实例
2014/06/09 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
js通过iframe加载外部网页的实现代码
2015/04/05 Javascript
jQuery常用且重要方法汇总
2015/07/13 Javascript
超实用的JavaScript表单代码段
2016/02/26 Javascript
JS生成某个范围的随机数【四种情况详解】
2016/04/20 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
JavaScript脚本语言是什么_动力节点Java学院整理
2017/06/26 Javascript
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
javascript中join方法实例讲解
2019/02/21 Javascript
jQuery实现input输入框获取焦点与失去焦点时提示的消失与显示功能示例
2019/05/27 jQuery
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Python分支语句与循环语句应用实例分析
2019/05/07 Python
网易2016研发工程师编程题 奖学金(python)
2019/06/19 Python
python通过robert、sobel、Laplace算子实现图像边缘提取详解
2019/08/21 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
解决python ThreadPoolExecutor 线程池中的异常捕获问题
2020/04/08 Python
Python如何实现邮件功能
2020/05/27 Python
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
西班牙用户之间买卖视频游戏的平台:Wakkap
2020/03/21 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
DOM和JQuery对象有什么区别
2016/11/11 面试题
计算机系毕业生推荐信
2013/11/06 职场文书
安全检查与奖惩制度
2014/01/23 职场文书
电气工程及其自动化专业求职信
2014/06/23 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
四群教育工作总结
2015/08/10 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis