Пример #1
0
def parse(each_podcast):
    """
            Берем с бд все ссылки на подкасты, проходимся по ним, если у подкаста метка 3, то не качаем его инфу,
        а сразу переходим к выпускам, качаем до тех пор, пока не найдем скаченный выпуск.
    """

    try:
        html = requests.get(each_podcast).content.decode(
            'utf-8')  # получаем саму ленту
    except UnicodeDecodeError:
        html = requests.get(each_podcast).text

    if html.find(
            'rss'
    ) == -1:  # если это не rss лента (у рсс на индексах которые в условии написано рсс) кидаем в таблицу с битыми ссылками
        util.add_url_in_error_links(each_podcast)
        return

    pre_item_html = html[:html.find(
        '<item>'
    )]  # записываем в ленте часть перед выпусками (для быстрдействия?)

    # находим название подкаста
    title_podcast = pre_item_html[pre_item_html.find('<title>') +
                                  7:pre_item_html.find('</title>')]
    title_podcast = func_for_clear_text.check_on_shit(
        title_podcast)  # название пригодится при парсинге выпуском

    html = html[html.find('<item>'):]  # обрезаем весь html до item

    while html.find('<item>') > -1:  # до тех пор пока находим новый выпуск
        # получаем блок с этим itemом, чтоб работать не по всей странице
        item_code = html[html.find('<item>') + 7:html.find('</item>')]

        # получаем название выпуска
        title_item = item_code[item_code.find('<title>') +
                               7:item_code.find('</title>')]
        title_item = func_for_clear_text.check_on_shit(title_item)

        # переходим в тег с ссылкой на аудио
        enclosure = item_code[item_code.find('<enclosure'):]
        enclosure = enclosure[enclosure.find('url="') + 5:enclosure.find('/>')]
        mp3 = enclosure[:enclosure.find('"')]  # получаем аудио

        if util.check_item(title_item, title_podcast,
                           mp3):  # если такой выпуск уже есть, выходим
            return

        # получаем описание выпуска
        description_item = None
        if item_code.find('description') > -1:
            description_item = func_for_clear_text.parse_description(item_code)

        # получаем дату публикации выпуска
        pubdata_item = func_for_clear_text.clear_pubdata(
            item_code[item_code.find('<pubDate>') +
                      14:item_code.find('</pubDate>') - 6])

        # получаем область с длительностью аудио
        duration_item = str()
        if item_code.find('duration>') > -1:
            temp_code = item_code[item_code.find('duration>') +
                                  9:item_code.find('duration>') + 20]
            duration_item = temp_code[:temp_code.find(
                '</')]  # получаем длительность аудио
            if duration_item and duration_item.find(
                    ':'
            ) == -1:  # проверяем разделено ли время : (иначе оно указано в секундах)
                duration_item = func_for_clear_text.convert_time(
                    int(duration_item))

        # получаем картинку выпуска если такова есть
        image_item = str()
        if item_code.find('image ') > -1 and item_code.find('"image"') == -1:
            temp_code = item_code[item_code.find('image ') + 6:]
            temp_code = temp_code[temp_code.find('href="') + 6:]
            image_item = temp_code[:temp_code.find('"')]

        categorys_item, subcategorys_item = func_for_clear_text.parse_category(
            item_code[:item_code.find('</item>')])

        # находим ключевые слова если они есть
        keyword_item = str()
        if item_code.find('keywords>') > -1:  # если есть ключевые слова
            keyword_item = func_for_clear_text.parse_keywords(
                item_code[:item_code.find('</item>')])
        util.set_new_item(title_podcast, title_item, description_item, mp3,
                          image_item, pubdata_item, duration_item,
                          categorys_item, subcategorys_item, keyword_item)
        html = html[html.find('</item>') +
                    7:]  # режем ту строку с которой отработали, и идем далее
