背景
小马英语,《每天10分钟英语听力-基础篇》,由于音频文件是通过扫码获取播放音频文件的链接页面,这样极为不方便,所以想直接把所有音频文件下载好放在QQ音乐里面,然后像播放歌曲一样来听听力训练。然而,音频链接页面并不提供下载的链接,新东方的音频文件是这样的,有下载按钮:
小马外语是下面这样的,没有下载按钮:
网页既然有音频文件播放,那么应该有文件的链接,果断查看网页源代码,果然有音频文件的链接路径,网页路径是:view-source:http://www.cip.com.cn/erweima/xiaoma/29961/29961.html,音频文件源代码如下:
那么可以知道MP3音频文件路径为:http://www.cip.com.cn/erweima/xiaoma/29961/mp3/16/16-01-01.mp3,点击后出现页面,出现了可下载按钮。
下载
这本书一共36章,每章5个音频文件,最简单的方法是把mp3文件路径复制到电脑下载软件里,新建下载页面一个个的下载,这样最简单但是文件太多下载效率低,突然想到今天是1024程序员节,何不写个代码自动实现下载呢?
代码实现思想:一个大循环,循环体里面实现对章节字符串的递增,然后通过启动另外一个进程去下载文件,可以用Linux里面的wget命令。
代码
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int i=-1;
int max=1;
char *path[1024]={"wget",NULL};
path[1]=(char *)malloc(1024);
if(NULL == path[1])
{
printf("NULL == path[1],return!\n");
return -1024;
}
memset(path[1], 0, 1024);
while(max <= 36)
{
for(i=1;i<=5;i++)
{
sprintf(path[1],"http://www.cip.com.cn/erweima/xiaoma/29961/mp3/%02d/%02d-%02d-01.mp3", max, max,i);
if(0 > execv("/usr/bin/wget", path))
{
perror("execv");
return -1024;
}
}
max++;
}
return 1024;
}
只下载了一个文件,因为execv执行成功后不返回,所以改用system,执行完后才返回。
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
int i=-1;
int max=1;
char path[1024]={0,};
memset(path, 0, 1024);
while(max <= 36)
{
for(i=1;i<=5;i++)
{
sprintf(path,"wget http://www.cip.com.cn/erweima/xiaoma/29961/mp3/%02d/%02d-%02d-01.mp3", max, max, i);
if(system(path) < 0)
{
perror("system");
}
}
max++;
}
return 1024;
}
上面代码执行成功,开始慢慢的自动下载MP3文件了。