英語和Python一起學,用Python幫我們自動下載VOA每日broadcast

Python MP3 程序員 網絡爬蟲 英語 程序員剛剛 2019-06-17

問題背景

先介紹一個練習英語聽力的好網站https://learningenglish.voanews.com/,有針對不同聽力需求的部分,也有每天30分鐘的broadcast,可以幫助我們沉侵式練習聽力。是美語播音員,切速度比較慢,適合學習者練習。也有一部分視頻教程,個人覺得不錯,推薦給大家。(有個不好地方就是該網站需要通過代理訪問)

在用的過程中有一個問題,就是我每次都是在線聽。如果想在手機上聽就比較麻煩,所以想能不能下載下來,但是又覺得一個一個去點擊下載太麻煩了。於時就決定寫個python程序幫我下載,誰叫咱是程序員呢。花了一下午,寫出來,現在分享給大家。

我們的工具要實現哪些功能?

  1. 下載mp3文件從上面提到的網站;
  2. 下載所有設定日期內的broadcast mp3文件;
  3. 支持在命令行傳入起始和截至日期,比如20190101 20190530;
  4. 如果命令行傳入一個日期則該日期作為起始日期,當天時間作為截至日期;
  5. 如果命令行沒傳入日期,則下載上一次到當天之間的mp3,若沒有上一次的時間則只下載當天的mp3文件;

怎麼實現呢?

  1. 解析參數,確定下載的日期,並存入list;
  2. 將下載日期和下載鏈接進行拼接,構成下載鏈接;
  3. 如果鏈接合法,則下載,否則以日期名為名創建txt文件並將下載鏈接存入其內;
  4. 保存當天日期;

先看看完成後的運行效果

測試中我只想下載本月的,所以輸入參數如下

 python .\auto-download-voa-broadcast.py 20190601
英語和Python一起學,用Python幫我們自動下載VOA每日broadcast

最終執行效果圖

現在看一些關鍵的難點,需要完整源碼的可以私信

先需要解析下載地址,先手動找到一個下載地址http://av.voanews.com/clips/VLE/2019/06/15/20190615-003000-VLE122-program_hq.mp3?download=1,就是這樣子的,可以看出其中包含了2019/06/15/20190615這樣的字符串,我可以推測任意一天的下載地址就是其他固定字符串加日期即可。隨機找一天驗證,發現確實如此,那就簡單了。不需要去爬蟲了。

  • 下載過程,由於每個文件約30MB,所以下載需要持續幾秒(當然跟網絡也有關係)
def download_file(file_url, file_name):
"""
downdload file
"""
#這裡的stream=True很重要,支持流下載, proxies=需要改為自己的代理
with requests.get(file_url, stream=True, proxies=None) as response, open(file_name, 'wb') as local_file:
shutil.copyfileobj(response.raw, local_file)
  • 代理的設置,將下面的url和port設置為自己的,然後將其賦值給上面的proxies即可
http_proxies = {'http':'http://url:port'}
  • 我們會用到下面的庫
import shutil, datetime, shelve, time, sys, os
import requests
  • 再一個就是入參日期有效性的判斷
def is_valid_data(date_str):
"""Check if date string is valid"""
try:
time.strptime(date_str, "%Y%m%d")
return True
except:
return False

小結

總體來說,思路比較簡單,就是將要下載的日期構造成下載鏈接,然後逐個下載。Python是個很好的語言,能夠極大幫助我們節省開發時間。學以致用才是王道。這也是編程的樂趣所在吧。

關於源碼

如果有感興趣的可以私信,我可發送完整源碼。加個關注,說不定哪天能夠分享出對您有用的東東。

相關推薦

推薦中...