使用谷歌应用引擎的RSS聚合器 - Python

4 投票
3 回答
3415 浏览
提问于 2025-04-15 19:02

我正在尝试建立一个GAE应用程序,这个程序可以处理RSS源,并把源中的所有数据存储到Google Datastore里。我使用Minidom来提取RSS源中的内容。我也试过用Feedparser和BeautifulSoup,但对我来说都没用。

目前我的应用程序在本地机器上解析这个源,并在大约25秒内把数据保存到Google Datastore里。我把应用程序上传后,尝试使用时却遇到了“超时错误”。

我想知道有没有什么方法可以加快这个过程?我使用的源将来会逐渐增加到超过100个项目。

3 个回答

0

我有一个使用Feedparser制作的GAE RSS阅读器演示/原型,已经可以正常工作了 - 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>
1

我找到了一种解决这个问题的方法,不过我不确定这是不是最好的办法。

我没有使用Minidom,而是用了cElementTree来解析RSS源。我把每个“item”标签及其子标签放在一个单独的任务中,然后把这些任务添加到任务队列里。

这样做让我避免了DeadlineExceededError的错误。不过,我收到了“这个资源使用了很多CPU资源”的警告。

有没有办法可以避免这个警告呢?

A_iyer

6

这不应该花那么长时间。下面是你可以如何使用通用提要解析器的方法。

# 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

文档里会告诉你如何从提要中提取其他内容。如果你有具体的问题,请把详细情况发出来。

撰写回答