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的一些用法分享
Oct 07 Python
在Mac OS上搭建Python的开发环境
Dec 24 Python
python使用str &amp; repr转换字符串
Oct 13 Python
Python搭建HTTP服务器和FTP服务器
Mar 09 Python
python实现黑客字幕雨效果
Jun 21 Python
python中pip的安装与使用教程
Aug 10 Python
python 文本单词提取和词频统计的实例
Dec 22 Python
Python从单元素字典中获取key和value的实例
Dec 31 Python
pytorch索引查找 index_select的例子
Aug 18 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
Python pandas 列转行操作详解(类似hive中explode方法)
May 18 Python
Python selenium实现断言3种方法解析
Sep 08 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
深入HTTP响应状态码速查表的详解
2013/06/07 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
php使用ffmpeg向视频中添加文字字幕的实现方法
2016/05/23 PHP
PHP数组去重的更快实现方式分析
2018/05/09 PHP
PHP fopen中文文件名乱码问题解决方案
2020/10/28 PHP
PHP 实现链式操作
2021/03/09 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
jquery 无限级联菜单案例分享
2013/03/26 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
2014/02/24 Javascript
jQuery实现设置、移除文本框默认值功能
2015/01/13 Javascript
javascript实现点击提交按钮后显示loading的方法
2015/07/03 Javascript
详解vue-validator(vue验证器)
2017/01/16 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
详解在React项目中安装并使用Less(用法总结)
2019/03/18 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
vue 解决移动端弹出键盘导致页面fixed布局错乱的问题
2019/11/06 Javascript
vue axios封装httpjs,接口公用配置拦截操作
2020/08/11 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
[52:32]完美世界DOTA2联赛PWL S2 Magma vs LBZS 第三场 11.18
2020/11/18 DOTA
python Crypto模块的安装与使用方法
2017/12/21 Python
Django中的ajax请求
2018/10/19 Python
python判断文件是否存在,不存在就创建一个的实例
2019/02/18 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
Python如何调用JS文件中的函数
2019/08/16 Python
python多线程案例之多任务copy文件完整实例
2019/10/29 Python
python爬虫实现POST request payload形式的请求
2020/04/30 Python
python破解同事的压缩包密码
2020/10/14 Python
一年级数学教学反思
2014/02/01 职场文书
初中新生军训方案
2014/05/13 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
财务务虚会发言材料
2014/10/20 职场文书
青年文明号申报材料
2014/12/23 职场文书
地球一小时活动总结
2015/02/27 职场文书
小学教师求职信范文
2015/03/20 职场文书
导游词之襄阳古城
2019/09/27 职场文书
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技