Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Загрузка музыки из VK средствами Python

Anna | 15.06.2014 | нет комментариев

Введение

Лирическое отхождение

Здорово, публика Програпрогра. Я теснее некоторое время отслеживаю за Вами, читаю Ваши работы. Добросовестно сознаться, меня завораживает тонкий и единовременно отважный мир Програ. Следственно, немножко поразмыслив, я решил влиться в Вашу компанию. Это, как Вы теснее, вероятно, подметили, мой 1-й пост, но я не призываю Вас быть помягче ко мне. Скорее, я хочу испытать все те чувства, которые пережили либо переживают бывалые пользователи. Давным-давно хотел это написать тут — добродушно пожаловать под кат.

Что, как и, основное, для чего?

Все легко: скрипт, написанный на Python 3.3, дозволяющий загрузить указанную композицию с небезызвестного vk.com. Я применял только типовые модули: urllib и html.parser. Выражу всеобщее суждение, если скажу, что это тот еще велосипед.

Код

Собственно, код поделен на три условные части: класс для парсинга формы, класс для парсинга списка композиций и основная часть.

Парсинг формы входа

Как я теснее упоминал, парсить мы будем при помощи html.parser.

class FormParser(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.url = None
        self.params = {}
        self.in_form = False
        self.form_parsed = False
        self.method = "GET"

    def handle_starttag(self, tag, attrs):
        tag = tag.lower()
        if tag == "form":
            if self.form_parsed:
                raise RuntimeError("Second form")
            if self.in_form:
                raise RuntimeError("Already in form")
            self.in_form = True 
        if not self.in_form:
            return
        attrs = dict((name.lower(), value) for name, value in attrs)
        if tag == "form":
            self.url = attrs["action"] 
            if "method" in attrs:
                self.method = attrs["method"]
        elif tag == "input" and "type" in attrs and "name" in attrs:
            if attrs["type"] in ["hidden", "text", "password"]:
                self.params[attrs["name"]] = attrs["value"] if "value" in attrs else ""

    def handle_endtag(self, tag):
        tag = tag.lower()
        if tag == "form":
            if not self.in_form:
                raise RuntimeError("Unexpected </form>")
            self.in_form = False
            self.form_parsed = True

Класс занимается тем, что находит тег forminput и прилежащие к ним признаки, как бы methodaction и так дальше.

Парсинг списка композиций

Код имеет схожую конструкцию и приведен ниже.

class TrackSearch(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.url = None
        self.params = {}
        self.in_form = False
        self.form_parsed = False
        self.method = "GET"

    def handle_starttag(self, tag, attrs):
        if self.url == None or len(self.url) < 10:
            tag = tag.lower()
            if tag == "input":
                attrs = dict((name.lower(), value) for name, value in attrs)
                if attrs["type"] == "hidden":
                    self.url = attrs["value"]

Думаю, ничего трудного тут нет. Класс парсит список в поисках первой композиции в начале списка — самый релевантный вариант — и сберегает ссылку на неё в self.url. Проверка len(self.url) < 10 необходима лишь для того, Дабы отсеять первые два input, нужные для функционирования поиска VK.

Интерфейс и вызовы

Безусловно, классов, указанных выше, неудовлетворительно. Дабы удачно авторизоваться, нужно верно обработать cookie. На поддержка приходит urllib.request и http.cookiejar. Создаем обработчик.

opener = urllib.request.build_opener(
        urllib.request.HTTPCookieProcessor(http.cookiejar.CookieJar()),
        urllib.request.HTTPRedirectHandler())

Сейчас, когда других препятствий нет, мы можем начать.

#Сбор нужной информации
print("VK Music Downloader")
login = input("Телефон либо email > ")
password = input("Пароль > ")
track = input("Исполнитель и наименование композиции > ")
filename = track   ".mp3"
track = urllib.parse.quote(track)

#Авторизация
print("Авторизация...")
parser = FormParser()
response = str(opener.open("http://m.vk.com/").read())
parser.feed(response)
parser.params["email"] =login
parser.params["pass"] = password
response = opener.open(parser.url, urllib.parse.urlencode(parser.params).encode())
parser.close()

#Поиск
print("Поиск композиции...")
response = str(opener.open("http://m.vk.com/audio?act=search&q=%s" % track).read())
seacher = TrackSearch()
seacher.feed(response)

#Загрузка
print("Загрузка > %s" % filename)
with urllib.request.urlopen(seacher.url) as data, \
     open(filename, 'wb') as fout:
     fout.write(data.read())

seacher.close()
input("Загрузка закончена")

Завершение

Пример работы скрипта.

На этом мой 1-й пост заканчивается. Спасибо тем, кто уделил время, Дабы просмотреть его. Если у Вас возникли вопросы, я с радостью отвечу. Каждого добросердечного.

 

Оставить комментарий
БАЗА ЗНАНИЙ
СЛУЧАЙНАЯ СТАТЬЯ
СЛУЧАЙНЫЙ БЛОГ
СЛУЧАЙНЫЙ МОД
СЛУЧАЙНЫЙ СКИН
НОВЫЕ МОДЫ
НОВЫЕ СКИНЫ
НАКОПЛЕННЫЙ ОПЫТ
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB