#python #download #python-requests
#python #Скачать #python-запросы
Вопрос:
пытаюсь загрузить некоторые PDF-файлы с веб-сайта с помощью модуля запросов, но я продолжаю получать эту ошибку, указанную ниже. Я видел несколько сообщений, в которых упоминалось, что они используют response.content
для файлов pdf вместо response.text
, но он по-прежнему генерирует ошибку. Не уверен, как это исправить.
пример ссылки: https://corporate.exxonmobil.com/-/media/Global/Files/worldwide-giving/2018-Worldwide-Giving-Report.pdf
def scrape_website(link):
try:
print("getting content")
cert = requests.certs.where()
page = requests.get(link, verify=cert, headers={"User-Agent": "Mozilla/5.0 (X11; CrOS x86_64 12871.102.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.141 Safari/537.36"})
print(page)
if ".pdf" in link:
print("the content is a pdf file. downloading..")
return page.content
return page.text
except Exception as x:
print(x)
return ''
statement_page = scrape_website(link)
with open(filepath, 'w ', encoding="utf-8") as f:
print("writing page")
f.write(statement_page)
f.close()
<ipython-input-42-1e4771d32073> in save_html_page(page, path, filename)
13 with open(filepath, 'w ', encoding="utf-8") as f:
14 print("writing page")
---> 15 f.write(page)
16 f.close()
17
TypeError: write() argument must be str, not bytes
Комментарии:
1. Изменить
'w '
на'wb'
2. Вы читаете
statement_page
, но затем пытаетесь записатьpage
в файл3. @RandomDavis, я тоже пробовал это, но я все еще продолжаю получать ошибку — еще одна, которую я получаю
a bytes-like object is required, not 'str'
Ответ №1:
иногда мне тоже нужно загружать вещи программно. Я просто использую это:
import requests
response = requests.get("https://link_to_thing.pdf")
file = open("myfile.pdf", "wb")
file.write(response.content)
file.close()
вы также можете использовать os
пакет для загрузки с wget
:
import os
url = 'https://link_to_pdf.pdf'
name = 'myfile.pdf'
os.system('wget {} -O {}'.format(url,name))
Комментарии:
1. Это то, что я сделал, и я получаю эту ошибку:
a bytes-like object is required, not 'str'
2. попробуйте использовать это вместо этого: file = open(«myfile.pdf», «r»)
3. Я бы добавил context manager в код: с помощью open(«myfile.pdf», «wb») в виде file: file. написать (response.content)
Ответ №2:
Вот пример, который я использовал однажды, и он очень удобен, когда вы пытаетесь загрузить большой PDF-файл :
import requests
import sys
url = 'url'
filename = 'filename'
# creating a connection to the pdf
print("Creating the connection ...")
with requests.get(url, stream=True) as r:
if r.status_code != 200:
print("Could not download the file '{}'nError Code : {}nReason : {}nn".format(
url, r.status_code, r.reason), file=sys.stderr)
else:
# Storing the file as a pdf
print("Saving the pdf file :n"{}" ...".format(filename))
with open(filename, 'wb') as f:
try:
total_size = int(r.headers['Content-length'])
saved_size_pers = 0
moversBy = 8192*100/total_size
for chunk in r.iter_content(chunk_size=8192):
if chunk:
f.write(chunk)
saved_size_pers = moversBy
print("r=>> %.2f%%" % (
saved_size_pers if saved_size_pers <= 100 else 100.0), end='')
print(end='nn')
except Exception:
print("==> Couldn't save : {}\".format(filename))
f.flush()
r.close()
r.close()
Для этого используется: iter_content()
для загрузки, а затем сохранения фрагмента pdf с помощью chunck.
Комментарии:
1. Хотя я этого не пробовал, но мне нравится концепция.