Python实现提取谷歌音乐搜索结果的方法


Posted in Python onJuly 10, 2015

本文实例讲述了Python实现提取谷歌音乐搜索结果的方法。分享给大家供大家参考。具体如下:

Python的简单脚本,用于提取谷歌音乐搜索页面中的歌曲信息,包括歌曲名,作者,专辑名,现在链接等,最多只提取10页结果。

#! /usr/bin/env python
#coding=utf-8
'''
Created on 2011-8-19
@author: yaoboyuan
'''
from urllib import request,parse
import re,sys
def extractSongRawData(text):
  '抓取每一首歌的原始数据'
  text = re.sub('\n+','',text)
  songList = re.findall('\<tbody.*?\</tbody>',text)
  nums = len(songList)
  print('search ' + str(nums) + ' songs')
  return songList
def translate(text):
  '去掉text中的无用字符,转换unicode码'
  text = re.sub('\<b>','',text)
  text = re.sub('\</b>','',text)
  #find the 成 and translate into chinese
  s = re.findall('&#([0-9]+);',text)
  if len(s)<=0:
    return text
  else:
    text = ''
    for i in range(len(s)):
      value = int(s[i],10) #from str'123' to 10 base's int 124
      text += chr(value)  #from value to char
    return text
def extractSongName(song):
  '提取歌曲名字'
  td = re.findall('(?:\<td class\="Title).*(?:\</td>)',song)
  name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])
  songName = translate(name[0])
  return songName
def extractAuthorName(song):
  '提取作者名字'
  td = re.findall('(?:\<td class\="Artist).*(?:\</td>)',song)
  name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])
  authorName = name[0]
  authorName = translate(authorName)
  return authorName
def extrackAlbumName(song):
  '提取专辑名字'
  td = re.findall('(?:\<td class\="Album).*(?:\</td>)',song)
  name = re.findall('.+?\<a.+?>(.*?)\</a>',td[0])
  albumName = translate(name[0])
  return albumName
def extractID(song):
  '提取歌曲id'
  td = re.findall('''\<tbody id\="([a-zA-Z0-9]+)"''',song)
  if len(td)>0:
    return td[0]
  else:
    return song
def extractLink(song):
  '提取歌曲下载链接'
  td = re.findall('''\<td class\="Icon.*?(?=title\="下载").*?onclick\="(.*?)>''',song)
  if len(td) == 0:
    return 'NULL'
  s = str(td[0])
  rawLink = re.findall('http.*?(?=\?)',s)
  if len(rawLink) == 0:
    return s
  link = rawLink[0]
  link = re.sub('%3D','=',link)
  id = extractID(song)
  return link + '?id=' + id
def extractPageNums(text):
  '提取返回结果的页数,最多要10页'
  pageList = re.findall('page_link',text)
  return len(pageList)
def extractSongInfo(song):
  '提取歌曲信息,返回歌曲列表'
  songList = []
  for i in range(len(song)):
    songName = extractSongName(song[i])
    authorName = extractAuthorName(song[i])
    albumName = extrackAlbumName(song[i])
    link = extractLink(song[i])
    songItem = [songName,authorName,albumName,link]
    songList.append(songItem)
    index = ''
    if i<9:
      index = '0' + str(i+1)
    else:
      index = str(i + 1)
    #print(index + ' ' + songName + ' ' + authorName + ' ' + albumName + ' ' + link)
  return songList