Пример #2
0
def parse(each_podcast):
    """
            Вначале закачиваю инфу о подкасте, название, и прочее;
        После благодаря циклу парсим выпуски, если что кол-во выпусков задано на
        87-ой строке.
            После завершения парсинга первых n выпусков, даем подкасту статус 2, который
        оповещает о том, что данный подккаст требует дозагрузки ВСЕХ подкастов.
    """
    if each_podcast.find(
            'podcasts.apple.com'
    ) > -1:  # если ссылка прям с эпл подкастов а не на рсс
        old_url = each_podcast
        each_podcast = requests.get(
            'http://picklemonkey.net/flipper/extractor.php?feed=' +
            each_podcast).text[12:-2].replace('\/', '/')
        util.change_url(each_podcast, old_url)
    html = requests.get(each_podcast).content.decode(
        'utf-8')  # получаем саму ленту
    pre_item_html = html[:html.find(
        '<item>'
    )]  # записываем в ленте часть перед выпусками (для быстродействия?)

    # находим название подкаста
    title_podcast = pre_item_html[pre_item_html.find('<title>') +
                                  7:pre_item_html.find('</title>')]
    title_podcast = func_for_clear_text.check_on_shit(
        title_podcast)  # название пригодится при парсинге выпусков

    # находим описание подкаста
    description_podcast = None
    if pre_item_html.find('description') > -1:
        description_podcast = func_for_clear_text.parse_description(
            pre_item_html)

    # находим картинку подкаста
    if pre_item_html.find('<image>') > -1:
        image_podcasts = pre_item_html[pre_item_html.find('<image>') +
                                       7:pre_item_html.find('</image>')]
        image_podcasts = image_podcasts[image_podcasts.find('<url>') +
                                        5:image_podcasts.find('</url>')]
    else:
        image_podcasts = pre_item_html[pre_item_html.find('image') + 5:]
        image_podcasts = image_podcasts[image_podcasts.find('href="') + 6:]
        image_podcasts = image_podcasts[:image_podcasts.find('"')]

    # находим ключевые слова если они есть
    keyword_podcasts = str()
    if pre_item_html.find('keywords>') > -1:  # если есть ключевые слова
        keyword_podcasts = func_for_clear_text.parse_keywords(pre_item_html)

    # находим автора, если он есть
    author_podcast = str()
    if pre_item_html.find('author>') > -1:
        temp_code = pre_item_html[pre_item_html.find('author>') + 7:]
        author_podcast = func_for_clear_text.check_on_shit(
            temp_code[:temp_code.find('</')])

    # находим категории если они есть
    categorys_podcast, subcategorys_podcast = func_for_clear_text.parse_category(
        pre_item_html)

    # print('Название: ' + title_podcast + '\n',
    #       'Описание: ' + description_podcast + '\n',
    #       'Картинка: ' + image_podcasts + '\n',
    #       'Ключевые слова: ' , keyword_podcasts , '\n',
    #       'Автор: ' + author_podcast + '\n',
    #       'Категории: ' , categorys_podcast , '\n',
    #       'Подкатегории: ' , subcategorys_podcast , '\n',
    #       )

    util.set_new_podcast(each_podcast, title_podcast, description_podcast,
                         categorys_podcast, image_podcasts, author_podcast,
                         subcategorys_podcast, keyword_podcasts)
    """
        Далее идем к выпускам подкаста, именуется этот тег(в плане сам выпуск) в rss как item, 
        и его столько сколько всего выпусков.
        Имеем цикл, который ходит по этим тегам, из каждого тега выкачиваем ввсё что в нём есть.
    """

    html = html[html.find('<item>'):]  # обрезаем весь html до item
    amount_item = 0  # кол-во выпусков, качаем не более 50

    while html.find(
            '<item>'
    ) > -1 and amount_item <= 50:  # до тех пор пока находим новый выпуск
        amount_item += 1
        # получаем блок с этим itemом, чтоб работать не по всей странице
        item_code = html[html.find('<item>') + 7:html.find('</item>')]

        # получаем название выпуска
        title_item = item_code[item_code.find('<title>') +
                               7:item_code.find('</title>')]
        title_item = func_for_clear_text.check_on_shit(title_item)

        # переходим в тег с ссылкой на аудио
        enclosure = item_code[item_code.find('<enclosure'):]
        enclosure = enclosure[enclosure.find('url="') + 5:enclosure.find('/>')]
        mp3 = enclosure[:enclosure.find('"')]  # получаем аудио

        # получаем описание выпуска
        description_item = None
        if item_code.find('description') > -1:
            description_item = func_for_clear_text.parse_description(item_code)

        # получаем дату публикации выпуска
        pubdata_item = func_for_clear_text.clear_pubdata(
            item_code[item_code.find('<pubDate>') +
                      14:item_code.find('</pubDate>') - 6])

        # получаем область с длительностью аудио
        duration_item = str()
        if item_code.find('duration>') > -1:
            temp_code = item_code[item_code.find('duration>') +
                                  9:item_code.find('duration>') + 20]
            duration_item = temp_code[:temp_code.find(
                '</')]  # получаем длительность аудио
            if duration_item and duration_item.find(
                    ':'
            ) == -1:  # проверяем разделено ли время : (иначе оно указано в секундах)
                duration_item = func_for_clear_text.convert_time(
                    int(duration_item))

        # получаем картинку выпуска если такова есть
        image_item = str()
        if item_code.find('image ') > -1 and item_code.find('"image"') == -1:
            temp_code = item_code[item_code.find('image ') + 6:]
            temp_code = temp_code[temp_code.find('href="') + 6:]
            image_item = temp_code[:temp_code.find('"')]

        categorys_item, subcategorys_item = func_for_clear_text.parse_category(
            item_code[:item_code.find('</item>')])

        # находим ключевые слова если они есть
        keyword_item = str()
        if item_code.find('keywords>') > -1:  # если есть ключевые слова
            keyword_item = func_for_clear_text.parse_keywords(
                item_code[:item_code.find('</item>')])
        util.set_new_item(title_podcast, title_item, description_item, mp3,
                          image_item, pubdata_item, duration_item,
                          categorys_item, subcategorys_item, keyword_item)
        html = html[html.find('</item>') +
                    7:]  # режем ту строку с которой отработали, и идем далее
