Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/88: Рейтинг темы: голосов - 88, средняя оценка - 4.61
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70

Selenium Скачивание файлов с сайта

11.07.2018, 18:54. Показов 17981. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть сайт с которого нужно скачать файлы. Делаю это так:

Импорт библиотек:
Python
1
2
import time
from selenium import webdriver
Создание списка нужных файлов(ссылка на csv):
Python
1
files = [file1, file2, ... file]
Настройка профиля webdriver.FirefoxProfile()
Python
1
2
3
4
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.download.dir', '/tmp')
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv')
Запуск браузер
Python
1
browser = webdriver.Firefox(profile)
Авторизация на сайте(иначе не будет доступа к нужным файлам)

пока все работает)

Python
1
2
for f in files :
browser.get(f)
И тут возникает проблема: Скачивается первый файл и на этом все останавливается. Закрываю браузер и получаю ошибку:
WebDriverException: Message: Failed to decode response from marionette
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.07.2018, 18:54
Ответы с готовыми решениями:

Скачивание файлов с сайта
Здравствуйте, у меня вопрос можно ли скачать все файлы с сайта. Допустим имеется сайт exemple.ru ссылки на файлы хаотично...

Скачивание файлов с сайта
Всем привет. У меня на сайте есть доступные файлы для скачивания. Когда пользователь выделяет каталог и хочет его скачать, каталог...

Разрешения на скачивание файлов с сайта
Как лучше, чтобы посетители сайта могли скачивать с него файлы, не пройдя регистрацию? Или же лучше разрешить скачивание только...

17
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
12.07.2018, 07:41
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
browser.get(f)
это переход по ссылке, для скачивания можно скажем просто кликать по ссылкам этих файлов.
а какая конкретная задача стоит, что проверяем?
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
12.07.2018, 19:19  [ТС]
Welemir1, Здравствуйте, спасибо, что не прошли мимо моего сообщения.
Массив files хранит ссылки на нужные файлы. на сайте файлы хранятся как ссылки:
HTML5
1
<a href='.../Отчет_1.csv'>Отчет 1<a>
которые доступны после успешного прохождения авторизации.
Кликать на что либо для скачивания нет необходимости(я такую ссылку могу вставить в адресную строку браузера и после появится окно "Сохранить как")...
Мне удается скачать первый файл из массива, но дальше дело не идет, после
Python
1
browser.get(f)
цикл перестает работать.
Посоветуете что-то ?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
12.07.2018, 19:35
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
Посоветуете что-то ?
1) размер фалов известен, не очень большой
2) попробуйте именно прокликать ссылки и проверить, скачает ли при таком сценарии

но ответа на вопрос так и нет - что конкретно то проверяем? в чем хотим убедиться?
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
15.07.2018, 20:30  [ТС]
Вообщем, искал в инете ничего что помогло бы не нашел...
нужно скачать файл CSV который хранится по прямой ссылке
Вот мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from selenium import webdriver
 
profile = webdriver.FirefoxProfile()
profile.set_preference('browser.download.manager.showWhenStarting', False)
profile.set_preference('browser.download.manager.showAlertOnComplete', False)
profile.set_preference('browser.download.folderList', 2)
profile.set_preference('browser.download.dir', '/tmp')
#profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'text/csv')
profile.set_preference('browser.helperApps.neverAsk.saveToDisk', 'application/zip')
 
 
browser = webdriver.Firefox(profile)
browser.get('https://digital-agenda-data.eu/datasets/digital_agenda_scoreboard_key_indicators/')
 
try:
    #Download
    browser.get('https://digital-agenda-data.eu/download/digital-agenda-scoreboard-key-indicators.csv.zip')
except Exception as err:
    print(err)
 
