web-dev-qa-db-fra.com

Télécharger le pdf en utilisant urllib?

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?

15
user3774185

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é

20
jamiemcg

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.

11
shockburner

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')
3
romulomadu

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)
2
Piyush Rumao

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)
1
Piyush Rumao