2009-11-27 9 views
2

내가 가지고 내가이 스크립트를 최적화 할 수있는 가장 좋은 방법 일 것입니다 무슨 궁금 오전 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'] 

답변

4

Divide and conquer입니다.

  1. 작업 목록
  2. 대기열로 작업을 추가 (예 : URL은/구문 분석을 긁어) 확인 (appengine taskqueue api, amazon sqs를, ...)
+0

+1 나누기와 정복을위한 전략 : 놓칠 수 없음! – jldupont

+0

하나의 URL에서 긁어 모으고 있습니다. 스크래핑되는 것은 300 개가 넘는 옵션 목록입니다. 그래서 만약 내가 그것을 두 가지 일이 될 수있는 일로 나눈다면. 나는 긁어 모으기위한 것과 삽입을위한 하나를 추측하고있다. 할당량 제한을 초과하지 않고도이 작업을 수행 할 수 있습니까? 또는 다른 방법으로 최적화 할 수 있습니다. 여기 멍청한 멍청한 녀석이 내게 곰이 되라. –

+0

붙여 넣은 코드에서 for 루프 내부에서 반복되는 요청을하고있다. 그래서 하나의 페치가 아니다. –

2

우선

  • 프로세스 대기열 App Engine 데이터 저장소를 직접 사용하도록 스크립트를 다시 작성해야합니다. 데이터를 데이터 저장소에 삽입하기 위해 HTTP 요청 (항목 당 2 개!)을 사용하고 있기 때문에 지출하는 시간의 상당 부분은 의심의 여지가 없습니다. batch puts과 함께 데이터 저장소를 직접 사용하면 런타임에서 두 배의 주문을 줄여야합니다.

    구문 분석 코드가 너무 느리다면 작업을 청크로 자르고 task queue API을 사용하여 여러 요청에서 작업을 수행 할 수 있습니다.

  • 1

    하이있어서 토시하고 닉은 내가

    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) 
    

    내가 바른 길에 나는 다음과 같은 설정 스크립트를 수정? 또한 나는 정말 일주일에 한 번) 어떻게 그것을 할 수있는 가장 좋은 방법이 될 것이라고 일정에 호출하는 방법을 모르겠어요?

    답장을 보내 주셔서 감사합니다.

    +0

    앱 엔진의 cron 서비스를 살펴볼 수 있습니다. http://code.google.com/appengine/docs/python/config/cron.html – tosh