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入门基础之用户输入与模块初认识
Nov 14 Python
python如何获取服务器硬件信息
May 11 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
Jan 10 Python
Python中存取文件的4种不同操作
Jul 02 Python
Python实现i人事自动打卡的示例代码
Jan 09 Python
Python Numpy库常见用法入门教程
Jan 16 Python
python实现简单俄罗斯方块
Mar 13 Python
Python如何实现定时器功能
May 28 Python
基于Python采集爬取微信公众号历史数据
Nov 27 Python
Python实现简单的2048小游戏
Mar 01 Python
python爬取企查查企业信息之selenium自动模拟登录企查查
Apr 08 Python
python数字图像处理之图像的批量处理
Jun 28 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 日期和时间的处理-郑阿奇(续)
2011/07/04 PHP
php使用str_replace实现输入框回车替换br的方法
2014/11/24 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
php判断手机浏览还是web浏览,并执行相应的动作简单实例
2016/07/28 PHP
javaScript 数值型和字符串型之间的转换
2009/07/25 Javascript
JQuery在页面中添加和除移DOM示例代码
2013/06/24 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
JavaScript定义类和对象的方法
2014/11/26 Javascript
jQuery Mobile页面返回不需要重新get
2016/04/26 Javascript
JS 数字转换为大写金额的简单实例
2016/08/04 Javascript
jQuery监听浏览器窗口大小的变化实例
2017/02/07 Javascript
通过 JS 判断页面是否有滚动条的实现方法
2018/04/05 Javascript
详解node字体压缩插件font-spider的用法
2018/09/28 Javascript
vue封装一个简单的div框选时间的组件的方法
2019/01/06 Javascript
Node.js 进程平滑离场剖析小结
2019/01/24 Javascript
解决layUI的页面显示不全的问题
2019/09/20 Javascript
react-router-dom 嵌套路由的实现
2020/05/02 Javascript
在vue中给后台接口传的值为数组的格式代码
2020/11/12 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python中函数及默认参数的定义与调用操作实例分析
2017/07/25 Python
python PyTorch预训练示例
2018/02/11 Python
Python网络编程使用select实现socket全双工异步通信功能示例
2018/04/09 Python
利用pyinstaller将py文件打包为exe的方法
2018/05/14 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
流行文化收藏品:Sideshow(DC漫画,星球大战,漫威)
2019/03/17 全球购物
先进集体获奖感言
2014/02/13 职场文书
环保倡议书
2014/04/14 职场文书
活动总结怎么写啊
2014/05/07 职场文书
乡党政领导班子群众路线教育实践活动个人对照检查材料
2014/09/20 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
清明祭英烈活动总结
2015/05/11 职场文书
酒店员工手册范本
2015/05/14 职场文书
河童之夏观后感
2015/06/11 职场文书
暗恋桃花源观后感
2015/06/12 职场文书
护士医德医风心得体会
2016/01/25 职场文书
python如何在word中存储本地图片
2021/04/07 Python