Делаем mash-up приложение на трэндах

Разделы

Показаны сообщения с ярлыком bottle. Показать все сообщения
Показаны сообщения с ярлыком bottle. Показать все сообщения

суббота, 21 мая 2011 г.

Певая страница

Настало время создать первую страницу, по формату которой будет большая часть этого сайтега. Это будет скорей такая косметическая работа, т.к. данные уже более или менее для этого есть. Вообщем главная страница полегчала, а каждый тренд доступен по ссылке с новостями и видео. В коде ничего нового не добавилось, исключительно копипэйст. После этого можно смело подвести черту успешно выполненной подготовительной работы.

Но что б статья не была совсем уж голой, я скажу два слова о шаблонах. После того как вчера была проделана огромная работа по адаптации архитектуры к App Engine. Под вечер провозился с глупой ошибкой в шаблоне, в связи с этим перелопатил все доступные шаблоны. Я пользуюсь стандартным из Bottle и на нём пока останусь. Интересным из всех показался только Mako. Не смотря на обилие файлов в библиотеке по скорости он не уступает стандартному (но всё равно это гораздо медленней чем чистый питон), а возможности у него сопоставимы с самим языком. т.е. он фактически обеспечивает прозрачность HTML-кода для питона. И прям в HTML объявлять функции, обрабатывать переменные. Вообщем, при разработке большого проекта вещь вполне достойная.

четверг, 19 мая 2011 г.

День третий

Тренды гугл обновляет каждый час, поэтому нечего туда каждый раз лазить и парсить, а сделать это надо через крон и сохранить в "хранилище". Для этого сначала надо разобраться как там устроен крон.
Крон там работает по схеме HTTP запросов методом GET по указанному вами адресу. Для этого создаётся ещё один yaml-файлик:
Листинг cron.yaml:
cron:
- description: hourly trends update
  url: /tasks/trends_update
  schedule: every 1 hours
Теперь надо добавить обработчик этого адреса в скрипт 'main.py'. А что б его не мог запускать кто попало, перед перенаправленеим на основной скрипт в 'app.yaml' указываем что обращаться по адресу можно только с правами админа.

Листинг 'app.yaml':
application: trendstat
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: /(.*\.(gif|png|jpg))
  static_files: static/\1
  upload: static/(.*\.(gif|png|jpg))

- url: /tasks/trends_update
  script: main.py
  login: admin

- url: /robots.txt
  static_files: static/robots.txt
  upload: static/robots.txt

- url: /.*
  script: main.py

среда, 18 мая 2011 г.

Парсим тренды

Думаю настало время с чего-то начать. Начнём пожалуй с самого просто - тупо спарсим тренды, которые удобно располагаются прямо в атоме. Гугл по этому поводу надеюсь не растроится, что его немного отпарсили, всё таки на то он и атом. Насчёт удобно это я скорей загнул, т.к. с атомом не работал ни разу. И в данный момент пытаюсь с помощью поиска разрешить философский вопрос: как в GAE принято, писать заново, или попробовать найти библиотеку.

Вообщем 10 минут поиска меня убедили что здесь принято делать большую часть работы самому а не ждать помощи от библиотек. Собственно как оказалось это 2 строчки кода, но об этом ниже.

Итак, как выглядит приложение в Google App Engine? Это как минимум 3 файла: 'app.yaml', 'index.yaml' и приложение 'main.py'. Гугл на своё усмотрение предлагает использовать либо свою разработку в плане фреймворка, либо любой который работает с WSGI - что я и сделал. Сразу же взял Bottle. Таким образом приложение представляет из себя следующий список:

[trendec@localhost trendstat]$ ls -al
total 248
drwxrwxr-x 4 trendec trendec   4096 May 18 20:11 .
drwxr-xr-x 9 trendec trendec   4096 May 17 23:21 ..
-rw-r----- 1 trendec trendec    142 May 18 19:47 app.yaml
-rwxr-xr-x 1 trendec trendec  98154 May 14 00:26 bottle.py
-rw-r--r-- 1 trendec trendec 114796 May 18 19:47 bottle.pyc
-rw-r----- 1 trendec trendec    471 May 18 20:03 index.yaml
-rwxr-x--- 1 trendec trendec    818 May 18 20:03 main.py
drwxrwxr-x 2 trendec trendec   4096 May 18 19:16 static
drwxrwxr-x 2 trendec trendec   4096 May 18 19:16 views
В директории 'static' содержится файл стилей 'simple.css' и 'robots.txt' а в директории 'view' шаблон главной страницы.
Ниже приведу листинг файлов.
Файл 'main.py':
#!/usr/bin/env python
# encoding: utf-8

from bottle import route, run, view, request, redirect, response, post, abort, debug, error
from google.appengine.api import urlfetch
import re

debug(True)

@route('/')
@route('')
@view('home')
def home_view():
  trends = []
  trend_url = "http://www.google.com/trends/hottrends/atom/hourly"
  rl = re.compile("
  • .*?
  • ", re.I|re.S) rt = re.compile("<.*?>", re.I) res = urlfetch.fetch(trend_url) if res.status_code == 200: content = res.content trends = rl.findall(content) trends = [rt.sub("", t).strip() for t in trends] return {"trends" : trends } def main(): run(server='gae') if __name__ == '__main__': main()

    Файл 'app.yaml':
    application: trendstat
    version: 1
    runtime: python
    api_version: 1
    
    handlers:
    - url: /static
      static_dir: static
    
    - url: /(.*\.(gif|png|jpg))
      static_files: static/\1
      upload: static/(.*\.(gif|png|jpg))
    
    - url: /robots.txt
      static_files: static/robots.txt
      upload: static/robots.txt
    
    - url: /.*
      script: main.py

    Постоянные читатели

    Copyright © trendec. Технологии Blogger.