Агрегатор RSS-каналов с использованием Google App Engine - Python - PullRequest
4 голосов
/ 08 февраля 2010

Я пытаюсь создать приложение GAE, которое обрабатывает канал RSS и сохраняет все данные из канала в хранилище данных Google. Я использую Minidom для извлечения контента из RSS-канала. Я также пытался использовать Feedparser и BeautifulSoup, но у меня они не работали.

Мое приложение в настоящее время анализирует канал и сохраняет его в хранилище данных Google примерно за 25 секунд на моем локальном компьютере. Я загрузил приложение, и когда я попытался использовать его, я получил «Ошибка DeadLine Exceeded».

Я хотел бы знать, есть ли какие-либо возможные способы ускорить этот процесс? Канал, который я использую, со временем вырастет до более чем 100 элементов.

Ответы [ 3 ]

6 голосов
/ 08 февраля 2010

Это не должно занять так много времени. Вот как вы можете использовать Универсальный анализатор подачи .

# easy_install feedparser

И пример использования:

import feedparser

feed = 'http://stackoverflow.com/feeds/tag?tagnames=python&sort=newest'
d = feedparser.parse(feed)
for entry in d['entries']:
    print entry.title

В документации показано, как вытащить другие вещи из канала. Если у вас есть конкретная проблема, пожалуйста, опубликуйте подробности.

1 голос
/ 12 февраля 2010

Я нашел способ обойти эту проблему, хотя я не уверен, является ли это оптимальным решением.

Вместо Minidom я использовал cElementTree для разбора RSS-канала. Я обрабатываю каждый тег «item» и его дочерние элементы в отдельной задаче и добавляю их в очередь задач.

Это помогло мне избежать ошибки DeadlineExceededError. Я получаю предупреждение «Этот ресурс использует много ресурсов процессора».

Есть идеи, как избежать предупреждения?

A_iyer

0 голосов
/ 27 декабря 2013

У меня есть демо / прототип GAE для чтения RSS, работающий с Feedparser - http://deliciourss.appspot.com/. Вот код -

Получить ваш канал.

data = urlfetch.fetch(feedUrl)

Разбор с Feedparser

parsedData = feedparser.parse(data.content)

Изменение некоторых функций канала

    # set main section to description if empty
    for ix in range(len(parsedData.entries)):
        bItem = 0
        if hasattr(parsedData.entries[ix],'content'):
            for item in parsedData.entries[ix].content:
                if item.value:
                    bItem = 1
                    break
            if bItem == 0:
                parsedData.entries[ix].content[0].value = parsedData.entries[ix].summary
        else:
            parsedData.entries[ix].content = [{'value':parsedData.entries[ix].summary}]

Шаблон, если вы используете Django / webapp

<?xml version="1.0" encoding="utf-8"?>
<channel>
<title>{{parsedData.channel.title}}</title>
<url>{{feedUrl}}</url>
<id>{{parsedData.channel.id}}</id>
<updated>{{parsedData.channel.updated}}</updated>
{% for entry in parsedData.entries %}
<item>
        <id>{{entry.id}}</id>
        <title>{{entry.title}}</title>
        <link>
        {% for link in entry.links %}
                {% ifequal link.rel "alternate" %}
                        {{link.href|escape}}
                {% endifequal %}
        {% endfor %}
        </link>
        <author>{{entry.author_detail.name}}</author>
        <pubDate>{{entry.published}}</pubDate>
        <description>{{entry.summary|escape}}</description>
        {% for item in entry.content %}
            {% if item.value %} 
               <content>{{item.value|escape}}</content>
            {% endif %}
        {% endfor %}
</item>{% endfor %}
</channel>
...