it-swarm.com.ru

Скачать PDF, используя urllib?

Я пытаюсь загрузить PDF-файл с веб-сайта, используя urllib. Это то, что я получил так далеко:

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

Когда я запускаю этот код, все, что я получаю, это пустой файл PDF. Что я делаю неправильно?

15
user3774185

Вот пример, который работает:

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()

Это было проверено

20
jamiemcg

Измените open('some_file.pdf', 'w') на open('some_file.pdf', 'wb'), pdf файлы - это двоичные файлы, поэтому вам нужен 'b'. Это верно практически для любого файла, который вы не можете открыть в текстовом редакторе.

11
shockburner

Попробуйте использовать urllib.retrieve (Python 3) и просто сделайте это:

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

Испытанный выше код, в некоторых случаях он работает нормально, но для некоторых веб-сайтов со встроенным pdf вы можете получить сообщение об ошибке, например HTTPError: HTTP Error 403: Forbidden . Такие веб-сайты имеют некоторые функции безопасности сервера, которые блокируют известных ботов. В случае urllib он использует заголовок, который скажет что-то вроде ====> python urllib/3.3.0 . Поэтому я бы предложил добавить собственный заголовок в модуль запроса urllib, как показано ниже.

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

Я бы предложил использовать следующие строки кода

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