Пример #3
0
def parse(each_podcast):
    """
        Качаем ВСЕ выпуски данного подкаста, выпуск который уже есть в бд пропускаем.
        В конце, после закачки ВСЕХ выпусков, ставим статус 3, который оповещает о полной
        скаченности подкаста.
    """

    html = requests.get(each_podcast).content.decode(
        'utf-8')  # получаем саму ленту

    pre_item_html = html[:html.find(
        '<item>'
    )]  # записываем в ленте часть перед выпусками (для быстрдействия?)

    # находим название подкаста
    title_podcast = pre_item_html[pre_item_html.find('<title>') +
                                  7:pre_item_html.find('</title>')]
    title_podcast = func_for_clear_text.check_on_shit(
        title_podcast)  # название пригодится при парсинге выпуском

    html = html[html.find('<item>'):]  # обрезаем весь html до item

    while html.find('<item>') > -1:  # до тех пор пока находим новый выпуск
        # получаем блок с этим itemом, чтоб работать не по всей странице
        item_code = html[html.find('<item>') + 7:html.find('</item>')]

        # получаем название выпуска
        title_item = item_code[item_code.find('<title>') +
                               7:item_code.find('</title>')]
        title_item = func_for_clear_text.check_on_shit(title_item)

        # переходим в тег с ссылкой на аудио
        enclosure = item_code[item_code.find('<enclosure'):]
        enclosure = enclosure[enclosure.find('url="') + 5:enclosure.find('/>')]
        mp3 = enclosure[:enclosure.find('"')]  # получаем аудио

        if util.check_item(
                title_item, title_podcast, mp3
        ):  # если такой выпуск уже есть, не выходим, а просто его пропускаем
            html = html[
                html.find('</item>') +
                7:]  # режем ту строку с которой отработали, и идем далее
            continue

        # получаем описание выпуска
        description_item = None
        if item_code.find('description') > -1:
            description_item = func_for_clear_text.parse_description(item_code)

        # получаем дату публикации выпуска
        pubdata_item = func_for_clear_text.clear_pubdata(
            item_code[item_code.find('<pubDate>') +
                      14:item_code.find('</pubDate>') - 6])

        # получаем область с длительностью аудио
        duration_item = str()
        if item_code.find('duration>') > -1:
            temp_code = item_code[item_code.find('duration>') +
                                  9:item_code.find('duration>') + 20]
            duration_item = temp_code[:temp_code.find(
                '</')]  # получаем длительность аудио
            if duration_item and duration_item.find(
                    ':'
            ) == -1:  # проверяем разделено ли время : (иначе оно указано в секундах)
                duration_item = func_for_clear_text.convert_time(
                    int(duration_item))

        # получаем картинку выпуска если такова есть
        image_item = str()
        if item_code.find('image ') > -1 and item_code.find('"image"') == -1:
            temp_code = item_code[item_code.find('image ') + 6:]
            temp_code = temp_code[temp_code.find('href="') + 6:]
            image_item = temp_code[:temp_code.find('"')]

        categorys_item, subcategorys_item = func_for_clear_text.parse_category(
            item_code[:item_code.find('</item>')])

        # находим ключевые слова если они есть
        keyword_item = str()
        if item_code.find('keywords>') > -1:  # если есть ключевые слова
            keyword_item = func_for_clear_text.parse_keywords(
                item_code[:item_code.find('</item>')])
        util.set_new_item(title_podcast, title_item, description_item, mp3,
                          image_item, pubdata_item, duration_item,
                          categorys_item, subcategorys_item, keyword_item)
        html = html[html.find('</item>') +
                    7:]  # режем ту строку с которой отработали, и идем далее
        # print('Название выпуска: ' + title_item + '\n',
        #       'Описание выпуска: ' + description_item + '\n',
        #       'Музыка: ' + mp3 + '\n',
        #       'Дата публикации выпуска: ' + pubdata_item + '\n',
        #       'Длительность выпуска: ' + duration_item + '\n',
        #       'Картинка выпуска: ' + image_item + '\n',
        #       'Категории выпуска: ', categorys_item , '\n',
        #       'Подкатегории выпуска: ', subcategorys_item , '\n',
        #       'Ключевые слова выпуска: ', keyword_item , '\n',
        #       )

    util.change_status(each_podcast, 3)