使用谷歌应用引擎的RSS聚合器 - Python
我正在尝试建立一个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
文档里会告诉你如何从提要中提取其他内容。如果你有具体的问题,请把详细情况发出来。