论坛首页 编程语言技术论坛

用Ruby脚本抓取百度MP3新歌Top 100发布到闲聊

浏览 4360 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-22   最后修改:2009-02-22
昨天和ouspec闲聊谈到可以用JavaEye的闲聊api做些什么:
http://quake.iteye.com/blog/chat/1766
引用
用JavaEye的闲聊API可以做什么?举例子:你可以注册一个账号,写个小程序从某个"专讲冷笑话"的网站定时抓取,然后用闲聊方式发布,大家只要订阅这个账号就可以享受到每天N个冷笑话的洗礼。


今天试了一下,不过改成了抓取百度MP3新歌Top 100,将最新上榜的歌曲名称,百度搜索链接,另外加3个可以直接下载的url,看看效果:
http://baidump3.iteye.com/blog/chat

完整代码在文章最下面,主要用hpricot和open-uri来抓取,其中破解百度MP3的加密用到了这篇文章中提到的:http://suninny.iteye.com/blog/234635,另外用到了tinyurl提供的api来减少url的长度。

你可以将baidump3这个用户加入到你的订阅,就可以获得最新上榜的mp3信息,大家可以讨论看还可以用JavaEye的闲聊API做写什么?


require 'rubygems'
require 'hpricot'
require 'open-uri'
require 'iconv'

def _mktab(x)
  t0 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
  p = t0.partition(x)
  p[1] + p[2] + p[0]
end

def decode(s)
  s.tr(_mktab(s[0].chr), s=~ /....:\// ? _mktab('h') : _mktab('f')) #http|ftp
end

def tiny_url(url, encode = false)
  result = open(encode ? URI.encode("http://tinyurl.com/api-create.php?url=#{url}") : "http://tinyurl.com/api-create.php?url=#{url}").read
  result =~ /^Error/ ? url : result
end

def actual_download_url(search_url, limit = 2)
  doc = Hpricot(open(search_url))
  doc.search("table#Tbs td.d a").map{|a| a.attributes["href"]}[0..limit].map {|url|
    decode(open(URI.encode(url)).read[/var I="([^"]*)"/, 1])
  }
end

def get_maidu_mp3_top100
  url = "http://list.mp3.baidu.com/list/newhits.html"
  doc = Hpricot(Iconv.conv("UTF8", "GBK", open(url).read))
  result = {}
  doc.search("table.list td:not(.th)").each{|t|
    name = t.inner_text.gsub(/\s+/, " ")
    search_url = t.search("a")[0].attributes["href"]
    result[name] = search_url
  }
  return result
end

def get_new_data
  local_data = File.open('data.yaml') { |file| YAML::load(file) } rescue {}
  remote_data = get_maidu_mp3_top100
  new_data = {}
  remote_data.each_pair { |key, value|
    unless local_data.has_key?(key)
      local_data[key] = value
      new_data[key] = value
    end
  }
  File.open('data.yaml', 'w') { |file| YAML.dump(local_data, file) }
  return new_data
end

def update_javaeye_chat(username, password)
  get_new_data.each_pair { |key, value|
    message = "#{key} 搜索 #{tiny_url value}"
    actual_download_url(value).each_with_index{|url, index|
      message << " 下载#{index+1} #{tiny_url(url, true)}"
    }
    open(URI.encode("http://www.iteye.com/api/twitters/create?body=#{message}"), :http_basic_authentication=>[username, password]).read
  }
end

update_javaeye_chat("javaeye用户名", "javaeye密码")
   发表时间:2009-03-06  
以前也曾经尝试用python做过类时的东西,不过是去豆瓣自动获取一张专辑所有的歌曲列表,然后利用一个百度未公开的API,根据歌曲和歌手来查询到可以下载的链接,然后再去ping这些链接,看看是否有效,最后再自动去下载

不过后来发现百度搜索的结果并不是很精确,或者要搜索专辑的歌太新



0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics