Github博文地址,此處更新可能不是很及時。
1.背景
最近發現算法以及數據結構落下了不少(其實還是大學沒怎么好好學,囧rz),考慮到最近的項目結構越來越復雜了,用它來練練思路,就打算復習下數據結構與算法。結合最近在學英語,然后干脆就用英文嘍。然后選定一本參考書籍《Data Structures and Algorithms in Java》。
剛開始看還是蠻吃力的,慢慢來。由於之前有翻錄書籍附錄的習慣,於是就去書籍附帶的官網看了下,發現http://ww0.java4.datastructures.net/handouts/ 里面附帶的PDF文檔居然不錯,圖文並茂,作為理解是個不錯的材料,果斷要下載啊。但是,尼瑪,結果發現,好多個,這一個一個另存為真是要命,想想還是用什么辦法下載下來吧。
2.實現
考慮目前學過的了解的所有語言,可以用來實現的,排列一下程度:
- Java/Android 熟悉
- C# 熟悉
- Python 了解語法
- Javascript 了解一些
- C/C++ 了解語法
為了實現這個,當然是最簡單最快最好了。考慮到大學一直用C#,要不用它?但發現OSX平台只能用Mono了,還得重新熟悉。Java實現也不快,從需要的時間考慮。Javascript不熟,貌似可以用node.js去寫(atom就是用的它)。不熟。C/C++好多年沒用過了,而且,實現起來代碼一大堆,特別麻煩。再考慮之前一段時間正好在Codecademy學過語法,就拿它來練手吧。
OK,確定了用Python。后續就是怎么去請求網絡了,解析網頁html標簽,提取下載鏈接,下載文件了。雖然不懂這些在Python里面是怎么實現的,但是流程是確定的,按照流程去網站找現成的,此處不研究原理,實現功能即可。
接下來就是各種搜索引擎搜索東西了,Google可,百度亦可(不同引擎側重不一樣)。不要忘了目的是什么,搜索相關的資料。
好了,搜索之后,確定請求網絡下載網頁用requests,解析html用BeautifulSoup,提取下載鏈接BeautifulSoup,下載文檔(stackoverflow中找到了一段下載文件的代碼)。
然后就是把她們一起組合了。組合之后的代碼如下:

1 #file-name: pdf_download.py 2 __author__ = 'rxread' 3 import requests 4 from bs4 import BeautifulSoup 5 6 7 def download_file(url, index): 8 local_filename = index+"-"+url.split('/')[-1] 9 # NOTE the stream=True parameter 10 r = requests.get(url, stream=True) 11 with open(local_filename, 'wb') as f: 12 for chunk in r.iter_content(chunk_size=1024): 13 if chunk: # filter out keep-alive new chunks 14 f.write(chunk) 15 f.flush() 16 return local_filename 17 18 #http://ww0.java4.datastructures.net/handouts/ 19 root_link="http://ww0.java4.datastructures.net/handouts/" 20 r=requests.get(root_link) 21 if r.status_code==200: 22 soup=BeautifulSoup(r.text) 23 # print soup.prettify() 24 index=1 25 for link in soup.find_all('a'): 26 new_link=root_link+link.get('href') 27 if new_link.endswith(".pdf"): 28 file_path=download_file(new_link,str(index)) 29 print "downloading:"+new_link+" -> "+file_path 30 index+=1 31 print "all download finished" 32 else: 33 print "errors occur."
運行以下代碼便可以把所有的pdf文檔下載到本地。

1 python pdf_download.py
3.優化
30多行代碼,全部搞定,真是簡潔明了,果然做Python用來一些腳本任務還是不錯的。利用它下載了41個文檔。
最開始下載下來的文檔沒有序號,這樣看的時候就不知道先后,於是我給文件名前面加了個序號。
其他的優化部分可以參考如下:
- 考慮現在函數的一些異常出錯沒有處理,后續需要處理。
- 函數沒有完全封裝,下載的文件類型支持不多,這個后續可以根據自己的需求進行擴展。
- 下載的文件少的時候可能這樣就行了,但是文件多的話,是有必要使用多個線程(適量的數量)或者線程池去下載,從而加快下載速度。
- 有些寫法可能不符合python語法規范,當然寫了與沒寫已經是0和1的區別了。
- 其他細節,比如pdf有可能是大寫的PDF。
4.附錄
- 《Data Structures and Algorithms in Java》(Michael T. Goodrich, Roberto Tamassia)下載 http://bookzz.org/ 或者http://it-ebooks.info/
以下兩個網站都是不錯的書籍下載網站,有條件還是買本正版書籍支持一下作者吧。
一般我會先下載電子書看下,合適就買紙質版。 - Python語法入門 http://www.codecademy.com/zh/tracks/python
以上,便是如此了。
本文來自RxRead’s Blog,歡迎轉載,轉載請注明。
歡迎一起交流探討。