Web Scraping

Este post esta basado en http://aleatory.clientsideweb.net/2012/08/16/financial-charts-app-engine-tutorial-web-scraping/.

Y busca llenar los vacíos que tuve al hacer el tutorial

Soy un desarrollador de c# tratando de aprender python (Por si se encuentra alguna burrada extrema y este es mi repositorio de código que no necesariamente quiere o desea ser un blog técnico solo es un backup de mis ejercicios).

El código de este ejercicio se encuentra en: http://sdrv.ms/1bxr7uQ

se podria descargar y hacer directamente deploy hacia el engine cambiando solamente

image

El nombre en el application por el que tengamos en el engine.

Lo que se busca es hacer una app que este sobre app engine y cada cierto tiempo sondee una pagina web y extraiga información de una etiqueta HTML de la misma pagina

Se asume que ya sabes montar una App en el engine.

Se conoce el uso de los archivos de configuración como  app.yaml

No se busca copiar el tutorial si no llenar algunos vacío existentes en el mismo

Se crea una clase que nos servirá como modelo de datos

from google.appengine.ext import db

class Fixing(db.Model):
    timestamp = db.DateTimeProperty()
    instrument = db.StringProperty()
    bips = db.FloatProperty()

Se debe crear un archivo cron.py

import logging
from datetime import datetime
from urllib2 import urlopen
from lxml.cssselect import CSSSelector
from google.appengine.ext.webapp.util import run_wsgi_app
import webapp2
from lxml.html import parse

from data import Fixing


class MainHandler(webapp2.RequestHandler):
    def get(self):

        url = 'http://www.euribor-ebf.eu/eoniaswap-org/about-eoniaswap.html'
        page = urlopen(url)
        doc = parse(page).getroot()
        target = doc.cssselect('#todayRates li')
        list_item = '3m'
        surrounding_text = ['3m','(']
        for item in target:
            if list_item in item.text_content().strip():
                tmp = item.text_content().strip()
                eonia_3m = tmp[tmp.index(surrounding_text[0])+len(surrounding_text[0]):tmp.index(surrounding_text[1])].strip()

        if eonia_3m is None:
            logging.info('BREAK: %s' % (url))

        Fixing(timestamp=datetime.utcnow(),instrument="eonia_3m", bips=float(eonia_3m)).put()


app = webapp2.WSGIApplication([('/tasks/fixing', MainHandler)],
                                  debug=True)

if __name__ == '__main__':
         run_wsgi_app(app)

 

un archivo cron.yaml en donde se define la periodicidad con la que se “scrapea” la pagina

 

cron:
- description: daily fixing collection
  url: /tasks/fixing
  schedule: every 15 mins

 

y el archivo de configuracion de python

application: hefesoftscrapper
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: /tasks/fixing
  script: cron.app

- url: /.*
  script: main.app

libraries:
- name: webapp2
  version: "2.5.2"

- name: lxml
  version: latest

 

En el archivo cron.py se define la url que se va a seguir

url = ‘http://www.euribor-ebf.eu/eoniaswap-org/about-eoniaswap.html’
      page = urlopen(url)

y se itera y se inserta

for item in target:
       if list_item in item.text_content().strip():
           tmp = item.text_content().strip()
           eonia_3m = tmp[tmp.index(surrounding_text[0])+len(surrounding_text[0]):tmp.index(surrounding_text[1])].strip()

   if eonia_3m is None:
       logging.info(‘BREAK: %s’ % (url))

   Fixing(timestamp=datetime.utcnow(),instrument=”eonia_3m”, bips=float(eonia_3m)).put()

 

Problemas encontrados

Se hace uso de una libreria llamada: lxml. Esta hay que buscar e instalarla.

http://www.lfd.uci.edu/~gohlke/pythonlibs/xiv7sia7/lxml-3.2.3.win32-py2.7.exe

Mas sin embargo para que funcione a nivel local necesita instalarse

https://pypi.python.org/packages/2.7/s/setuptools/setuptools-0.6c11.win32-py2.7.exe

Que es un gestor de paquetes para python, luego de descargado e instalado vamos al cmd y

image

al cabo de la instalación veremos como los import funcionan correctamente

image

si vemos el archivo cron.yaml

image

vemos como la app correra cada 15 minutos

En el dashboard del store del engine se ven los registros que se insertan cada 15 minutos

image

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: