оптимизация сценариев Python для движка приложений - PullRequest
2 голосов
/ 27 ноября 2009

У меня есть следующий скрипт, который я использую для сбора данных с моего универсайта и вставки в GAE Db

from mechanize import Browser
from BeautifulSoup import BeautifulSoup
import re
import datetime

__author__ = "Nash Rafeeq" 

url  = "http://webspace.apiit.edu.my/schedule/timetable.jsp"
viewurl  = "http://localhost:8000/timekeeper/intake/checkintake/"
inserturl = "http://localhost:8000/timekeeper/intake/addintake/"
print url
mech =  Browser()
try:
    page = mech.open(url)
    html = page.read()
except Exception, err:
    print str(err)
#print html 
soup = BeautifulSoup(html)
soup.prettify() 
tables  = soup.find('select')
for options in tables:
    intake = options.string
    #print intake
    try:
        #print viewurl+intake
        page = mech.open(viewurl+intake)
        html = page.read()
        print html
        if html=="Exist in database":
            print intake, " Exist in the database skiping"
        else:
            page = mech.open(inserturl+intake)
            html = page.read()
            print html
            if html=="Ok":
                print intake, "added to the database"
            else:
                print "Error adding ",  intake, " to database"
    except Exception, err:
        print str(err)

Мне интересно, как лучше всего оптимизировать этот скрипт, чтобы я мог запустить его на серверах ядра приложений. сейчас он собирает более 300 записей и занимает более 10 минут, чтобы вставить все данные на мой локальный компьютер

модель, которая используется для хранения данных:

class Intake(db.Model):
    intake=db.StringProperty(multiline=False, required=True)
    #@permerlink    
    def get_absolute_url(self):
        return "/timekeeper/%s/" % self.intake
    class Meta:
        db_table = "Intake"
        verbose_name_plural = "Intakes"
        ordering = ['intake']

Ответы [ 3 ]

4 голосов
/ 27 ноября 2009

Разделяй и властвуй .

  1. Составьте список задач (например, URL для очистки / разбора)
  2. Добавьте задачи в очередь ( appengine taskqueue api , amazon sqs ,…)
  3. Обработка вашей очереди
2 голосов
/ 27 ноября 2009

Первое, что вы должны сделать, это переписать ваш скрипт, чтобы напрямую использовать хранилище данных App Engine. Большая часть времени, которое вы тратите, несомненно, потому что вы используете HTTP-запросы (по два на запись!) Для вставки данных в ваше хранилище данных. Непосредственное использование хранилища данных с помощью пакетных операций должно сократить время выполнения на пару порядков.

Если ваш код синтаксического анализа все еще слишком медленный, вы можете разделить работу на куски и использовать API очереди задач для выполнения работы в нескольких запросах.

1 голос
/ 27 ноября 2009

привет, согласно Тошу и Нику. Я изменил скрипт как показано ниже

from google.appengine.api import urlfetch
from BeautifulSoup import BeautifulSoup
from timkeeper.models import Intake
from google.appengine.ext import db

__author__ = "Nash Rafeeq" 

url  = "http://webspace.apiit.edu.my/schedule/timetable.jsp"
try:
    page = urlfetch.fetch(url)
    #print html 
    soup = BeautifulSoup(page.content)
    soup.prettify() 
    tables  = soup.find('select')
    models=[]
    for options in tables:
        intake_code = options.string
        if Intake.all().filter('intake',intake_code).count()<1:
            data = Intake(intake=intake_code)
            models.append(data)
    try:
        if len(models)>0:
            db.put(models)
        else:
            pass 
    except Exception,err:
        pass
except Exception, err:
    print str(err)

я на правильном пути? также я не совсем уверен, как заставить это вызывать по расписанию (раз в неделю), что было бы лучшим способом сделать это?

и спасибо за оперативные ответы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...