Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 25, 2015 09:13:34

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

Доброго времени суток!
в Пайтоне пока “ноль”.
дали задание на работе реализовать приложение на Питоне, суть которого дать клиентам быстрый доступ к различной справочной информации на нескольких сайтах.
“Горячие” ссылки реализованы в хтмл-файле, который является “главной” страницей приложения.
оболочку уже удалось собрать с помощью PyQt4 для Python 2.7, ссылки корректно открываются, но при попытке скачать необходимый файл результат нулевой.
пробовал использовать urllib/urllib2, но насколько понял, там нужно прописывать для каждого файла ссылку. а потенциальных ссылок может быть сколько угодно, и они могут со временем изменяться.
также в одном из примеров в сети нашел spynner, но он сохраняет файлы в тоже цепочке каталогов, к которой они лежат на серверах, а с точки зрения простого юзера нужно при нажатии на ссылку сохранить файл в удобное для юзера место. вот и не могу разобраться, как это реализовать.

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

прошу помочь и направить в нужную сторону

upd:
ранее не доводилось особо кодить, а теперь стало интересно. да и стимул появился весомый)

Отредактировано krdp (Фев. 25, 2015 09:17:12)

Офлайн

#2 Фев. 26, 2015 15:03:16

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

    from urllib.request import urlopen
    # юрл котоырый нам надо скачать
    url = 'http://vk.com'
    
    # в перемной стрим будем хранить результат запроса
    # выполняем запрос
    stream = urlopen(url)
         
    # открываем файл на запись
    # формируем необходимое имя файла 
    with  open('some_file_name', 'wb') as f:
       # читаем содержимое результат запроса и пишем в файл
        f.write(stream.read())  

Самый простой вариант, есттесвенно необходима обработка сетевых ошибок, необходимо правильно формировтаь имя файла (имя файл это путь + имя файла + расширение)



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Офлайн

#3 Фев. 27, 2015 04:41:13

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

Alex_HH, благодарю)
но правильно ли я понимаю: планируется примерно 10 сайтов, на каждом потенциально 10-20 ссылок на скачиваемые файлы, и следовательно, нужно для каждого файла так расписать вышеуказанным способом?

Офлайн

#4 Фев. 27, 2015 15:59:43

Alex_HH
Зарегистрирован: 2014-03-03
Сообщения: 91
Репутация: +  13  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

Покажите ваши входные данные. И то как вы полуете их.



————–
Зимой и летом heavy metall.
Технический прогресс - это падение вверх. Alex_HH (с)
Эстетизация жестокости есть квинтэссенция смысла человеческого существования. Alex_HH (с)
После бога идет не пустота, там метаданные. Alex_HH (с)

Офлайн

#5 Фев. 28, 2015 17:17:22

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

# set the default
        url = 'ci_links.html'
        self.url.setText(url)
		
# load page
        self.webView.setUrl(QtCore.QUrl(url))

как я писал выше, ссылки на нужные сайты лежат в html-файле, он играет роль домашней страницы приложения.
с моей точки зрения, проще всего было бы запускать хтмлку через обычный браузер, но руководство настаивает, чтобы было самостоятельное приложение с функциями практически полноценного браузера

Отредактировано krdp (Март 5, 2015 20:40:28)

Офлайн

#6 Март 5, 2015 09:28:28

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

частично вопрос решил таким способом:

...
self.webView.page().setForwardUnsupportedContent(True)
self.webView.page().unsupportedContent.connect(self.download)
self.manager = QtNetwork.QNetworkAccessManager()
self.jar = QNetworkCookieJar()
self.manager.setCookieJar(self.jar)
self.manager.finished.connect(self.finished)
...
def download(self, reply):
        self.webView.page().setLinkDelegationPolicy(QWebPage.DelegateAllLinks)
        self.request = reply.request()
        self.request.setUrl(reply.url())
        self.reply = self.manager.get(self.request)
def finished(self):
        path = os.path.expanduser(os.path.join('~', unicode(self.reply.url().path()).split('/')[-1]))
        if self.reply.hasRawHeader('Content-Disposition'):
            cnt_dis = self.reply.rawHeader('Content-Disposition').data()
            if cnt_dis.startswith('attachment'):
                path = cnt_dis.split('=')[1]
        destination = QtGui.QFileDialog.getSaveFileName(self, u"Сохраниение файла", path) 
        if destination:
            f = open(destination [0], 'wb')
            f.write(self.reply.readAll())
            f.flush()
            f.close()
однако любой файл сохраняется в папку со скриптом и имя файла “С” без какого-либо расширения. поиски решения пока не приносят положительных результатов, а читать учебник с середины без знания начала трудновато

помогите понять, в какую сторону копать, т.к. на моем этапе изучения “питона” это пока очень сложно, а руководство начинает торопить.

Отредактировано krdp (Март 5, 2015 20:33:35)

Офлайн

#7 Март 5, 2015 20:39:31

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

и снова сам докопался до нужного результата:
изменил строку

 f = open(destination [0], 'wb')
на
 f = open(destination , 'wb')

осталось только “прикрутить” progressDialog к процессу скачивания

Офлайн

#8 Март 17, 2015 20:18:31

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

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

path = os.path.expanduser(os.path.join('~', unicode(self.reply.url().path()).split('/')[-1]))
не получается.
туториал по os.path не помог (или я невнимательно читал)

Офлайн

#9 Март 18, 2015 14:59:33

krdp
Зарегистрирован: 2015-02-25
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Как реализовать скачивание файлов?

у далось самому решить следующим способом (см. куски кода выше):
изменил строку

f = open(destination, 'wb')
на
f = open(unicode(destination), 'wb')

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version