Яндекс.Метрика

    Питон

    Первые шаги в программирование на Python

    Пару месяцев назад взялся я за изучение Python. Прочитав про используемые структуры, работу со строками, генераторы, основы ООП, размышлял какую полезную программу написать, что бы это все применить на реальной задаче.
    По счастливому стечению обстоятельств ко мне обратились знакомые с просьбой скачать мультфильм «Чудеса на виражах».

    Ближе к делу


    Зайдя на один из популярных трекеров в UA-IX нашел данный мультфильм, только вот каждая серия была выложена отдельно, а нажимать на кнопку «Загрузить» 65 раз не хотелось. В этот момент я и вспомнил о Python.
    Сразу начал искать информацию о том, как получить файлы с сайта. Ответ быстро получил благодаря Google и небезизвестному сайту stackoverflow. Оказалось, что «вытянуть» файлы можно импортированием библиотеки и добавлением пары строк. Опробовав на файлах небольшой размерности, как это все работает, перешел к следующему этапу. Нужно было собрать все ссылки для скачивание и соответствующие им названия файлов.
    В пределах одного тега они нигде не указывались, поэтому ссылки и названия файлов собирал отдельно.
    Для сбора ссылок использовалась библиотека lxml, которая уже рассматривалась на данном сайте. После скачивания и установки данной библиотеки, перешел к написанию самой программы. Код программы представлен ниже:
    
    #! /usr/bin/env python
    
    import urllib
    import lxml.html
     
    load = 'load'
    page = urllib.urlopen('http://www.***.ua/view/12345678')
    doc = lxml.html.document_fromstring(page.read())
    for link in doc.cssselect('p span.r_button_small a'):
        if link.text == None:
            continue
        if load not in link.get('href'):
            continue
        print 'http://***.ua'+link.get('href')
    

    Все собранные ссылки сохранялись в файл, для дальнейшей работы с ними. Конструкции if использовались для фильтрации всех данных. Тем самым я получал только ссылки, которые применялись для загрузки файла на компьютер.
    Названия файлов имели не совсем удобный вид. Поэтому, когда программа получала название файла, она сразу изменяла его на более удобный. Таким образом все файлы получали название вида: «Чудеса на виражах. Серия XX», вместо ХХ — номер серии.
    Код программы:
    
    #! /usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import urllib
    import lxml.html
    
    file_name = u'Чудеса на виражах. Серия '
    episode = 0
    page = urllib.urlopen('http://www.***.ua/view/12345678')
    doc = lxml.html.document_fromstring(page.read())
    for name in doc.cssselect('tr td a'):
        if name.text == None:
            continue
        if not name.text.endswith('.avi'):
            continue
        name.text = file_name + str(episode) + name.text[-4:]
        print name.text.encode('utf8')
        episode += 1
    

    Так, как версия используемого интерпретатора Python 2.6, то для корректной работы с кирилицей пришлось использовать метод encode. Собранные данные также сохранялись в файл.
    После работы обеих программ, на жестком диске имелось два текстовых файла. В одном хранились ссылки для скачивания файлов, а в другом названия серий.
    Для связывания ссылки и названия файла я воспользовался словарем. Ключем выступала ссылка, а в значении ключа хранилось название файла. После чего необходимо было только брать ключ, подставлять его в вызывающую функцию и указать место, имя файла для сохранения.
    Код выполняющий эти действия:
    
    #! usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import urllib
    
    links = open('link','r')
    names = open('file_name', 'r')
    download = {}
    path = '/media/6A9F550C59BC1824/TaleSpin/'
    url = 'http://www.***.ua/load/12345678'
    loadf = []
    
    download = dict(zip(links, names))
    for link in download.iterkeys():
        name = download[link].rstrip()
        if name not in loadf:
            urllib.urlretrieve(link,path+name)
            loadf.append(name)
        else:
            continue
    

    Также используется список, в который заносяться названия серий, которые уже скачались. Используется это для того, что бы в случае прерывания скачивания, не качались серии, которые уже есть на жестком диске.

    Заключение

    Возможно на написание всего этого кода ушло больше времени, по сравнению с тем, если бы я вручную нажимал на кнопку «Загрузить». Но работающая программа принесла гораздо больше удовольствия. Плюс к этому еще и новые знания.

    Использованные материалы

    1. «LXML» или как парсить HTML c лёгкостью
    2. Официальная документация к lxml
    3. Документация к библиотеки urllib
    4. Python Tips, Tricks, and Hacks (часть 2)

    Благодарю за внимание.
    Адрес сайта скрыт, чтобы не сочли за рекламу.