1. 程式人生 > >1024程式設計師節-程式碼實現自動下載英語聽力音訊檔案

1024程式設計師節-程式碼實現自動下載英語聽力音訊檔案

背景

    小馬英語,《每天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檔案了。