《老友记》是美剧中的经典,其中的对白也早已成为英语爱好者的宝典,我当然也是粉丝之一啊。前几天在普特英语网 上发现有所有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 + 1urls = []index = start_indexpage_count.times do url = url_prefix + String(index)urls << urlindex += 1endurls
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.nowputs "Start download #{resource[:title].chomp}.mp3"
data = http.get(url.path).bodysize = data.sizeif(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 dataendend_time = Time.nowputs "Take #{end_time - start_time} seconds"elseputs "Download fail""download_fail"endendend
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)
#  }
#enddef rbuf_fillbegin@rbuf << @io.read_nonblock(4096)rescue Errno::EWOULDBLOCKif IO.select([@io], nil, nil, @read_timeout)@rbuf << @io.read_nonblock(4096)elseraise Timeout::TimeoutErrorendend
end

主要的步骤和方法都罗列出来啦,完整的ruby文件请下载附件,如果你懒得修改ruby源码的话,可以用附件中的

protocol.rb替换 \ruby\lib\ruby\1.8\net\ 下的protocol.rb. 完整的ruby脚本里还有下载记录的保存,避免了第二次运行脚本时再去连接已下载的mp3对白文件,不过与主题联系不大,我就不多说了。

下一篇是把当年明月的博客 ——《明朝那些事》的博文转为PDF导出,文章嘛还是下到PSP看来得爽嘛!

我们的目标就是——实用的代码!

编写ruby脚本批量下载《老友记》全集(mp3文件)相关推荐

  1. 2021-07-07 - 使用脚本批量下载网页视频[如哔哩哔哩] - 学习/实践

    1.应用场景 主要用于使用脚本批量下载web视频,音频,图片资源,进行资源的收集下载,或者避免资源的丢失,使用命令脚本则有利于节省时间,提高效率. 比如资源可能后续不存在,或者,想二次整理资源,更好地 ...

  2. 【模板】批量下载视频到指定文件脚本

    批量下载视频到指定文件脚本 以下代码是在学习工作中总结出来的方法所构成的模板,仅适合在某些特定情况下使用,如下模板需要拥有视频的URL地址,相关三方库,稳定的网络等 需要库: you-get os f ...

  3. element-ui实现下载动态进度条,可实现批量下载,附Blob文件类型对照表

    element-ui实现下载动态进度条,可实现批量下载,附Blob文件类型对照表 ①页面结构使用element-ui的进度条组件,示例为圆形,具体样式根据需求确定 <el-button>下 ...

  4. 通俗易懂【Springboot】 单文件下载和批量下载(多个文件合成一个压缩包下载)

    文章目录 一.单文件下载 1.简单理解文件下载 2.单文件下载的具体代码实现 3.测试 4.单文件下载整体代码 二.多文件批量下载(多个文件合成一个压缩包下载) 1.多文件下载的实现方式,这里使用了Z ...

  5. 【数据下载】使用DownThemAll批量下载网站上的文件

    1 下载DownThemAll扩展程序 网址:DownThemAll! 2 批量下载网站上的文件 2.1 全球人工不透水面积GAIA数据 以全球人工不透水面积GAIA数据为例,网页界面如下: 右键后, ...

  6. 用go语言编写办公脚本——根据txt内容搜索对应文件

    用go语言编写办公脚本--根据txt内容搜索对应文件 最近工作中,需要处理大量的漏扫报告,需要根据不同的标准来将混在一起的报告分开,公司有个大佬直接写了.bat的批处理脚本,感叹一句,真强啊!!但是这 ...

  7. 利用Python编写脚本批量下载公众号中的音频

    欢迎大家光临我的博客,大家一起交流学习哦 陈京九的博客 首先声明我只是一个小菜鸡,把自己琢磨一些功能的过程发到了这里当做记录,希望大神们轻喷,能给我一些指导就更好啦~ 上一篇博客教大家下载了公众号中的 ...

  8. 用 shell 脚本批量下载畅想听吧(CXT8)和 有声下吧(YSX8)的有声小说

    眼睛不好又迷上了小说怎么办?  那就只能用耳朵听啦...上下班3个小时在路上,玩手机么伤眼睛,只能听听有声小说了. 最近一直在找一些有声小说听,发现想要下载下来同步到 itunes 里面还是有点麻烦的 ...

  9. python脚本--批量下载GNSS数据

    文章目录 1. 前言 2. 思路 3. Talk is cheap 4. 总结 1. 前言 应某一瓜皮要求,为其写一个用于批量下载GNSS数据的脚本.恰好前几天研究过如何在教务系统中自动签到,便有了这 ...

最新文章

  1. sock 文件方式控制宿主机_nginx与php-fpm通信的两种方式
  2. mt7601u linux驱动下载,Ubuntu16.04安装DPO_MT7601U_LinuxSTA_3.0.0.4_20130913.tar.bz2
  3. python输入10个学生的成绩储存在列表中_获得10名学生的平均成绩python
  4. Disruptor并发框架-1
  5. linux date修改系统时间
  6. caffeine java1.7_Caffeine高性能命中率近似最优的Java缓存库
  7. Idea部署web项目 与 eclipse 的不同之处
  8. python求5_Python 5 运算符
  9. JAVA项目经理面试题
  10. nodejs高速公路收费管理系统vue
  11. Python私有属性与私有方法
  12. 爬虫玩得好,牢饭吃到饱?这3条底线千万不能碰!
  13. 5个好用的Excel技巧,一秒钟完成一个功能
  14. 农牧行业销售经理生存手册(一)
  15. Flutter Card使用
  16. 微生信在线绘制KEGG Pathway通路分类汇总图
  17. 信息学奥赛一本通:2026:【例4.12】阶乘和
  18. 计算机信息管理专业自考教材,计算机信息管理自考本科课程
  19. 谈谈目前工作的收获和不足
  20. Android 音乐播放器的开发教程(三) 小卷毛播放器的主界面开发 ---- 小达

热门文章

  1. 自己写的第一个android 游戏《是男人就下100层》
  2. 机器学习数据不均衡处理教程
  3. 利用虚拟机复现漏洞 “永恒之蓝”
  4. ARP渗透与攻防(七)之Ettercap Dns劫持
  5. 2022秋季学期总结
  6. #PCIE# PCIe的接口形态之OAM 卡
  7. 12-100V降压12V5V3.3V/3A恒压电动车车载设备电源IC
  8. python条件语句及循环语句
  9. ug10.0计算机名错误,【答疑】ug10.0安装出现-97错误,怎么办啊?很是苦恼 - 视频教程线上学...
  10. 米图出行显示服务器忙,米图出行app