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根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
python使用pymysql实现操作mysql
Sep 13 Python
Python查看微信撤回消息代码
Jun 07 Python
python计算阶乘和的方法(1!+2!+3!+...+n!)
Feb 01 Python
Python中使用__new__实现单例模式并解析
Jun 25 Python
python适合人工智能的理由和优势
Jun 28 Python
python做接口测试的必要性
Nov 20 Python
Tensorflow 使用pb文件保存(恢复)模型计算图和参数实例详解
Feb 11 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 Python
深度学习详解之初试机器学习
Apr 14 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日期转时间戳,指定日期转换成时间戳
2012/07/17 PHP
php中memcache 基本操作实例
2015/05/17 PHP
PHP递归创建多级目录
2015/11/05 PHP
php编程每天必学之表单验证
2016/03/01 PHP
thinkPHP中_initialize方法实例分析
2016/12/05 PHP
利用PHP判断是手机移动端还是PC端访问的函数示例
2017/12/14 PHP
PHP开发之用微信远程遥控服务器
2018/01/25 PHP
用cssText批量修改样式
2009/08/29 Javascript
JQuery之拖拽插件实现代码
2011/04/14 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
jquery实现智能感知连接外网搜索
2013/05/21 Javascript
jQuery UI 实现email输入提示实例
2013/08/15 Javascript
jQuery添加删除DOM元素方法详解
2016/01/18 Javascript
关于vuex的学习实践笔记
2017/04/05 Javascript
微信小程序开发中的疑问解答汇总
2017/07/03 Javascript
基于jquery实现多级菜单效果
2017/07/25 jQuery
jQuery实现点击DIV同时点击CheckBox,并为DIV上背景色的实例
2017/12/18 jQuery
JS实现求字符串中出现最多次数的字符和次数示例
2019/07/05 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
AngularJS动态生成select下拉框的方法实例
2019/11/17 Javascript
python3模拟百度登录并实现百度贴吧签到示例分享(百度贴吧自动签到)
2014/02/24 Python
Python实现的爬虫功能代码
2017/06/24 Python
python浪漫表白源码
2019/04/05 Python
Django框架模板的使用方法示例
2019/05/25 Python
Python中函数参数匹配模型详解
2019/06/09 Python
python的等深分箱实例
2019/11/22 Python
Python设计密码强度校验程序
2020/07/30 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
奶茶店创业计划书范文
2014/01/17 职场文书
保险专业大学生职业规划书
2014/03/03 职场文书
2014年小学教师工作自我评价
2014/09/22 职场文书
小学学习委员竞选稿
2015/11/20 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
python模板入门教程之flask Jinja
2022/04/11 Python