shell爬虫批量下载mp3

最近喜欢听王玥波的《雍正剑侠图》,搜到某网站上有全套,可惜,只能一回一回地手动下载,现在出到了第六部,每一部都有上百回,手动点鼠标下载得下到猴年马月去了。古人说:“Where there is a shell, there is a way”,用shell脚本来做这件事吧。

Where there is a shell, there is a way.

shell脚本由linux命令组合而成,由于linux现有的大量命令工具都经过了长期的优化和标准化,其执行效率和移植性都很高。

shell爬虫的核心是curlcurl可以下载网页,解析http response头信息,也可以指定http request头信息,且可处理cookie,具备web浏览器的基本功能,支持HTTPS、FTP、FTPS、TELNET、LDAP等协议。

强大的curl

首先,是解析每一回音频的url,每一回对应一个链接页面,地址的编排很简单,如第一回就是:

http://xxx.com/play/5359/1.html

想当然地使用chrome查看音频的加载过程,结果发现音频文件的url直接写在了源码里:

<a href="http://xxx.com/%E7%8E%8B%E7%8E%A5%E6%B3%A2/%E9%9B%8D%E6%AD%A3%E5%89%91%E4%BE%A0%E5%9B%BE%E7%AC%AC%E4%BA%94%E9%83%A8%2832kbps%29%28121%E5%9B%9E%29/03BEE21D25.mp3" id='down'><img src="//xxx.com/e/data/images/download.jpg" alt="下载雍正剑侠图第五部 001回"></a>

而且该网页中只有这一行出现了.mp3,不过文件名是随机生成的。

每一回的url有了,这就好办了,先把核心功能完成:

#!/usr/bin/env bash

page_url='http://xxx.com/down/5359/'

for ((i=1; i<=121; i++))
do
    page_i="${page_url}$i.html"
    mp3_i_url=$(curl ${page_i} | iconv -c -f gb2312 -t utf-8 | grep '\.mp3' | awk -F\" '{print $2}')
    curl -o "$i.mp3" ${mp3_i_url}
done

exit 0

下面来逐行分析一下for循环究竟做了什么。

$page_i是第i回的下载页面,不过并不是下载链接,下载链接$mp3_i_url需要解析出来。

curl ${page_i}

获取该页面的html代码,该页面编码是GB2312,标准输出的汉字是乱码,如不进行处理可能会导致脚本执行中报错退出,因此使用iconv进行转码:

iconv -c -f gb2312 -t utf-8

将网页编码从gb2312转为utf-8,选项-c表示忽略转码过程中的报错,以避免脚本意外中止。

grep '\.mp3'

使用grep查找含有'.mp3'的行,这里使用了转义符'\'。

awk -F\" '{print $2}'

这是截取mp3文件的下载链接,awk是一个强大的工具,可以将一行文本分解为多列进行处理,这里指定"为分割符,将这行原代码:

<a href="http://xxx.com/%E7%8E%8B%E7%8E%A5%E6%B3%A2/%E9%9B%8D%E6%AD%A3%E5%89%91%E4%BE%A0%E5%9B%BE%E7%AC%AC%E4%BA%94%E9%83%A8%2832kbps%29%28121%E5%9B%9E%29/03BEE21D25.mp3" id='down'><img src="//xxx.com/e/data/images/download.jpg" alt="下载雍正剑侠图第五部 001回"></a>

分解为7列:

<a href=

http://xxx.com/%E7%8E%8B%E7%8E%A5%E6%B3%A2/%E9%9B%8D%E6%AD%A3%E5%89%91%E4%BE%A0%E5%9B%BE%E7%AC%AC%E4%BA%94%E9%83%A8%2832kbps%29%28121%E5%9B%9E%29/03BEE21D25.mp3

 id='down'><img src=

//xxx.com/e/data/images/download.jpg

 alt=

下载雍正剑侠图第五部 001回

></a>

我们需要的链接是第二列,使用{print $2}将该列赋值给$mp3_i_url

curl -o "$i.mp3" ${mp3_i_url}

再次使用curl,下载mp3文件,并重命名为$i.mp3,完成第i回的下载任务。

以上代码已经达到了我们的目的,不过考虑到网站可能采取的反爬措施,再加几行:

#!/usr/bin/env bash

page_url='http://xxx.com/down/5359/'

user_agent='Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36'

for ((i=1; i<=121; i++))
do
    page_i="${page_url}$i.html"
    mp3_i_url=$(curl -A ${user_agent} ${page_i} | iconv -c -f gb2312 -t utf-8 | grep '\.mp3' | awk -F\" '{print $2}')
    curl -A ${user_agent} -o "$i.mp3" ${mp3_i_url}
    sleep 30
done

exit 0

主要做了两种反反爬措施,一是下完一回后延时30s,这个比较好理解。

二是使用curl-A选项,在request中指定User-Agent字段,用于模拟客户端设备和浏览器:

curl -A ${user_agent} ${page_i}

不过后来发现,该网站的反爬措施好像并不完善。

到此为止,脚本已经完成,丢到Raspberry pi上去跑了一晚,第二天早上,成功收获了热热乎乎的《雍正剑侠图》。

运行效果

对于简单的爬虫功能,和python相比,shell的代码量显然更少,写起来也更快,毕竟这东西基本上只是一次性的,杀鸡还是不要动牛刀了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容