【问题标题】:How can i make this code run smoothly on google app engine?我怎样才能让这段代码在谷歌应用引擎上顺利运行?
【发布时间】:2011-08-08 08:35:12
【问题描述】:

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

谷歌说:

CPU 时间以“秒”为单位报​​告,这相当于 CPU 周期数 可以在这段时间内由 1.2 GHz Intel x86 处理器执行。实际上 花费的 CPU 周期数会因 App Engine 内部条件的不同而有很大差异, 所以这个数字是为了报告的目的而调整的,使用这个处理器作为参考 测量。

 每日最高费率
CPU 时间 6.5 CPU 小时 15 CPU 分钟/分钟

我想知道的:

此脚本是否超出限制?

(如果是)我怎样才能让它不超过限制?

我使用 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)

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

更新:

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

 每个周期总计
阿尔法:1 1
测试版:16 16
伽玛:~250 ~4000
增量:~6 ~24000

【问题讨论】:

  • @Jon 使用 Regex 解析 HTML 在 Stack Overflow 上是一种罪过。
  • 这些不是“限制”,它们是您免费获得的。如果你想运行任何使用大量 CPU 的东西,你将不得不为你的应用程序付费,就像任何其他主机一样。
  • @systempuntoout 哎呀,应该怎么做?
  • 别担心,我也用 Regex 编写了许多快速而肮脏的 python 爬虫。 Beautifulsoup 是正确解析和处理 Html 的一种可能方式。
  • @systempuntoout 为什么他们这么糟糕?

标签: python google-app-engine


【解决方案1】:

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

AppEngine 生产服务器上的 urllib URLFetch API

【讨论】:

  • 好的,问题已经解决了一半,你知道我如何(如果我需要的话)将它分成几部分,使其保持在免费限制内。
  • 不,它是 URLFetch API 的包装器。
【解决方案2】:

我不喜欢在需要之前进行优化。首先,只是尝试一下。它可能只是工作。如果你超出配额,耸耸肩,明天再来。

要将作业拆分为更小的部分,请查看Task Queue API。也许您可以将工作负载分为两个队列,一个用于抓取页面,一个用于处理页面。您可以对队列设置限制以控制它们的运行速度。

附注关于 HTML 的正则表达式:做有效的事。学者们会就语义正确性对你提出质疑,但如果它对你有用,不要让它阻止你。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2019-01-06
      相关资源
      最近更新 更多