krdp
Фев. 25, 2015 09:13:34
Доброго времени суток!
в Пайтоне пока “ноль”.
дали задание на работе реализовать приложение на Питоне, суть которого дать клиентам быстрый доступ к различной справочной информации на нескольких сайтах.
“Горячие” ссылки реализованы в хтмл-файле, который является “главной” страницей приложения.
оболочку уже удалось собрать с помощью PyQt4 для Python 2.7, ссылки корректно открываются, но при попытке скачать необходимый файл результат нулевой.
пробовал использовать urllib/urllib2, но насколько понял, там нужно прописывать для каждого файла ссылку. а потенциальных ссылок может быть сколько угодно, и они могут со временем изменяться.
также в одном из примеров в сети нашел spynner, но он сохраняет файлы в тоже цепочке каталогов, к которой они лежат на серверах, а с точки зрения простого юзера нужно при нажатии на ссылку сохранить файл в удобное для юзера место. вот и не могу разобраться, как это реализовать.
на данный момент приложение представляет собой легкий браузер. но, к сожалению, сколько ни искал, так и не смог найти, как “научить” его качать любые файлы по любым ссылка.
прошу помочь и направить в нужную сторону
upd:
ранее не доводилось особо кодить, а теперь стало интересно. да и стимул появился весомый)
Alex_HH
Фев. 26, 2015 15:03:16
from urllib.request import urlopen
# юрл котоырый нам надо скачать
url = 'http://vk.com'
# в перемной стрим будем хранить результат запроса
# выполняем запрос
stream = urlopen(url)
# открываем файл на запись
# формируем необходимое имя файла
with open('some_file_name', 'wb') as f:
# читаем содержимое результат запроса и пишем в файл
f.write(stream.read())
Самый простой вариант, есттесвенно необходима обработка сетевых ошибок, необходимо правильно формировтаь имя файла (имя файл это путь + имя файла + расширение)
krdp
Фев. 27, 2015 04:41:13
Alex_HH, благодарю)
но правильно ли я понимаю: планируется примерно 10 сайтов, на каждом потенциально 10-20 ссылок на скачиваемые файлы, и следовательно, нужно для каждого файла так расписать вышеуказанным способом?
Alex_HH
Фев. 27, 2015 15:59:43
Покажите ваши входные данные. И то как вы полуете их.
krdp
Фев. 28, 2015 17:17:22
# set the default
url = 'ci_links.html'
self.url.setText(url)
# load page
self.webView.setUrl(QtCore.QUrl(url))
как я писал выше, ссылки на нужные сайты лежат в html-файле, он играет роль домашней страницы приложения.
с моей точки зрения, проще всего было бы запускать хтмлку через обычный браузер, но руководство настаивает, чтобы было самостоятельное приложение с функциями практически полноценного браузера
krdp
Март 5, 2015 09:28:28
частично вопрос решил таким способом:
...
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:39:31
и снова сам докопался до нужного результата:
изменил строку
f = open(destination [0], 'wb')
на
f = open(destination , 'wb')
осталось только “прикрутить” progressDialog к процессу скачивания
krdp
Март 17, 2015 20:18:31
сегодня с коллегой при тестировании вышеуказанной программы обнаружили, что файлы скачиваются и успешно сохраняются только, если в пути сохранения не используется кириллица, за исключением стандартных виндовых каталогов типа десктоп, мои документы и т.п.
в силу недостатка опыта прошу помощи, т.к. своими силами исправить строку
path = os.path.expanduser(os.path.join('~', unicode(self.reply.url().path()).split('/')[-1]))
не получается.
туториал по os.path не помог (или я невнимательно читал)
krdp
Март 18, 2015 14:59:33
у далось самому решить следующим способом (см. куски кода выше):
изменил строку
f = open(destination, 'wb')
на
f = open(unicode(destination), 'wb')