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中的条件判断语句基础学习教程
Feb 07 Python
基于python的ini配置文件操作工具类
Apr 24 Python
用uWSGI和Nginx部署Flask项目的方法示例
May 05 Python
基于python实现百度翻译功能
May 09 Python
使用Python OpenCV为CNN增加图像样本的实现
Jun 10 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
django框架ModelForm组件用法详解
Dec 11 Python
pygame实现飞机大战
Mar 11 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
python实现ping命令小程序
Dec 28 Python
Python实现粒子群算法的示例
Feb 14 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 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/02/08 PHP
PHP学习之正则表达式
2011/04/17 PHP
ThinkPHP使用心得分享-ThinkPHP + Ajax 实现2级联动下拉菜单
2014/05/15 PHP
php 截取utf-8格式的字符串实例代码
2016/10/30 PHP
Laravel框架实现利用监听器进行sql语句记录功能
2018/06/06 PHP
PHP正则匹配到2个字符串之间的内容方法
2018/12/24 PHP
基于jquery的用鼠标画出可移动的div
2012/09/06 Javascript
javascript ajax的5种状态介绍
2014/08/18 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
jQuery实现右键菜单、遮罩等效果代码
2016/09/27 Javascript
vue构建动态表单的方法示例
2018/09/22 Javascript
socket io与vue-cli的结合使用的示例代码
2018/11/01 Javascript
Vue.js中 v-model 指令的修饰符详解
2018/12/03 Javascript
Vant picker 多级联动操作
2020/11/02 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
Python 由字符串函数名得到对应的函数(实例讲解)
2017/08/10 Python
Python实现识别手写数字 简易图片存储管理系统
2018/01/29 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
Python中zip()函数的解释和可视化(实例详解)
2020/02/16 Python
django xadmin 管理器常用显示设置方式
2020/03/11 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
2020/06/18 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
汽车销售求职自荐信
2013/10/01 职场文书
学校门卫工作职责
2013/12/07 职场文书
初一家长会邀请函
2014/01/31 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
日语系毕业求职信
2014/07/27 职场文书
树转促学习心得体会
2014/09/10 职场文书
教师自我剖析材料(群众路线)
2014/09/29 职场文书
初三语文教学计划
2015/01/22 职场文书
导游词怎么写
2015/02/04 职场文书
小学见习报告
2015/06/23 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
Python使用random模块实现掷骰子游戏的示例代码
2021/04/29 Python
windows下快速安装nginx并配置开机自启动的方法
2021/05/11 Servers