browser.quit()
после
browser.get('https://digital-agenda-data.eu/download/digital-agenda-scoreboard-key-indicators.csv.zip')
просто "висит" (не знаю как еще это описать, проще протестировать) и в итоге выдает ошибку:
Message: Timeout loading page after 300000ms
и только после переходит к дальнейшему коду.
Подскажите что не так или по возможности доработайте код
п.с. скачивание должно происходить с помощью selenium т.к. до этого используется для авторизации
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.07.2018, 06:32
1) все же зря не попробовал авторизоваться и кликнуть по ссылке, он тебе и ошибку пишет, что не может страницу загрузить, потому что это не страница
2) можно авторизоваться и без селениум, обойтись 2 запросами -1 запрос авторизации (получаем куки) 2 запрос к файлу с этой куки. Рекомендую библиотеку requests
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
16.07.2018, 19:11  [ТС]
все же зря не попробовал авторизоваться и кликнуть по ссылке - пробовал, результата не получил.
можно авторизоваться и без селениум - можно рекомендацию получить в виде конкретного примера?
сколько я не пытаюсь найти толковый пример все в них "общее об общем", короче ценнопознавательно ничего нет, иначе не писал бы на форум
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
16.07.2018, 19:35
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
сколько я не пытаюсь найти толковый пример все в них "общее об общем"
не верю!

не понял, а зачем авторизация, зашел на сайт, там вот ссылка https://digital-agenda-data.eu... rs.csv.zip

вот тебе общее об общем:
Python
1
2
3
4
import requests
r =requests.get('https://digital-agenda-data.eu/download/digital-agenda-scoreboard-key-indicators.csv.zip');
with open("example.zip","wb") as file:
    file.write(r.content)
и готов твой архив
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.07.2018, 19:48
А как зарегаться на это сайте? Форму логина нашел - регистрации нет.
Если авторизация нужна (хотя, как показал Welemir1, файлы и так загружаются), то опять же, как и посоветовали выше, очень даже вероятно (99.9%), что можно обойтись простым requests без всяких селениумов.
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
16.07.2018, 21:22  [ТС]
Прежде всего хочу поблагодарить за ответы.
... себе все пальцы изгуглил уже в поисках примеров и описаний
самое типа точно что нашел это вот: http://docs.python-requests.org/en/master/
ожидал, что здесь-то получу полное описание всего, проштудирую мануалы и все вопросы отпадут, но увы

Авторизация необходима, без ее успешного прохождения не будет доступа к ссылкам на нужные файлы!

вышеописанная ссылка https://digital-agenda-data.eu... rs.csv.zip это как пример того в каком виде инфа лежит на сайте после прохождения успешной авторизации

авторизация на сайте происходит через форму, которая имеет поля:
Логин(id='Login')
Пароль(id='Password')
Запомнить меня(id='Remember')
Кнопка вход

когда я реализовывал авторизацию через selenium проблем нет: через xpath нашел нужные элементы, передал нужные значения, кликнул по кнопке вход и вуаля! я залогинился. Нужно было только скачать файл, но как описано выше скачать не удавалось.

Согласно рекомендация полез через reaquests(я его и до этого пробовал)
вот что написал:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests, shutil, os
url = 'страница для авторизации'
payload = {'Login': 'мой логин', 'Password': 'мой пароль', 'RememberMe': 1}
session = requests.session()
r = requests.post(url, data=payload)
print (r.status_code)
print (r.cookies)
 
s='ссылка на файл для скачивания'
(dirname, filename) = os.path.split(s)
r = requests.get(s, stream=True)
if r.status_code == 200:
    with open(filename, 'wb') as f:
        r.raw.decode_content = True
        shutil.copyfileobj(r.raw, f)
        print(filename)
Результат - нет ожидаемого результата.

У меня элементарный вопрос: как при таком способе авторизации без привязки логина и пароля к конкретным поля данные попросту не будут перепутаны???
в отличии того как это выглядит при использовании selenium

