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简单实现子网掩码转换的方法
Apr 13 Python
关于pip的安装,更新,卸载模块以及使用方法(详解)
May 19 Python
python tensorflow基于cnn实现手写数字识别
Jan 01 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
Python之pymysql的使用小结
Jul 01 Python
利用python开发app实战的方法
Jul 09 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
利用PyQt中的QThread类实现多线程
Feb 18 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
python实现计算器简易版
Dec 17 Python
Django解决frame拒绝问题的方法
Dec 18 Python
Python sklearn分类决策树方法详解
Sep 23 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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
修改ThinkPHP缓存为Memcache的方法
2014/06/25 PHP
php分割合并两个字符串的函数实例
2015/06/19 PHP
Yii2表单事件之Ajax提交实现方法
2017/05/04 PHP
给Function做的OOP扩展
2009/05/07 Javascript
extjs 04_grid 单击事件新发现
2012/11/27 Javascript
JavaScript String.replace函数参数实例说明
2013/06/06 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
javascript使用call调用微信API
2014/12/15 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
vue自定义全局组件(自定义插件)的用法
2018/01/30 Javascript
微信小程序封装的HTTP请求示例【附升级版】
2019/05/11 Javascript
Vue2.x通用条件搜索组件的封装及应用详解
2019/05/28 Javascript
微信小程序动态设置图片大小的方法
2019/11/21 Javascript
js实现选项卡效果
2020/03/07 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
JavaScript实现点击图片换背景
2020/11/20 Javascript
jQuery实现增删改查
2020/12/22 jQuery
[01:32]DOTA2次级联赛——首支职业女子战队选拔赛全记录
2014/10/23 DOTA
Python下的subprocess模块的入门指引
2015/04/16 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
2018/04/30 Python
基于python实现雪花算法过程详解
2019/11/16 Python
CSS3实现滚动条动画效果代码分享
2016/08/03 HTML / CSS
HTML5 canvas绘制的玫瑰花效果
2014/05/29 HTML / CSS
Pureology官网:为染色头发打造最好的产品
2019/09/13 全球购物
本科生个人求职自荐信
2013/09/26 职场文书
产品质量承诺书范文
2014/03/27 职场文书
导师推荐信范文
2014/05/09 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
教师自查自纠材料
2014/10/14 职场文书
护士自荐信范文(2016推荐篇)
2016/01/28 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers