Доброго времени и с прошедшими праздниками! Прошел уже целый месяц с момента последней публикации! Извиняюсь за эту паузу. Работа, а затем праздники - это страшное дело. Несколько моментов, Ed:
Пункт 2. total = len(matches). По старой привычке - это некий кэш. В Python в таких вещах нет необходимости?
3. Эти строчки, видимо, остались из какой-то старой версии. Никакого смысла сейчас в них нет, это правда.
5. Какая разница в наличии скобок? Кортеж - он и есть кортеж.
6. Длинных строк нет - проверяется с помощью pylint.
Плюс я попробовал перенести все это хозяйство на третью версию “Питона”. Код:
# -*- coding: utf-8 -*-
"""Не секрет, что сервис imagevenue.com меняет адрес картинки каждый раз
при обновления страницы. Не так-то просто загрузить несколько картинок
сразу в данной ситуации. Эта программа призвана упростить данный процесс.
Также с ее помощью можно загружать материалы с imageshack.us и по прямым
ссылкам. Пример:
linkshop.py -l '<a href="imagevenue.com"></a><a href...' -d /каталог
"""
import re
import os
from sys import stderr
from urllib.request import urlopen, urlretrieve
from optparse import OptionParser
from urllib.parse import urlparse
def get_options():
"""Получает опции и аргументы командной строки."""
parser = OptionParser()
parser.add_option('-d', '--dir', default='', help='каталог для загрузки')
options, args = parser.parse_args()
if not args:
parser.error('неверное количество аргументов')
return options, args
def download(options, args):
"""Получает адреса страниц из href-атрибутов аргумента,
который должен быть обычным HTML-кодом. Используя адреса,
загружает страницы, находит там картинки и их тоже загружает.
"""
matches = re.findall('href="(.+?)"', args)
if not matches:
return
for (key, url) in enumerate(matches):
print('\n%s из %s (%s)\nПолучение страницы...' % (key + 1,
len(matches), url))
try:
url_open = urlopen(url)
except ValueError:
stderr.write('Неверный формат ссылки\n')
continue
try_again = 'y'
while try_again == 'y':
url_open = urlopen(url)
content = url_open.read()
url_open.close()
if not content:
try_again = input('ERROR. Попробовать еще раз? (y or n)')
else:
break
url_parsed = urlparse(url)
netloc = url_parsed.netloc
if 'imageshack' in netloc:
matches = re.search('<link rel="image_src" href="(.+?)"',
content)
url = matches.group(1)
elif 'imagevenue' in netloc:
matches = re.search('SRC="(.+?)"', content)
url = 'http://%s/%s' % (netloc, matches.group(1))
print('Загрузка картинки...')
url_parsed = urlparse(url)
file_name = url_parsed.path.split('/')[-1]
down_name, _headers = urlretrieve(url,
os.path.join(options.dir, file_name))
if os.path.isfile(down_name):
print('OK')
else:
stderr.write('ERROR\n')
if __name__ == '__main__':
OPTIONS, ARGS = get_options()
download(OPTIONS, ARGS[0])