Существует страница в Интернете, где я могу загружать zip-файлы, используя параметр «Сохранить ссылку как» в Chrome, но когда я копирую адрес ссылки и открываю его в браузере, он возвращает 403 / запрещено. Я попытался сохранить файл с помощью библиотеки запросов, но он также получил запрещенный ответ.
Я не знаю, как Chrome может его загрузить, но я не могу загрузить его с помощью библиотеки запросов.
Как я могу загрузить файл без использования веб-драйвера Selenium, поскольку это будет излишним для этой простой задачи?
Я бы рекомендовал использовать для этого запросы. Ниже приведен простой пример с заполненным первым файлом:
url = 'https://www.nseindia.com/content/historical/EQUITIES/2003/DEC/cm01DEC2003bhav.csv.zip'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.93 Safari/537.36', 'Referer': 'https://www.nseindia.com/'}
r = requests.get(url, allow_redirects=True, headers=headers)
open('cm01DEC2003bhav.csv.zip', 'wb').write(r.content)
Веб-сайт проверяет наличие реферера в заголовке, если реферер не совпадает с самим сайтом, он отклоняет запрос.
Вы проверяли код статуса своего запроса? Если вы проверите, это будет 403, и вы не сможете открыть zip-файл, даже если он загружен, так как там ничего нет
Это то, что я получаю, если не проверяю r.content перед записью пустого zip-файла. Вы правы. Я работаю над редактированием моего исходного сценария, чтобы посмотреть, смогу ли я довести вас до финиша.
Я так много пробовал, но ничего не вышло. Все еще получаю ответ 403
Есть ли требование, согласно которому вы не можете использовать Selenium?
Я думаю, что сервер заблокировал и wget, и curl
@Douglas нет такого требования, но я не хочу использовать селен для этой простой задачи, так как это замедлит процесс. Мне любопытно, как это возможно из хрома и только при нажатии на ссылку, а не при копировании URL-адреса в браузере.
Я думаю, вам может потребоваться передать cookie обратно на сайт. Попробуйте использовать сеансы, я скоро смогу вернуться, чтобы попробовать еще раз.
Я проверил консоль разработчика и обнаружил, что этот веб-сайт не хранит файлы cookie в браузере.
@Douglas Веб-сайт проверяет наличие реферера в заголовке, если реферер не совпадает с самим сайтом, он отклоняет запрос. Я добавил Referer в шапку, и это сработало
@JagjeetSingh нам нужно добавить ссылку на сам сайт в шапке
Понятно, я одобрил правку в блоке кода выше. Рад, что вы смогли это понять!
Хороший ответ, но я не думаю, что ему для этого нужна сторонняя библиотека. urllib.request
отлично с этим справляется.
Используйте urllib.request.urlretrieve
с настраиваемым заголовком Referer
, например, @Douglas:
>>> import urllib.request
>>> opener = urllib.request.build_opener()
>>> opener.addheaders = [('Referer', 'https://www.nseindia.com/')]
>>> urllib.request.install_opener(opener)
>>> source = 'https://www.nseindia.com/content/historical/EQUITIES/2001/JAN/cm01JAN2001bhav.csv.zip'
>>> destination = 'destination.csv.zip' # Path to destination.
>>> urllib.request.urlretrieve(source, destination)
('destination.csv.zip', <http.client.HTTPMessage object at 0x10ce20208>)
Это загрузит ваш файл по указанному пути.
Вышеупомянутое сработало для меня. Какую версию Python вы используете?