#python #google-app-engine
#python #google-app-engine
Вопрос:
я новичок в веб-приложениях, поэтому не привык беспокоиться о ограничениях процессора, но, похоже, у меня возникнут проблемы с этим кодом. Я прочитал на странице квот Google, что я могу использовать 6,5 часов процессора в день при 15 минутах процессора в минуту.
Google Сказал:
Время процессора указывается в «секундах», что эквивалентно количеству циклов процессора, которые может выполнить процессор Intel x86 с частотой 1,2 ГГц за это время. Фактическое количество затраченных циклов процессора сильно варьируется в зависимости от внутренних условий App Engine, поэтому это число корректируется для целей отчетности с использованием этого процессора в качестве эталонного измерения.
И
Максимальная скорость в деньПроцессорное время 6,5 процессорных часов 15 процессорных минут /минута
Что я хочу знать:
Выходит ли этот скрипт за рамки допустимого?
(если да) Как я могу заставить его не превышать лимит?
Я использую библиотеку urllib, должен ли я использовать Google URL Fetch API? Почему?
Абсолютно любой другой полезный комментарий.
Что он делает:
Это царапает (ползает) проект free TV. Я полностью запущу его только один раз, а затем заменю его более коротким и быстрым скриптом.
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
Комментарии:
1. @Jon синтаксический анализ HTML с помощью регулярных выражений является грехом здесь, в Stack Overflow.
2. Это не «ограничения», это то, что вы получаете бесплатно. Если вы хотите запустить что-либо, использующее значительный процессор, вам придется заплатить за свое приложение, как и за любой другой хост.
3. @systempuntoout Ой, как это должно быть сделано?
4. Не волнуйтесь, я также закодировал множество быстрых и грязных скребков python с регулярными выражениями. Beautifulsoup — один из возможных способов правильного синтаксического анализа и обработки Html.
5. @systempuntoout Почему они такие плохие?
Ответ №1:
Я не люблю оптимизировать, пока мне это не понадобится. Сначала просто попробуйте. Это может просто сработать. Если вы превысите квоту, пожмите плечами, приходите завтра.
Чтобы разделить задания на более мелкие части, посмотрите на API очереди задач. Возможно, вы можете разделить рабочую нагрузку на две очереди: одну, которая очищает страницы, и другую, которая их обрабатывает. Вы можете установить ограничения на очереди, чтобы контролировать, насколько агрессивно они выполняются.
P.S. Для регулярных выражений для HTML: делайте то, что работает. Академики будут настаивать на семантической корректности, но если у вас это работает, пусть это вас не останавливает.
Ответ №2:
Я использую библиотеку urllib, должен ли я использовать API выборки URL от Google? Почему?
urlib на производственных серверах AppEngine является API UrlFetch
Комментарии:
1. Хорошо, это половина вопроса, у вас есть какие-нибудь идеи, как (если мне действительно нужно) я могу разделить его на части, чтобы он оставался в пределах свободного лимита.
2. Нет, это оболочка для API UrlFetch.
Ответ №3:
Маловероятно, что это превысит лимит бесплатного доступа, но невозможно сказать, не видя, насколько велик список URL-адресов, которые ему нужно получить, и насколько велики результирующие страницы. Единственный способ узнать наверняка — запустить его, и в этом действительно нет вреда.
Вы с большей вероятностью столкнетесь с ограничениями на выполнение отдельных запросов — 30 секунд для запросов внешнего интерфейса, 10 минут для внутренних запросов, таких как задания cron, — чем исчерпаете квоту. Чтобы устранить эти проблемы, используйте API очереди задач, чтобы разделить вашу работу на множество частей. В качестве дополнительного преимущества они могут выполняться параллельно! Возможно, вы также захотите изучить асинхронную выборку URL — хотя, вероятно, оно того не стоит, если это всего лишь одноразовый скрипт.