知我者谓我心忧,不知我者谓我何求。 顺天命者,悲;逆,亡?

ruby开发的批量下载音乐的脚本

上一篇 / 下一篇  2007-06-13 05:40:43 / 个人分类:备忘

查看( 4439 ) / 评论( 11 )
换了新电脑,所以对音乐文件进行重新整理,找到一个下载速度很不错的站点  http://www.31tg.com
所以刚刚尝试用ruby写了个批量下载专辑音乐的脚本。分享下。
这样一个命令就可以得到一个专辑中的全部歌曲了。呵呵。

CODE:

#!/usr/bin/ruby

require 'net/http'
require 'fileutils'
require 'iconv'

#FileUtils.mkdir Iconv.iconv("UTF8", "GB2312", @specialname)
#
#

class GetValue   #用于获取两个指定字符串之间的内容
  def GetValue.getsmallvalue(all, tag_first, tag_end)
    fpos = all.index(tag_first)
    block = all[fpos, all.length - fpos]
    epos = block.index(tag_end)
    value = block[tag_first.length, epos - tag_first.length]
  end
end

class MusicPageList
  attr_reader :imgsrc, :downmusicurl, :specialname
  def initialize
    @imgsrc
    @specialname
    @targeturl = "www.31tg.com"
    @imgtag_first = "<td bgcolor=\"#FFFFFF\"><img src=\'"
    @imgtag_end = "\' width"
    @spectag_first = "<font color=\"#FF6600\"><strong>"
    @spectag_end = "</strong>"
    @listtag_first = "<input type=\"checkbox\" name=\"checked\" value=\""
    @listtag_end = "\">"
    @eachmusictag_first = "2.<a href="
    @eachmusictag_end = " target"
    @musiclist = Array.new
    @downmusicurl = Array.new
    @httpclient = Net::HTTP::new(@targeturl)
  end
  def start
    @resp, @data = @httpclient.get("/MusicCD/31TG_8593.htm")   #需要下载的CD页面地址,根据自己需要进行修改.
  end
  def sepvalue
    @imgsrc = GetValue.getsmallvalue(@data, @imgtag_first, @imgtag_end)
    @specialname = Iconv.iconv("UTF-8", "GB2312", GetValue.getsmallvalue(@data, @spectag_first, @spectag_end))   #创建目录用的,暂未处理.
  end
  def getmusicaddr  #获取该页面各个歌曲的页面地址
    tdata = @data
    while(1)
      s_pos = tdata.index(@listtag_first)
      if (s_pos != nil)
        tdata = tdata[s_pos, tdata.length - s_pos]
        e_pos = tdata.index(@listtag_end)
        @musiclist.push(GetValue.getsmallvalue(tdata, @listtag_first, @listtag_end))
        tdata = tdata[e_pos, tdata.length - e_pos]
      else
        break
      end
    end
  end
  def getrealaddr  #获取各歌曲页面里的真实下载地址
    @musiclist.each do |value|
      purl = "/Down.asp?id=" + value
      resp, data = @httpclient.get(purl)
      @downmusicurl.push(GetValue.getsmallvalue(data, @eachmusictag_first, @eachmusictag_end))
    end
  end
  def startdown  #开始真正下载内容
    @downmusicurl.each do |url|
      targ = "wget " + url
      system(targ)
    end
    picarg = "wget " + @imgsrc
    system(picarg)
  end
end

sal = MusicPageList.new   #创建对象
sal.start           
sal.sepvalue
sal.getmusicaddr
sal.getrealaddr
sal.startdown
运行前先找到目标页面地址,然后替换程序中的  "/MusicCD/31TG_8593.htm"  这部分内容。
程序还不适很完善,对我而言仅仅是个工具,有兴趣的朋友可以继续完善他。

TAG:

JOSON CHEN josonchen 发布于2007-06-13 07:35:11
晕!!那网站速度有600K/S ,简直快呆了~~好用的脚本,谢谢了!
Fluke@LUPA fluke 发布于2007-06-13 10:41:43
不错阿!脚本语言真是大家的好帮手。我好像也有好些脚本,不知道是否有用,到时整理一下
JOSON CHEN josonchen 发布于2007-06-13 10:48:02

QUOTE:

原帖由 fluke 于 2007-6-13 10:41 PM 发表
不错阿!脚本语言真是大家的好帮手。我好像也有好些脚本,不知道是否有用,到时整理一下
好。。期待兄弟的好脚本
bigapple bigapple 发布于2007-06-13 21:09:50
用了wget,那么win用户可能就不行了。可以考虑直接用ruby来写
file.write(resp.body),不知道可以否
Sanool和开源的故事--邵炜主题博客 sanool 发布于2007-06-13 21:22:00
刚发现网页内容分析的部分可以用 hpricot 库
非常方便
bigapple bigapple 发布于2007-06-13 21:58:47

QUOTE:

原帖由 sanool 于 2007-6-14 09:22 发表
刚发现网页内容分析的部分可以用 hpricot 库
非常方便
是有这个库的,哈哈
Sanool和开源的故事--邵炜主题博客 sanool 发布于2007-06-13 23:32:53
刚又看了下 programming ruby
发现我上面的代码写的太垃圾了
没有体现出ruby的特色,还是在用C的思想...

可以好好整改下.
wxj120bw发布于2007-06-16 02:04:00
C:\>ruby convertCtoF.rb
convertCtoF.rb:14:in `-': nil can't be coerced into Fixnum (TypeError)
        from convertCtoF.rb:14:in `getsmallvalue'
        from convertCtoF.rb:42:in `sepvalue'
        from convertCtoF.rb:78
C:\>

刚学的,就照着你的代码用了,可惜出了点错,不知为啥,wxj120bw@yahoo.com.cn 在这里谢谢
cnfang cnfang 发布于2007-09-19 20:05:06
不知道怎么用啊?
ryebread ryebread 发布于2008-03-06 23:25:12
好好
学习,谢谢
forbet4845发布于2008-08-16 17:03:15
有玩球的吗?福宝现金网http://home.forbet3.com
最安全稳定的博彩平台:福宝




平台地址:
http://home.forbet3.com




备用:

http://home.forbet2.com
http://home.f1166.com


福宝国际是英属维京群岛政府认证的合法互联网路交易公司。

福宝现金投注网玩法多 水位192  网速快 诚信可靠。(各大论坛挂广告一年多无一例投诉)

福宝自04年面向大陆营业以来,一直秉承广告宣传“交收可靠”之口号,深得广大玩家支持与关注。



足球玩法(单式 上半场 滚球 波胆 上半波胆 1X2入球数,半全场 混合过关)

蓝球玩法(单式 上半场 下半场 混合过关)

美式足球(单式 上半场 下半场)

冰上曲棍(单式 上半场 下半场)

司诺克 (单式 上半场 下半场)

F1 (单式 上半场 下半场)

羽毛球 (单式 上半场 下半场)

《上下半场走地多.各赛事都开.无危险球确认.多重密码保证资金安全.独特安全SSL登录系统保障客户交易安全》

网银在线买彩功能, 每次存款最低为100元,完场马上结算,随时提款。


福宝国际,诚招代理,周薪上万:http://www.forbet1.com

福宝足球论坛:http://bbs.forbet1.com
我来说两句

(可选)

日历

« 2008-08-22  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 176853
  • 日志数: 405
  • 图片数: 7
  • 文件数: 6
  • 书签数: 68
  • 建立时间: 2005-08-01
  • 更新时间: 2008-08-19

RSS订阅

Open Toolbar