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写的ARP攻击代码实例
Jun 04 Python
详解Python中time()方法的使用的教程
May 22 Python
Python实现文件复制删除
Apr 19 Python
python队列queue模块详解
Apr 27 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Python中如何使用if语句处理列表实例代码
Feb 24 Python
Python文件操作中进行字符串替换的方法(保存到新文件/当前文件)
Jun 28 Python
Python异常模块traceback用法实例分析
Oct 22 Python
Python3基本输入与输出操作实例分析
Feb 14 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 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中二分法查找算法实例分析
2016/09/22 PHP
PHP验证码无法显示的原因及解决办法
2017/08/11 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
JavaScript是否可实现多线程  深入理解JavaScript定时机制
2009/12/22 Javascript
获取客户端电脑日期时间js代码(jquery)
2012/09/12 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
jQuery ajax(复习)—Baidu ajax request分离版
2013/01/24 Javascript
js读取被点击次数的简单实例(从数据库中读取)
2014/03/07 Javascript
javascript常见用法总结
2014/05/22 Javascript
JQuery判断radio是否选中并获取选中值的示例代码
2014/10/17 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
PassWord输入框代码分享
2016/06/07 Javascript
原生js编写焦点图效果
2016/12/08 Javascript
详解jQuery中基本的动画方法
2016/12/14 Javascript
JQuery.dataTables表格插件添加跳转到指定页
2017/06/09 jQuery
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
vue iview组件表格 render函数的使用方法详解
2018/03/15 Javascript
AngularJS 应用模块化的使用
2018/04/04 Javascript
原生js实现随机点名功能
2019/11/05 Javascript
深入解析微信小程序开发中遇到的几个小问题
2020/07/11 Javascript
[36:33]2018DOTA2亚洲邀请赛 4.3 突围赛 EG vs Newbee 第二场
2018/04/04 DOTA
Python之批量创建文件的实例讲解
2018/05/10 Python
python实现贪吃蛇小游戏
2020/03/21 Python
python 利用文件锁单例执行脚本的方法
2019/02/19 Python
详解python 爬取12306验证码
2019/05/10 Python
python自动分箱,计算woe,iv的实例代码
2019/11/22 Python
Django Model中字段(field)的各种选项说明
2020/05/19 Python
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
详解Html5原生拖拽操作
2018/01/12 HTML / CSS
Diesel美国网上商店:意大利牛仔时装品牌
2020/12/10 全球购物
2014年团支部工作总结
2014/11/17 职场文书
情感电台广播稿
2015/08/18 职场文书
Python实现byte转integer
2021/06/03 Python
java设计模式--七大原则详解
2021/07/21 Java/Android