2016-12-14 182 views
2

上週我定義了一個函數來從期刊網站下載PDF文件。我用成功下載PDF文件幾種:Python下載PDF與urllib2創建損壞的文檔

import urllib2 
def pdfDownload(url): 
    response=urllib2.urlopen(url) 
    expdf=response.read() 
    egpdf=open('ex.pdf','wb') 
    egpdf.write(expdf) 
    egpdf.close() 

我嘗試這個功能了與:

pdfDownload('http://pss.sagepub.com/content/26/1/3.full.pdf') 

在當時,這是在心理科學雜誌的網址是如何被格式化。 PDF下載得很好。

然後我寫了一些更多的代碼來實際生成URL列表併爲這些文件命名,因此我可以一次下載大量適當命名的pdf文檔。

當我回來加入我的兩個腳本(對非技術性語言抱歉,我不是專家,剛剛教導我自己的基礎知識),相關期刊URL的格式已經改變。在上一個URL之後,您可以訪問URL爲'http://journals.sagepub.com/doi/pdf/10.1177/0956797614553009'的頁面。現在,pdfDownload函數不再有效(使用原始URL或新URL)。它會創建一個不能打開的pdf,「因爲該文件不是受支持的文件類型或已被損壞」。

我很困惑,對我來說,好像所有的變化都是URL的格式化,但實際上其他的東西必須改變,導致這個?任何幫助將非常感激。

+0

請發佈您的代碼並明確指出一些URL以測試 –

+0

@EmmaCarey,檢查我編輯的解決方案;它似乎與新的URL一起工作。 – nrlakin

回答

2

問題是新的URL指向一個網頁 - 而不是原始的PDF。如果你打印「expdf」的值,你會得到一堆HTML - 而不是你期望的二進制數據。

我能夠通過一個小小的調整來獲得原始功能 - 我使用requests庫來下載文件而不是urllib2。 requests似乎將文件與您在當前實現中獲得的html中引用的加載器一起拉出。試試這個:

import requests 
def pdfDownload(url): 
    response=requests.get(url) 
    expdf=response.content 
    egpdf=open('ex.pdf','wb') 
    egpdf.write(expdf) 
    egpdf.close() 

如果你使用Python 3,你已經有了requests;如果你使用Python 2.7,你需要pip install requests

+1

這是正確的。 因此,如果我有這個鏈接到網頁,我應該能夠找到底層PDF文檔的鏈接,以便我可以生成它的副本?或者有可能讓網站保持完全隱藏?我不確定這是否是「對不起,如果沒有手動按下」下載PDF「,您將永遠無法從該網站獲得PDF,或者我仍然可以做到這一點? 只是我的運氣,這個網站的變化發生在我正在編寫腳本時! –

+0

@EmmaCarey如果您使用python請求庫,甚至不需要這樣做 - 它會爲您提供呈現的PDF(在JS加載器之後)。我編輯的解決方案中發佈的代碼爲我帶來了新的URL。 – nrlakin

+0

非常感謝 - 這確實有用。對不起,沒有看到您評論的編輯版本。 –