《老友记》是美剧中的经典,其中的对白也早已成为英语爱好者的宝典,我当然也是粉丝之一啊。前几天在普特英语网
上发现有所有10季老友记的对白mp3文件下载
,大喜!!可惜每一集的连接都在不同的页面上,难道要我保存200多次?! 当然不行,200多次重复机械劳动太丢人啦!而且普通英语网上还有好多不错的英语资料呢,还是写个脚本批量下载的好。 好了,这就开始!
我的ruby
版本是1.8.6
,这个版本在下载较大文件时会出现问题
,后面会提到啦。为了吸引眼球,我还是先把结果的截图放到前面来咯
ps:一共是10季嘛
ps:这个是第四季的全部对白
步骤:
1.找到所有包含老友记对白的页面url,
如"http://www.putclub.com/article.php?articleid=8761
"
2.找到这个url中的《老友记》的mp3文件,以及对应的标题,
如上面这个url中的mp3文件是"http://listen.putclub.com/resource/lessons/liurenxing/liurx/12.mp3
",
标题是”
六人行1-12The One With the Dozen Lasagnas
“
3.根据标题确定该对白属于第几季,
如"六人行1-12
The One With the Dozen Lasagnas"是第1季12集
4.开始批量下载《老友记》对白文件,将每一季的对白下载到对应的文件夹下,
如第5季的对白下载到/friends/season-5/
下
code:
步骤1
,(这个很简单,因为普特英语网上的文章的url就是http://www.putclub.com
/article.php?articleid=XXXX
,老友记的XXXX就是从8749
到8976
,哈哈,天助我也!)
def get_urls_in_putclub(url_prefix,start_index, end_index)
page_count = end_index - start_index + 1
urls = []
index = start_index
page_count.times do
url = url_prefix + String(index)
urls << url
index += 1
end
urls
end
调用
all_urls = get_urls_in_putclub("http://www.putclub.com/article.php?articleid=",8749,8976)
就得到了所有urls;
步骤2
,这个步骤要得到HTML中的对白标题
和mp3文件
连接,用正则表达式来把她们scrape下来
标题的html格式是这样子滴:
.......
<div class="subhead">
<b>六人行1-12The One With the Dozen Lasagnas </b>
</div>
......
对应的匹配方法是这样子滴:
def scrape_resource_title(html)
%r{<div\s*class=[',"]?subhead"\s*><\s*b\s*>\D*(.*?)</b\s*>}mi =~ html
$1
end
返回的标题就是'1-12The One With the Dozen Lasagnas'
mp3文件连接的html格式是这样子滴:
......
<p align="center">
<a href="http://listen.putclub.com/resource/lessons/liurenxing/liurx/12.mp3">下载地址</a>
.....
对应的的匹配方法就是:
def scrape_resource_url(html)
%r{<p\s*align=[',"]?center[',"]?\s*>\s*<a\s*href=[',"](.*?)[',"]\s*>}mi =~ html
$1
end
返回的连接就是:'http://listen.putclub.com/resource/lessons/liurenxing/liurx/12.mp3'
当输入”1-12The One With the Dozen Lasagnas“时,得到”season-1“,还是用正则表达式
def extract_season_index(title)
/(\d+)-/ =~ title
"season-#{$1}"
end
步骤4
,建立mp3文件连接,将对白下载到对应的文件夹下,用之前得到的标题名来命名文件
比如文件'http://listen.putclub.com/resource/lessons/liurenxing/liurx/12.mp3
'就下载到".../friends/season-1/1-12The One With the Dozen Lasagnas.mp3
"
ps:在windows下,文件名不能包含"\/:*?"<>|"这些字符啊!
下面是下载方法的实现:
def download(resource,root)
url = URI.parse(resource[:url])
unless FileTest.exist?(
"D:\\friends\\#{extract_season_index(resource[:title].chomp)}\\#{resource[:title].chomp}.mp3")
Net::HTTP.start(url.host,url.port) do |http|
start_time = Time.now
puts "Start download #{resource[:title].chomp}.mp3"
data = http.get(url.path).body
size = data.size
if(size > 500)
puts String(size) + "k"
path = root + extract_season_index(resource[:title])
FileUtils.makedirs(path) unless FileTest.exist?(path)
File.open("D:\\friends\\#{extract_season_index(resource[:title].chomp)}\\#{resource[:title].chomp}.mp3",'wb') do |fin|
fin.write data
end
end_time = Time.now
puts "Take #{end_time - start_time} seconds"
else
puts "Download fail"
"download_fail"
end
end
end
end
ruby1.8.6的Net::HTTP中的get方法在连接较大的数据时,几乎都是连接超时
,
有人在rubyforge
上改写了ruby的rbuf_fill方法,原先的timeout参数太小,导致timeout的次数
太多,所以会超时。ruby1.8.7和以后的版本修改了这个bug
被改写的ruby方法在 \ruby\lib\ruby\1.8\net\protocol.rb 里
#def rbuf_fill
# timeout(@read_timeout) {
# @rbuf << @io.sysread(1024)
# }
#end
def rbuf_fill
begin
@rbuf << @io.read_nonblock(4096)
rescue Errno::EWOULDBLOCK
if IO.select([@io], nil, nil, @read_timeout)
@rbuf << @io.read_nonblock(4096)
else
raise Timeout::TimeoutError
end
end
end
主要的步骤和方法都罗列出来啦,完整的ruby文件请下载附件,如果你懒得修改ruby源码的话,可以用附件中的
protocol.rb替换 \ruby\lib\ruby\1.8\net\ 下的protocol.rb. 完整的ruby脚本里还有下载记录的保存,避免了第二次运行脚本时再去连接已下载的mp3对白文件,不过与主题联系不大,我就不多说了。
下一篇是把当年明月的博客
——《明朝那些事》的博文转为PDF导出,文章嘛还是下到PSP看来得爽嘛!
我们的目标就是——实用的代码!
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0007/3361/0d8fd741-af51-3b36-9c23-9ee1711c16a9-thumb.jpg)
- 大小: 42.9 KB
![点击查看原始大小图片](http://dl2.iteye.com/upload/attachment/0007/3368/b264ea8d-bad8-399f-8fa2-e87221187d17-thumb.jpg)
- 大小: 102 KB
分享到:
相关推荐
ruby脚本,用来分析case覆盖率,文件名,文件个数等等
1. **Ruby脚本交互**: Ruby提供了多种方式进行脚本交互,包括命令行参数、标准输入/输出、文件操作和网络通信等。通过命令行参数,我们可以传递参数给Ruby脚本并在脚本内部处理。标准输入/输出则允许脚本与用户或...
这通常需要下载ngx_ruby源码,将其与Nginx源码一起编译,并在Nginx配置文件中启用该模块。 2. **Ruby环境**:确保系统中已经安装了合适的Ruby版本。ngx_ruby模块可能需要特定版本的Ruby,因此在安装前需检查兼容性...
这是一个把ruby脚本代码转化为exe可执行文件转化后文件有点大。ruby2.0有望改进这方面的支持
Ruby脚本编辑器是一款专为Ruby编程语言设计的文本编辑工具,它提供了丰富的特性来帮助开发者高效地编写、调试和管理Ruby代码。在易语言源码的基础上,我们可以深入理解其功能实现,学习如何构建类似的开发工具。 ...
这是一个将ruby脚本转换成二进制可执行文件的工具,使用简单方便,功能强大,解压编译后生成rubyc可执行程序!转换ruby脚本时 使用rubyc 脚本.rb即可,可以自动检测依赖关系!使用非常方便!
Ruby是一种面向对象的脚本语言,由松本行弘(Yukihiro "Matz" Matsumoto)发明于1993年,并在1995年公开发布。作为一种脚本语言,Ruby主要运行在服务器端进行网页开发、系统编程、命令行工具开发等。Ruby的特点在于...
通过分析标题和描述,我们可以推测这是一个关于使用Ruby编写脚本来解决HBase数据恢复的教程或工具包。 首先,我们需要理解HBase的工作原理。HBase是基于行的分布式存储系统,它将数据存储在表中,这些表被分割成多...
ruby脚本交互,信息框_,加载内存DLL,释放内存DLL,取DLL导出函数地址,GetIntegerAddress,GetArrayDataAddress,脚本_直接执行,脚本_定义模块,脚本_初始化,脚本_定义类,脚本_定义类方法,脚本_载入文件,脚本_定义模块函数...
对于 Redis 3.0.0 版本,可以通过下载 gem 文件 `redis-3.0.0.gem` 来安装。在终端中运行 `gem install redis-3.0.0.gem` 进行安装。 2. 启动 Redis 服务:在每个节点上启动 Redis 服务,配置文件 `redis.conf` 中...
本文将详细介绍如何在Ruby脚本中进行文件操作,包括文件的打开、读取、写入、关闭以及文件属性的查询等。 Ruby的文件操作功能强大而灵活,通过本文的介绍,你应该已经掌握了如何在Ruby脚本中进行文件的读取、写入、...
Ruby教程 - 动态脚本语言的明珠 Ruby是一种高效且灵活的面向对象编程语言,由日本的松本行弘(Yukihiro Matsumoto)于1995年创建,旨在提供一种易于理解、简洁且强类型的编程体验。它的设计理念是结合Smalltalk的...
exerb:生成ruby的可执行文件 用法:先在ruby下运行install.rb 使用命令行cd到目录下,然后 使用: mkexy 文件路径 exerb 生成的.exy文件的路径 说明:mkexy把*.rb所需的类库文件都包含进来 特点:速度相对快点,生成...
测试用 建立组织机构Ruby脚本 脚本基于GEPS接口,采用Ruby脚本编写;
3. 易语言与外部程序交互:易语言可能通过系统调用来执行Ruby脚本,或者通过文件读写、管道通信等方式传递数据。 Ruby脚本交互部分可能涉及: 1. Ruby的脚本编写:了解如何在Ruby中编写能够被易语言调用的函数或...
游戏脚本语言(ruby初步) 游戏脚本语言是游戏开发中不可或缺的一部分,而 ruby 是一种广泛应用于游戏脚本编程的语言。了解游戏脚本编程的基础是游戏开发者的必备技能,而 ruby 的语法和基本用法是游戏脚本编程的...
Ruby脚本,用于将MP3文件转换为HLS流。 安装 将此行添加到您的应用程序的Gemfile中: gem 'mp3-to-hls' 然后执行: $ bundle 或将其自己安装为: $ gem install mp3-to-hls 用法 待办事项:在此处写下使用...
使用Ruby脚本动态修改Xcode项目中的xcodeproj文件。
《易语言源码与Ruby脚本编辑器的深度解析》 在编程领域,源码是理解软件工作原理的钥匙,而易语言作为一款中国本土化的编程语言,以其独特的语法和简洁的界面,深受初级和中级程序员的喜爱。同样,Ruby语言以其优雅...