Не удается загрузить файл с веб-сайта с использованием Python

#python #excel #web-scraping #download

#python #excel #очистка веб-страниц #Скачать

Вопрос:

Я новичок в создании веб-сайтов, и у меня возникают проблемы с использованием всех мыслимых методов .get для загрузки некоторых файлов Excel с веб-сайта. Я смог легко проанализировать HTML, чтобы получить URL-адреса для каждой ссылки на странице, но я недостаточно опытен, чтобы понять, почему я не могу загрузить файл (файлы cookie, сеансы и т. Д., Понятия не имею).

Вот веб-сайт:

https://mlcu.org.eg/ar/3118/قوائم-مجلس-الامن-ذات-الصلة

Если вы прокрутите вниз, вы найдете 5 ссылок на файлы Excel, ни одну из которых я не смог загрузить. (просто найдите id=»AutoDownload»

Когда я пытаюсь использовать метод requests .get и сохранить файл с помощью

 import requests
requests.Session()
res = requests.get(url).content
with open(filename) as f:
   f.write(res.content)
  

Я получаю сообщение об ошибке, что res является объектом bytes, и когда я рассматриваю res как переменную, вывод:

 b'<html><head><title>Request Rejected</title></head><body>The requested URL was rejected. 
Please consult with your administrator.<br><br>Your support ID is: 11190392837244519859</body></html>

  

Пытался некоторое время, был бы очень признателен за любую помощь. Большое спасибо.

Ответ №1:

Итак, я, наконец, нашел решение, используя только requests и стандартный синтаксический анализатор Python HTML.

Из того, что я обнаружил, Request rejected ошибку, как правило, трудно отследить до точной причины. В этом случае это было связано с отсутствием пользовательского агента в HTTP-запросе.

 import requests
from html.parser import HTMLParser

# Custom parser to retrieve the links
link_urls = []
class AutoDownloadLinksHTMLParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if(tag == 'a' and [attr for attr in attrs if attr == ('id', 'AutoDownload')]):
            href = [attr[1] for attr in attrs if attr[0] == 'href'][0]
            link_urls.append(href)

# Get the links to the files
url = 'https://mlcu.org.eg/ar/3118/قوائم-مجلس-الامن-ذات-الصلة'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36'}
links_page = requests.get(url, headers=headers)
AutoDownloadLinksHTMLParser().feed(links_page.content.decode('utf-8'))

# Download the files
host = 'https://mlcu.org.eg'
for i, link_url in enumerate(link_urls):
    file_content = requests.get(host   link_urls[i], headers = headers).content
    with open('file'   str(i)   '.xls', 'wb ') as f:
        f.write(file_content)
  

Ответ №2:

Чтобы загрузить файлы, вам необходимо установить поле «User-Agent» в заголовке вашего запроса на python. Это можно сделать, передав dict функции get:

  file = session.get(url,headers=my_headers)
  

По-видимому, этот хост не отвечает на запросы, поступающие из python, которые имеют следующий пользовательский агент:

 'User-Agent': 'python-requests/2.24.0'
  

Имея это в виду, если вы передадите другое значение для этого поля в заголовке вашего запроса, например, значение из Firefox (см. Ниже), хост подумает, что запрос исходит от пользователя Firefox, и ответит фактическим файлом.

Вот полная версия кода:

 import requests

my_headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0',
    'Accept-Encoding': 'gzip, deflate',
    'Accept': '*/*',
    'Connection': 'keep-alive'
    }

session = requests.session()
file = session.get(url, headers=my_headers)
                
with open(filename, 'wb') as f:
    f.write(file.content) 
  

Последний пользовательский агент Firefox работал для меня, но вы можете найти еще много возможных значений для этого поля здесь.

Комментарии:

1. Спасибо JohnnyP, ценю ваше время и помощь

Ответ №3:

Если у вас недостаточно опыта, чтобы вручную задать все правильные параметры в HTTP-запросах, чтобы избежать ошибки «Запрос отклонен», которая у вас есть (со своей стороны, я бы не смог), я бы посоветовал вам использовать подход более высокого уровня, такой как Selenium.

Selenium может автоматизировать действия, выполняемые браузером, установленным на вашем компьютере, такие как загрузка файлов (таким образом, он используется для автоматизации тестирования веб-приложений, а также для очистки веб-страниц). Идея заключается в том, что HTTP-запрос, сгенерированный браузером, будет лучше, чем тот, который вы можете написать вручную.

Вот руководство по выполнению того, что вы пытаетесь сделать с помощью Selenium.

Комментарии:

1. Спасибо, ценю обратную связь. Я. Я знаю Selenium, но надеялся на более чистое решение, которое не предполагает такого «косвенного» подхода к загрузке этих файлов. Если я не могу получить помощь, мне, возможно, придется просто прибегнуть к ней.. Еще раз спасибо.