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 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
Python实现一个简单的MySQL类
Jan 07 Python
Python实现删除Android工程中的冗余字符串
Jan 19 Python
python复制文件的方法实例详解
May 22 Python
Python lxml模块安装教程
Jun 02 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
PyQt5固定窗口大小的方法
Jun 18 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
PyTorch中permute的用法详解
Dec 30 Python
Python实现钉钉订阅消息功能
Jan 14 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
php的curl实现get和post的代码
2008/08/23 PHP
Jquery替换已存在于element上的event的方法
2010/03/09 Javascript
jquery一句话全选/取消全选
2011/03/01 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
jquery复选框checkbox实现删除前判断
2014/04/20 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
AngularJS中使用HTML5手机摄像头拍照
2016/02/22 Javascript
jquery实现ajax加载超时提示的方法
2016/07/23 Javascript
jquery 动态增加,减少input表单的简单方法(必看)
2016/10/12 Javascript
Bootstrap CSS布局之列表
2016/12/15 Javascript
利用Plupload.js解决大文件上传问题, 带进度条和背景遮罩层
2017/03/15 Javascript
使用html+js+css 实现页面轮播图效果(实例讲解)
2017/09/21 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
layui操作列按钮个数和文字颜色的判断实例
2019/09/11 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
使用konva和vue-konva库实现拖拽滑块验证功能
2020/04/27 Javascript
Python Tkinter GUI编程入门介绍
2015/03/10 Python
Python中的一些陷阱与技巧小结
2015/07/10 Python
简单谈谈python中的lambda表达式
2018/01/19 Python
Python文本统计功能之西游记用字统计操作示例
2018/05/07 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
Python3 把一个列表按指定数目分成多个列表的方式
2019/12/25 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
css3进阶之less实现星空动画的示例代码
2019/09/10 HTML / CSS
h5封装下拉刷新
2020/08/25 HTML / CSS
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
三八红旗集体先进事迹材料
2014/05/22 职场文书
小学生春游活动方案
2014/08/20 职场文书
警察正风肃纪剖析材料
2014/10/16 职场文书
资料员岗位职责范本
2015/04/13 职场文书
大学生暑期实践报告
2015/07/13 职场文书
2016中学教师读书心得体会
2016/01/13 职场文书
高并发下Redis如何保持数据一致性(避免读后写)
2022/03/18 Redis
ipad隐藏软件app图标方法
2022/04/19 数码科技