1024程式設計師節-程式碼實現自動下載英語聽力音訊檔案
阿新 • • 發佈:2018-11-03
背景
小馬英語,《每天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檔案了。