Загрузите файл с помощью Python без селена, например "Сохранить ссылку как" в Chrome

Существует страница в Интернете, где я могу загружать zip-файлы, используя параметр «Сохранить ссылку как» в Chrome, но когда я копирую адрес ссылки и открываю его в браузере, он возвращает 403 / запрещено. Я попытался сохранить файл с помощью библиотеки запросов, но он также получил запрещенный ответ.

Я не знаю, как Chrome может его загрузить, но я не могу загрузить его с помощью библиотеки запросов.

Как я могу загрузить файл без использования веб-драйвера Selenium, поскольку это будет излишним для этой простой задачи?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
0
1 122
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я бы рекомендовал использовать для этого запросы. Ниже приведен простой пример с заполненным первым файлом:

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)

Веб-сайт проверяет наличие реферера в заголовке, если реферер не совпадает с самим сайтом, он отклоняет запрос.

Вышеупомянутое сработало для меня. Какую версию Python вы используете?

Douglas Korinke 18.12.2018 19:33

Вы проверяли код статуса своего запроса? Если вы проверите, это будет 403, и вы не сможете открыть zip-файл, даже если он загружен, так как там ничего нет

wings 18.12.2018 19:36

Это то, что я получаю, если не проверяю r.content перед записью пустого zip-файла. Вы правы. Я работаю над редактированием моего исходного сценария, чтобы посмотреть, смогу ли я довести вас до финиша.

Douglas Korinke 18.12.2018 19:42

Я так много пробовал, но ничего не вышло. Все еще получаю ответ 403

Jagjeet Singh 18.12.2018 19:53

Есть ли требование, согласно которому вы не можете использовать Selenium?

Douglas Korinke 18.12.2018 19:55

Я думаю, что сервер заблокировал и wget, и curl

Jagjeet Singh 18.12.2018 19:57

@Douglas нет такого требования, но я не хочу использовать селен для этой простой задачи, так как это замедлит процесс. Мне любопытно, как это возможно из хрома и только при нажатии на ссылку, а не при копировании URL-адреса в браузере.

wings 18.12.2018 20:02

Я думаю, вам может потребоваться передать cookie обратно на сайт. Попробуйте использовать сеансы, я скоро смогу вернуться, чтобы попробовать еще раз.

Douglas Korinke 18.12.2018 20:03

Я проверил консоль разработчика и обнаружил, что этот веб-сайт не хранит файлы cookie в браузере.

wings 18.12.2018 20:15

@Douglas Веб-сайт проверяет наличие реферера в заголовке, если реферер не совпадает с самим сайтом, он отклоняет запрос. Я добавил Referer в шапку, и это сработало

wings 18.12.2018 21:17

@JagjeetSingh нам нужно добавить ссылку на сам сайт в шапке

wings 18.12.2018 21:18

Понятно, я одобрил правку в блоке кода выше. Рад, что вы смогли это понять!

Douglas Korinke 18.12.2018 21:19

Хороший ответ, но я не думаю, что ему для этого нужна сторонняя библиотека. urllib.request отлично с этим справляется.

Cole 18.12.2018 21:36

Используйте 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>)

Это загрузит ваш файл по указанному пути.

File downloaded

Другие вопросы по теме