webentwicklung-frage-antwort-db.com.de

PDF mit urllib herunterladen?

Ich versuche, eine pdf-Datei von einer Website mit urllib herunterzuladen. Das ist was ich bisher bekommen habe:

import urllib

def download_file(download_url):
    web_file = urllib.urlopen(download_url)
    local_file = open('some_file.pdf', 'w')
    local_file.write(web_file.read())
    web_file.close()
    local_file.close()

if __== 'main':
    download_file('http://www.example.com/some_file.pdf')

Wenn ich diesen Code starte, bekomme ich nur eine leere PDF-Datei. Was mache ich falsch?

15
user3774185

Hier ist ein Beispiel, das funktioniert:

import urllib2

def main():
    download_file("http://mensenhandel.nl/files/pdftest2.pdf")

def download_file(download_url):
    response = urllib2.urlopen(download_url)
    file = open("document.pdf", 'w')
    file.write(response.read())
    file.close()
    print("Completed")

if __== "__main__":
    main()

Es wurde getestet

20
jamiemcg

Ändern Sie open('some_file.pdf', 'w') in open('some_file.pdf', 'wb'). PDF-Dateien sind Binärdateien. Sie benötigen also das 'b'. Dies gilt für fast jede Datei, die Sie nicht in einem Texteditor öffnen können.

11
shockburner

Versuchen Sie, urllib.retrieve (Python 3) zu verwenden, und machen Sie das einfach:

from urllib.request import urlretrieve

def download_file(download_url):
    urlretrieve(download_url, 'path_to_save_plus_some_file.pdf')

if __== 'main':
    download_file('http://www.example.com/some_file.pdf')
3
romulomadu

Wenn Sie den oben genannten Code ausprobiert haben, funktionieren sie in einigen Fällen einwandfrei. Bei einigen Websites mit eingebettetem PDF wird jedoch möglicherweise ein Fehler wie HTTPError: HTTP-Fehler 403: Verboten angezeigt. Solche Websites verfügen über einige Server-Sicherheitsfunktionen, die bekannte Bots blockieren. Im Falle von urllib wird ein Header verwendet, der etwas wie ====> python urllib/3.3.0 sagt. Ich würde also vorschlagen, im Anforderungsmodul von urllib auch einen benutzerdefinierten Header hinzuzufügen (siehe unten).

from urllib.request import Request, urlopen 
import requests  
url="https://realpython.com/python-tricks-sample-pdf"  
import urllib.request  
req = urllib.request.Request(url, headers={'User-Agent': 'Mozilla/5.0'})  
r = requests.get(url)

with open("<location to dump pdf>/<name of file>.pdf", "wb") as code:
    code.write(r.content)
2
Piyush Rumao

Ich würde vorschlagen, die folgenden Codezeilen zu verwenden

import urllib.request
import shutil
url = "link to your website for pdf file to download"
output_file = "local directory://name.pdf"
with urllib.request.urlopen(url) as response, open(output_file, 'wb') as out_file:
     shutil.copyfileobj(response, out_file)
1
Piyush Rumao