如何在Google应用引擎上顺利运行此代码?

时间:2011-04-19 03:49:11

标签: python google-app-engine

我是网络应用程序的新手,所以我不习惯担心CPU限制,但我看起来我会遇到这个代码的问题。我在google的配额页面中读到,我每天可以使用6.5 CPU小时,每分钟15 CPU,分钟。

谷歌说:

  

CPU时间以“秒”报告,相当于CPU周期数   可以在这段时间内通过1.2 GHz Intel x86处理器执行。实际上   根据App Engine内部的条件,花费的CPU周期数会有很大差异,   因此,使用此处理器作为参考,此数字会根据报告进行调整   测量

            Per Day          Max Rate
CPU Time    6.5 CPU-hours    15 CPU-minutes/minute

我想知道的事情:

此脚本是否超出限制?

(如果是)我如何才能超越限制?

我使用urllib库,我应该使用Google的URL Fetch API吗?为什么呢?

绝对是任何其他有用的评论。

它的作用:

它刮擦(爬行)项目免费电视。我只会完全运行它,然后用更短的更快的脚本替换它。

from urllib import urlopen
import re

alphaUrl = 'http://www.free-tv-video-online.me/movies/'
alphaPage = urlopen(alphaUrl).read()
patFinderAlpha = re.compile('<td width="97%" nowrap="true" class="mnlcategorylist"><a href="(.*)">')
findPatAlpha = re.findall(patFinderAlpha,alphaPage)
listIteratorAlpha = []
listIteratorAlpha[:] = range(len(findPatAlpha))
for ai in listIteratorAlpha:
    betaUrl = 'http://www.free-tv-video-online.me/movies/' + findPatAlpha[ai] + '/'
    betaPage = urlopen(betaUrl).read()
    patFinderBeta = re.compile('<td width="97%" class="mnlcategorylist"><a href="(.*)">')
    findPatBeta = re.findall(patFinderBeta,betaPage)
    listIteratorBeta = []
    listIteratorBeta[:] = range(len(findPatBeta))
    for bi in listIteratorBeta:
        gammaUrl = betaUrl + findPatBeta[bi]
        gammaPage = urlopen(gammaUrl).read()
        patFinderGamma = re.compile('<a href="(.*)" target="_blank" class="mnllinklist">')
        findPatGamma = re.findall(patFinderGamma,gammaPage)
        patFinderGamma2 = re.compile('<meta name="keywords"content="(.*)">')
        findPatGamma2 = re.findall(patFinderGamma2,gammaPage)
        listIteratorGamma = []
        listIteratorGamma[:] = range(len(findPatGamma))
        for gi in listIteratorGamma:
            deltaUrl = findPatGamma[gi]
            deltaPage = urlopen(deltaUrl).read()
            patFinderDelta = re.compile("<iframe id='hmovie' .* src='(.*)' .*></iframe>")
            findPatDelta = re.findall(patFinderDelta,deltaPage)
            PutData( findPatGamma2[gi], findPatAlpha[ai], findPatDelt)

如果我忘了什么,请告诉我。

更新

这是关于它将运行多少次以及为什么这有助于回答这个问题。

       per cycle      total
Alpha: 1              1
Beta:  16             16
Gamma: ~250           ~4000
Delta: ~6             ~24000

3 个答案:

答案 0 :(得分:2)

我不喜欢优化,直到我需要。首先,试试吧。它可能只是工作。如果你超过配额,耸肩,明天再来。

要将作业拆分为较小的部分,请查看Task Queue API。也许您可以将工作负载分成两个队列,一个用于擦除页面,另一个用于处理页面。您可以对队列设置限制,以控制它们的运行方式。

P.S。在HTML的正则表达式:做什么有效。学者们会在语义正确性上打电话给你,但如果它适合你,不要让那些阻止你。

答案 1 :(得分:1)

  

我使用urllib库,我应该使用Google的URL Fetch API吗?为什么呢?

AppEngine生产服务器上的 urlib :URLFetch API

答案 2 :(得分:0)

这不太可能超过免费限制,但如果不知道需要获取的URL列表有多大,以及生成的页面有多大,就不可能说出来。确切知道的唯一方法就是运行它 - 这样做真的没什么坏处。

您更有可能遇到单个请求执行的限制 - 前端请求为30秒,后续请求(如cron作业为10分钟) - 而不是超出配额。要解决这些问题,请使用Task Queue API将您的工作分成许多部分。作为额外的好处,它们可以并行运行!您可能还想查看Asynchronous URLFetch - 尽管如果这只是一次性脚本,它可能不值得。