Python
1
2
3
4
5
6
7
8
def authorization(login, passwd):
    browser.get('страница для прохождения авторизации')
    textarea = browser.find_element_by_id('Login')
    textarea.send_keys(login)
    textarea = browser.find_element_by_id('Password')
    textarea.send_keys(passwd)
    submit = browser.find_element_by_xpath("//form[@id='login']/input[@value='Вход']")
    submit.click()
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
16.07.2018, 22:26
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
как при таком способе авторизации без привязки логина и пароля к конкретным поля
Привязка есть - просто вы не понимаете как правильно работать с формами из requests. Нужно lxml использовать, чтобы распарсить поля возвращенной страницы из ответа (хотя lxml и так есть атрибут forms со всеми полями всех форм):

Python
1
2
3
4
5
6
7
8
    data = session.get(url, headers=headers).content
 
    page = lxml.html.fromstring(data)
    form = page.forms[0]  # если нужная форма - первая 
    form.fields['имя_или_id_поля_для_логина'] = login
    form.fields['имя_или_id_поля_для_пароля'] = password
 
    response = session.post(form.action, data=form.form_values())
Вот непонятно откуда у вас id Login и Password, если при отправке запроса (на эту форму https://digital-agenda-data.eu/login_form) через браузер идет POST запросам с такими полями:
Code
1
2
3
4
куча прочих полей
....
__ac_name: login_name  // это я отправил
__ac_password: password // это я отправил
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
16.07.2018, 22:56  [ТС]
Garry Galler, спасибо за ответ, уже по этому примеру становится более понятен принцип решения моей задачи.
посоветуйте, где можно почитать описание методов и функций?
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
16.07.2018, 23:15  [ТС]
Тест файл:
Вложения
Тип файла: xlsx nonfinancial_sector_households_debt.xlsx (13.2 Кб, 1 просмотров)
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
17.07.2018, 05:40
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
как при таком способе авторизации без привязки логина и пароля к конкретным поля данные попросту не будут перепутаны???
а очень просто -ты что то не то делаешь и не пытаешься разобраться. Знаешь как работает браузер? вот ты и должен эмулировать его действия. А для этого посмотреть какие запросы с какими параметрами шлет твой браузер для авторизации и просто их повторить с помощью requests, никакие поля ввода тут уже не важны и селениум не нужен.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
17.07.2018, 13:13
Цитата Сообщение от Andrey_zlt Посмотреть сообщение
где можно почитать описание методов и функций?
lxml
requests
Никаких ссылок на русскоязычные документы не даю, потому что их:
1) практически нет
2) полная информация только в офиц. документации пакетов.
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
18.07.2018, 21:05  [ТС]
После полученных рекомендаций от Garry Galler, принялся за написание.
Вот что получилась:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import requests, shutil, os, time
from lxml import html
url = 'https://www.cyberforum.ru/log-in.php'
form_site = {'form': 0, 'Login_id': 'vb_login_username', 'Password_id': 'vb_login_password'}
user = {'Login': 'login', 'Password': 'passwd'}
session = requests.session()
content = session.get(url).content
time.sleep(0) # т.к. есть дозагрузка страницы
page = html.fromstring(content)
form = page.forms[form_site['form']]
form.fields[form_site['Login_id']] = user['Login']
form.fields[form_site['Password_id']] = user['Password']
try:
    response = session.post(form.action, data = form.form_values())
    print (response.status_code)
    print (response.cookies)
except Exception as err:
    print(err)
Тестирую на CyberForum(админа прошу не препятствовать), получаю ошибку:
Invalid URL 'login.php?do=login': No schema supplied. Perhaps you meant http://login.php?do=login?

Понимаю, что ошибка здесь: http://login.php?do=login? и вероятно нужно как-то исправить сам
Python
1
response = session.post(form.action, data = form.form_values())
Добавлено через 46 минут
попробовал action задать так:
Python
1
response = session.post(form.action = 'https://www.cyberforum.ru/log-in.php', data = form.form_values())
или так:
Python
1
response = session.post(form.action('https://www.cyberforum.ru/log-in.php'), data = form.form_values())
проблему не решило.

Добавлено через 11 минут
сделал такой вариант:

Python
1
response = session.post(url, data = form.form_values())
где url по сути страница авторизации на которую по идии и ссылается action

