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 相关文章推荐
Django中实现点击图片链接强制直接下载的方法
May 14 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
Python实现读取及写入csv文件的方法示例
Jan 12 Python
详解Python3中setuptools、Pip安装教程
Jun 18 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
全面了解django的缓存机制及使用方法
Jul 22 Python
python matplotlib库直方图绘制详解
Aug 10 Python
在Pytorch中使用样本权重(sample_weight)的正确方法
Aug 17 Python
python自动发微信监控报警
Sep 06 Python
利用Python产生加密表和解密表的实现方法
Oct 15 Python
Python制作简易版小工具之计算天数的实现思路
Feb 13 Python
Flask-SocketIO服务端安装及使用代码示例
Nov 26 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
解决GD中文乱码问题
2007/02/14 PHP
kohana框架上传文件验证规则写法示例
2014/07/14 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
Swoole 5将移除自动添加Event::wait()特性详解
2019/07/10 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
js 字符串操作函数
2009/07/25 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
2014/02/22 Javascript
JavaScript学习小结(一)——JavaScript入门基础
2015/09/02 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
在使用JSON格式处理数据时应该注意的问题小结
2017/05/20 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
手把手教你如何编译打包video.js
2020/12/09 Javascript
Windows系统下安装Python的SSH模块教程
2015/02/05 Python
python 实现tar文件压缩解压的实例详解
2017/08/20 Python
python实现聚类算法原理
2018/02/12 Python
Python实现判断给定列表是否有重复元素的方法
2018/04/11 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
Python实现批量执行同目录下的py文件方法
2019/01/11 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
Pytorch 抽取vgg各层并进行定制化处理的方法
2019/08/20 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
详解如何修改python中字典的键和值
2020/09/29 Python
css背景图片的背景裁切、背景透明度、背景变换等效果运用
2012/12/24 HTML / CSS
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
品管员岗位职责
2013/11/10 职场文书
电子商务毕业生求职信
2013/11/10 职场文书
小学语文教学反思
2014/02/10 职场文书
中班中秋节活动反思
2014/02/18 职场文书
个人承诺书
2014/03/26 职场文书
丧事主持词大全
2014/04/02 职场文书
完美的中文自荐信
2014/05/24 职场文书
保护动物的标语
2014/06/11 职场文书
2014年幼儿园学期工作总结
2014/12/05 职场文书
python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)
2021/04/12 Python
使用Redis实现实时排行榜功能
2021/07/02 Redis