def main():
  while True:
    url = 'http://www.google.cn/music/search?q='
    key = input('请输入歌曲名字或关键字:')
    key = parse.quote(key) #统一编码成utf-8
    url += key
    mf = request.urlopen(url)
    c = mf.readall()
    c = str(c,encoding = 'utf-8')
    num = extractPageNums(c)
    print(str(num+1) + ' pages found')
    song = extractSongRawData(c)
    songList = extractSongInfo(song)
    #if the result great than 2 pages, then request all pages
    if num>0:
      for i in range(num):
        start = (i+1)*20
        next_page = '&cat=song&start=%d'%(start)
        #next_page = parse.quote(next_page) #统一编码成utf-8
        url += next_page
        mf = request.urlopen(url)
        c = mf.readall()
        c = str(c,encoding = 'utf-8')
        song = extractSongRawData(c)
        songList += extractSongInfo(song) #find all results
    for i in range(len(songList)): #print the result
      index = ''
      if i<9:
        index = '0' + str(i+1)
      else:
        index = str(i + 1)
      print(index + ' ' + str(songList[i]))
if __name__ == '__main__':
  main()

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
跟老齐学Python之Python安装
Sep 12 Python
Python中装饰器的一个妙用
Feb 08 Python
Python使用sftp实现上传和下载功能(实例代码)
Mar 14 Python
python将ansible配置转为json格式实例代码
May 15 Python
Python内建函数之raw_input()与input()代码解析
Oct 26 Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 Python
解决python tkinter界面卡死的问题
Jul 17 Python
Django ImageFiled上传照片并显示的方法
Jul 28 Python
springboot配置文件抽离 git管理统 配置中心详解
Sep 02 Python
解决springboot yml配置 logging.level 报错问题
Feb 21 Python
python脚本监控logstash进程并邮件告警实例
Apr 28 Python
通过代码实例了解Python异常本质
Sep 16 Python
python和bash统计CPU利用率的方法
Jul 10 #Python
Python多线程下载文件的方法
Jul 10 #Python
Python爬取国外天气预报网站的方法
Jul 10 #Python
Python实现比较两个文件夹中代码变化的方法
Jul 10 #Python
python简单文本处理的方法
Jul 10 #Python
Python实现把json格式转换成文本或sql文件
Jul 10 #Python
Python中的一些陷阱与技巧小结
Jul 10 #Python
You might like
全国FM电台频率大全 - 23 四川省
2020/03/11 无线电
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
PHP排序算法类实例
2015/06/17 PHP
PHP实现补齐关闭的HTML标签
2016/03/22 PHP
解决在laravel中auth建立时候遇到的问题
2019/10/15 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
jQuery(非HTML5)可编辑表格实现代码
2012/12/11 Javascript
详解JavaScript设计模式开发中的桥接模式使用
2016/05/18 Javascript
AngularJs  Using $location详解及示例代码
2016/09/02 Javascript
JavaScript浮点数及运算精度调整详解
2016/10/21 Javascript
Bootstrap CSS组件之大屏幕展播
2016/12/17 Javascript
JQuery EasyUI 结合ztrIee的后台页面开发实例
2017/09/01 jQuery
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
微信小程序rich-text富文本用法实例分析
2019/05/20 Javascript
Vue如何实现验证码输入交互
2020/12/07 Vue.js
[01:20]PWL S2开团时刻第三期——团战可以输 蝙蝠必须死
2020/11/26 DOTA
[01:16:12]完美世界DOTA2联赛PWL S2 FTD vs Inki 第一场 11.21
2020/11/23 DOTA
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python对象转JSON字符串的方法
2016/04/27 Python
浅谈django中的认证与登录
2016/10/31 Python
Python操作Excel之xlsx文件
2017/03/24 Python
Python连接phoenix的方法示例
2017/09/29 Python
使用python读取txt文件的内容,并删除重复的行数方法
2018/04/18 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
使用urllib库的urlretrieve()方法下载网络文件到本地的方法
2018/12/19 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Django文件存储 默认存储系统解析
2019/08/02 Python
梵蒂冈和罗马卡:Omnia Card Pass
2018/02/10 全球购物
求职简历的自我评价
2014/01/31 职场文书
食品安全检查制度
2014/02/03 职场文书
法律六进活动方案
2014/03/13 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
小学英语复习计划
2015/01/19 职场文书
python中的None与NULL用法说明
2021/05/25 Python
SpringBoot详解自定义Stater的应用
2022/07/15 Java/Android