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?
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
Ä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.
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')
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)
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)