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 字符串操作方法大全
Mar 11 Python
Python和GO语言实现的消息摘要算法示例
Mar 10 Python
Python读写txt文本文件的操作方法全解析
Jun 26 Python
python3转换code128条形码的方法
Apr 17 Python
Python3简单实现串口通信的方法
Jun 12 Python
在python中将list分段并保存为array类型的方法
Jul 15 Python
Flask框架 CSRF 保护实现方法详解
Oct 30 Python
Python如何使用函数做字典的值
Nov 30 Python
Python 给下载文件显示进度条和下载时间的实现
Apr 02 Python
Python3 pywin32模块安装的详细步骤
May 26 Python
Python中zipfile压缩文件模块的基本使用教程
Jun 14 Python
Python打印不合法的文件名
Jul 31 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
snoopy 强大的PHP采集类使用实例代码
2010/12/09 PHP
第四章 php数学运算
2011/12/30 PHP
解决PHP mysql_query执行超时(Fatal error: Maximum execution time …)
2013/07/03 PHP
php实现生成带二维码图片并强制下载功能
2018/02/24 PHP
laravel框架使用阿里云短信发送消息操作示例
2020/02/15 PHP
编写高性能的JavaScript 脚本的加载与执行
2010/04/19 Javascript
JQuery 中几个类选择器的简单使用介绍
2013/03/14 Javascript
JS操作CSS随机改变网页背景实现思路
2014/03/10 Javascript
JavaScript实现可拖拽的拖动层Div实例
2015/08/05 Javascript
Three.js学习之Lamber材质和Phong材质
2016/08/04 Javascript
用JS中split方法实现彩色文字背景效果实例
2016/08/24 Javascript
Vue.js教程之axios与网络传输的学习实践
2017/04/29 Javascript
vue-cli监听组件加载完成的方法
2018/09/07 Javascript
js 判断当前时间是否处于某个一个时间段内
2019/09/19 Javascript
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
[08:53]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS 选手采访
2021/03/11 DOTA
Python的lambda匿名函数的简单介绍
2013/04/25 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python中struct模块对字节流/二进制流的操作教程
2017/01/21 Python
Python实现简单文本字符串处理的方法
2018/01/22 Python
python用户管理系统
2018/03/13 Python
用python实现刷点击率的示例代码
2019/02/21 Python
两个元祖T1=('a', 'b'),T2=('c', 'd')使用匿名函数将其转变成[{'a': 'c'},{'b': 'd'}]的几种方法
2019/03/05 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
Python多个装饰器的调用顺序实例解析
2020/05/22 Python
Python接口测试文件上传实例解析
2020/05/22 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Python爬虫之Selenium下拉框处理的实现
2020/12/04 Python
CSS超出文本指定宽度用省略号代替和文本不换行
2016/05/05 HTML / CSS
AmazeUI中各种的导航式菜单与解决方法
2020/08/19 HTML / CSS
美国地毯购买网站:Rugs USA
2019/02/23 全球购物
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
保研推荐信
2014/05/09 职场文书
合作协议书范文
2014/08/20 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python