在RequestHandler的子类中,我尝试获取URL的范围:
class GetStats(webapp2.RequestHandler):
def post(self):
lastpage = 50
for page in range(1, lastpage):
tmpurl = url + str(page)
response = urllib2.urlopen(tmpurl, timeout=5)
html = response.read()
# some parsing html
heap.append(result_of_parsing)
self.response.write(heap)
但它可以使用30个url(页面加载很长,但它是有效的)。 如果超过30,我会收到一个错误:
错误:服务器错误
服务器遇到错误,无法完成您的请求。
请在30秒后重试。
有没有办法获取大量的网址?可能是更优的还是smth? 多达几百页?在
更新:
我用BeautifulSoup来解析每一页。我在gae日志中找到了这个回溯:
^{pr2}$
编辑: 可能来自于附加的配额和限制。 很抱歉之前的回答:
因为这看起来像是服务器的保护,以避免ddos或从一个客户端报废。你几乎没有选择:
在一定数量的查询之间等待,然后继续。
从多个具有不同IP地址的客户机发出请求并将信息发送回主脚本(为此租用不同的服务器可能会很昂贵…)。
你也可以观察网站是否作为api访问你需要的数据。
你也应该小心,因为如果店主认为你的请求不好,他会封锁/黑名单你的IP。在
它失败了,因为你只有60秒的时间向用户返回一个响应,我猜这需要更长的时间。在
您将要使用这个:https://cloud.google.com/appengine/articles/deferred
创建有10分钟超时的任务。然后,您可以立即返回给用户,他们可以在稍后通过另一个处理程序(您创建的)来“获取”结果。如果收集所有的网址需要10分钟以上的时间,你将不得不把它们分成更多的任务。在
看这个:https://cloud.google.com/appengine/articles/deadlineexceedederrors
去理解为什么你不能超过60秒。在
相关问题 更多 >
编程相关推荐