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

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

11.07.2018, 18:54. Показов 18263. Ответов 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,693
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru