J'essaie de télécharger un fichier pdf à partir d'un site Web en utilisant urllib. C'est ce que j'ai eu jusqu'à présent:
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')
Lorsque je lance ce code, tout ce que je reçois est un fichier pdf vide. Qu'est-ce que je fais mal?
Voici un exemple qui fonctionne:
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()
Il a été testé
Remplacez open('some_file.pdf', 'w')
par open('some_file.pdf', 'wb')
, les fichiers pdf étant des fichiers binaires, vous avez besoin du 'b' Cela est vrai pour pratiquement tous les fichiers que vous ne pouvez pas ouvrir dans un éditeur de texte.
Essayez d'utiliser urllib.retrieve
(Python 3) et procédez comme suit:
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')
Si vous avez essayé le code ci-dessus, ils fonctionnent bien dans certains cas, mais pour certains sites Web avec pdf intégré, vous risquez de recevoir une erreur du type HTTPError: Erreur HTTP 403: Interdit . Ces sites Web ont des fonctionnalités de sécurité du serveur qui bloquent les robots connus. Dans le cas de urllib, il utilise un en-tête qui dit quelque chose comme ====> python urllib/3.3.0 . Je suggère donc d’ajouter un en-tête personnalisé aussi dans le module request d’urllib, comme indiqué ci-dessous.
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)
Je suggère d'utiliser les lignes de code suivantes
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)