我正在尝试构建一个处理RSS Feed的GAE应用,并将Feed中的所有数据存储到Google Datastore中。我使用Minidom从RSS提要中提取内容。我也尝试使用Feedparser和BeautifulSoup,但它们对我不起作用。
我的应用目前正在解析Feed,并在我的本地计算机上大约25秒内将其保存在Google数据存储区中。我上传了应用程序,当我尝试使用它时,我收到了“DeadLine Exceeded Error”。
我想知道是否有任何可能的方法来加快这个过程?随着时间的推移,我使用的饲料最终将增长到超过100种。
答案 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>