получил:
<RequestsCookieJar[<Cookie bblastactivity=0 for www.cyberforum.ru/>, <Cookie bborig_cookieuser=1 for www.cyberforum.ru/>]>

правильно ли я понимаю что авторизация успешна?
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
18.07.2018, 22:29
Слишком много действий наугад - документацию читайте.
action может быть как относительным, так и абсолютным - это тоже нужно учитывать.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
login = '123'
password = '123'
host = 'https://www.cyberforum.ru/'
url_login = 'https://www.cyberforum.ru/log-in.php'
 
def is_login(r):
    '''проверка входа на cyberforum'''
    for k,v in r.cookies.items():
        if k=='vbseo_loggedin' and v=='yes':
            print('Мы вошли')
            break     
    else:
        print('Печалька') 
 
 
# способ №1 - используем поля форм
def auth_1():
    # отправляем первичный запрос 
    # особенность киберфорума: если не отправлять заголовки - форма будет только одна, если отправлять - несколько и нужная по индексу 2
    resp = session.get(url_login) 
    page = lxml.html.fromstring(resp.content) #  получаем разобранное дерево элементов
    '''
    for form in page.forms:
        print(form)
        for k,v in form.fields.items():
            print(k,v)
    '''
    
    form = page.forms[0]  # берем нужную форму - то, что брать нужно именно ее - нужно убеждаться эмпирическим путем, заглянув в исходный код страницы, так как нужная форма может и не быть первой
    form.fields['vb_login_username'] = login      # имена полей узнаем из исходного кода страницы
    form.fields['vb_login_password'] = password
    #form.fields['vb_login_md5password'] = md5(bytes(password,'ascii')).hexdigest()
    #form.fields['vb_login_md5password_utf'] = md5(bytes(password,'ascii')).hexdigest()
    
    r = session.post("{}{}".format(host,form.action), data=form.form_values())
    return r
 
# способ № 2 - не будем тратить время на отправку первичного запроса, чтобы получить экземпляр формы 
# мы просто 'подсмотрим', что отправляет браузер и сделаем точно также
 
def auth_2():
    # а браузер отправляет post запросом именно это
    data = {
    'vb_login_username': login,
    'vb_login_password':password,
    #'vb_login_md5password': md5(bytes(password,'ascii')).hexdigest(),
    #'vb_login_md5password_utf': md5(bytes(password,'ascii')).hexdigest(),
    'do': 'login' 
    }
    
    r = session.post('{}{}'.format(host,'/login.php'), data=data)
    
    return r
 
session = requests.Session()
is_login(auth_1())
session = requests.Session()
is_login(auth_2())
P.S. В примере пароль отправляется как есть, хотя cyberforum уже так не делает и предварительно хэширует его md5, отправляя данные через соответствующие поля.
В примере они закомментированы.
0
0 / 0 / 2
Регистрация: 22.04.2015
Сообщений: 70
22.07.2018, 12:01  [ТС]
Garry Galler, спасибо за ответ.
пока вопрос на паузе(задач навалилось)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2018, 12:01
Помогаю со студенческими работами здесь

Скачивание с сайта пдф файлов
Добрый день. Возник вопрос. Мне необходимо в Андроид студии создать приложение, которое ассинхронно скачивает пдф файл с сервера и...

Поочередное скачивание файлов с сайта на ПК
Здравствуйте. Подскажите ка организовать на PHP скачивание на ПК двух файлов по очереди при нажатии на одну ссылку? Т.е. чтобы на...

Реализация ограничения на скачивание файлов с сайта
Есть сайт с документацией. Сайт на WordPress. Документация в виде PDF DjVu RAR. Есть возможность скачивать эти файлы. Регистрации на сайте...

Скачивание файлов с сайта только после регистрации
Добрый день. Как написать, чтоб пользователи могли качать файлы с сайта только после регистрации/авторизации?

selenium, скачивание файла
здравствуйте. хотел сделать прогу которая автоматом качает файлы сайт позволяет скачать файлы прямо через ссылку не нажимая кнопку...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru