RSS Feed聚合器使用Google App Engine - Python

时间:2010-02-08 19:20:35

标签: python rss feed

我正在尝试构建一个处理RSS Feed的GAE应用,并将Feed中的所有数据存储到Google Datastore中。我使用Minidom从RSS提要中提取内容。我也尝试使用Feedparser和BeautifulSoup,但它们对我不起作用。

我的应用目前正在解析Feed,并在我的本地计算机上大约25秒内将其保存在Google数据存储区中。我上传了应用程序,当我尝试使用它时,我收到了“DeadLine Exceeded Error”。

我想知道是否有任何可能的方法来加快这个过程?随着时间的推移,我使用的饲料最终将增长到超过100种。

3 个答案:

答案 0 :(得分:6)

不应该花那么长时间。以下是您使用Universal Feed Parser的方法。

# 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

该文档向您展示了如何从Feed中提取其他内容。如果您有特定问题,请发布详细信息。

答案 1 :(得分:1)

我找到了解决此问题的方法,但我不确定这是否是最佳解决方案。

我使用cElementTree来解析RSS提要,而不是Minidom。我在一个单独的任务中处理每个“item”标签及其子项,并将这些任务添加到任务队列中。

这有助于我避免DeadlineExceededError。我得到了“此资源使用大量CPU资源”的警告。

关于如何避免警告的任何想法?

A_iyer

答案 2 :(得分:0)

我有一个使用Feedparser的{GAE RSS阅读器演示/原型 ​​- http://deliciourss.appspot.com/。这是一些代码 -

获取您的Feed。

data = urlfetch.fetch(feedUrl)

使用Feedparser解析

parsedData = feedparser.parse(data.content)

更改Feed的某些功能

    # 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>