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图像灰度变换及图像数组操作
Jan 27 Python
python中enumerate函数遍历元素用法分析
Mar 11 Python
Python 加密与解密小结
Dec 06 Python
python对象与json相互转换的方法
May 07 Python
python线程中的同步问题及解决方法
Aug 29 Python
详解python中docx库的安装过程
Nov 08 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Python如何将图像音视频等资源文件隐藏在代码中(小技巧)
Feb 16 Python
python实现从ftp服务器下载文件
Mar 03 Python
Django操作session 的方法
Mar 09 Python
如何使用 Python 读取文件和照片的创建日期
Sep 05 Python
python+selenium实现12306模拟登录的步骤
Jan 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
模仿OSO的论坛(三)
2006/10/09 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
一些需要禁用的PHP危险函数(disable_functions)
2012/02/23 PHP
PHP加密扩展库Mcrypt安装和实例
2013/11/10 PHP
php使用json_encode对变量json编码
2014/04/07 PHP
php中chdir()函数用法实例
2014/11/13 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
浏览器脚本兼容 文本框中,回车键触发事件的兼容
2010/06/21 Javascript
最短的javascript:地址栏载入脚本代码
2011/10/13 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
JavaScript修改css样式style动态改变元素样式
2013/12/16 Javascript
Javascript自定义函数判断网站访问类型是PC还是移动终端
2014/01/10 Javascript
javascript搜索框点击文字消失失焦时文本出现
2014/09/18 Javascript
Angularjs编写KindEditor,UEidtor,jQuery指令
2015/01/28 Javascript
JS实现的4种数字千位符格式化方法分享
2015/03/02 Javascript
第七篇Bootstrap表单布局实例代码详解(三种表单布局)
2016/06/21 Javascript
AngularJs $parse、$eval和$observe、$watch详解
2016/09/21 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
vue过渡和animate.css结合使用详解
2017/06/14 Javascript
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
JS操作Fckeditor的一些常用方法(获取、插入等)
2020/02/19 Javascript
小程序跳转H5页面的方法步骤
2020/03/06 Javascript
浅谈Python里面小数点精度的控制
2018/07/16 Python
对python周期性定时器的示例详解
2019/02/19 Python
利用canvas实现图片下载功能来实现浏览器兼容问题
2019/05/31 HTML / CSS
HTML5 embed标签定义和用法详解
2014/05/09 HTML / CSS
公司总经理工作职责管理办法
2014/02/28 职场文书
惊涛骇浪观后感
2015/06/05 职场文书
优秀共产党员事迹材料2016
2016/02/29 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
Nginx tp3.2.3 404问题解决方案
2021/03/31 Servers
python爬取新闻门户网站的示例
2021/04/25 Python
原生JS中应该禁止出现的写法
2021/05/05 Javascript
C#连接ORACLE出现乱码问题的解决方法
2021/10/05 Oracle