Python抓取單個網頁中所有的PDF文檔


Github博文地址,此處更新可能不是很及時。

1.背景

最近發現算法以及數據結構落下了不少(其實還是大學沒怎么好好學,囧rz),考慮到最近的項目結構越來越復雜了,用它來練練思路,就打算復習下數據結構與算法。結合最近在學英語,然后干脆就用英文嘍。然后選定一本參考書籍《Data Structures and Algorithms in Java》。
剛開始看還是蠻吃力的,慢慢來。由於之前有翻錄書籍附錄的習慣,於是就去書籍附帶的官網看了下,發現http://ww0.java4.datastructures.net/handouts/ 里面附帶的PDF文檔居然不錯,圖文並茂,作為理解是個不錯的材料,果斷要下載啊。但是,尼瑪,結果發現,好多個,這一個一個另存為真是要命,想想還是用什么辦法下載下來吧。

2.實現

考慮目前學過的了解的所有語言,可以用來實現的,排列一下程度:

  1. Java/Android 熟悉
  2. C# 熟悉
  3. Python 了解語法
  4. Javascript 了解一些
  5. 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."
View Code

運行以下代碼便可以把所有的pdf文檔下載到本地。

1 python pdf_download.py
View Code

 

 

3.優化

30多行代碼,全部搞定,真是簡潔明了,果然做Python用來一些腳本任務還是不錯的。利用它下載了41個文檔。
最開始下載下來的文檔沒有序號,這樣看的時候就不知道先后,於是我給文件名前面加了個序號。
其他的優化部分可以參考如下:

  1. 考慮現在函數的一些異常出錯沒有處理,后續需要處理。
  2. 函數沒有完全封裝,下載的文件類型支持不多,這個后續可以根據自己的需求進行擴展。
  3. 下載的文件少的時候可能這樣就行了,但是文件多的話,是有必要使用多個線程(適量的數量)或者線程池去下載,從而加快下載速度。
  4. 有些寫法可能不符合python語法規范,當然寫了與沒寫已經是0和1的區別了。
  5. 其他細節,比如pdf有可能是大寫的PDF。

4.附錄

  1. 《Data Structures and Algorithms in Java》(Michael T. Goodrich, Roberto Tamassia)下載 http://bookzz.org/ 或者http://it-ebooks.info/
    以下兩個網站都是不錯的書籍下載網站,有條件還是買本正版書籍支持一下作者吧。
    一般我會先下載電子書看下,合適就買紙質版。
  2. Python語法入門 http://www.codecademy.com/zh/tracks/python

以上,便是如此了。

本文來自RxRead’s Blog,歡迎轉載,轉載請注明。
歡迎一起交流探討。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM