CodeandoMexico / los-scrapers

Recopilación de web scrapers para mejorar al gobierno (A collection of web-scrapers to extract government data)
12 stars 13 forks source link

Fetch all #5

Closed mondras closed 11 years ago

mondras commented 11 years ago

Extendí beisbol.rb para que ahora más información y también la saque de TODAS las dependencias. Tuve que agregar HTTParty para usar cookies, la razón por la que a veces servían las páginas y a veces no era que el server checaba la cookie así que tuve que hacer un pequeño hack pero ya podemos scrapear a gusto :)

Actualicé el Readme.MD con las cosas que creo hacen falta.

Modifiqué la estructura del proyecto para apegarse más a los estándares.

Creo también sería bueno también crearle clases y pruebas unitarias.

defvol commented 11 years ago
script/beisbol.rb:37: invalid multibyte char (US-ASCII)
script/beisbol.rb:37: syntax error, unexpected $end, expecting ')'
    fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
defvol commented 11 years ago

agregué encoding utf-8 para resolver el bug anterior

http://stackoverflow.com/questions/1739836/invalid-multibyte-char-us-ascii-with-rails-and-ruby-1-9

defvol commented 11 years ago

Ahora:

/Users/Rod/.rbenv/versions/1.9.3-p194/lib/ruby/1.9.1/open-uri.rb:35:in `initialize': No such file or directory - log/ifai.log (Errno::ENOENT)
defvol commented 11 years ago

¿Por qué moviste todo a la carpeta script? IMO, es mejor que cada script tenga su carpeta y su README.md específico

mondras commented 11 years ago

Podemos poner una carpeta por script pero tenerlas dentro de script le va a dar más orden si después generamos un modelo de datos y demás.

Al parecer el error del log es porque no hay una carpeta log jaja

Estaba corriendo el script con RUBYOPT=-Ku be ruby script/beisbol.rb para lo del UTF8

defvol commented 11 years ago

Agree sobre la carpeta /script, pero creo que vale la pena que cada script tenga su documentación (i.e. README.md)

El script debe crear el log file si no existe.

mondras commented 11 years ago

Crea el log file si no existe, lo que no crea es la carpeta. Deja la subo vacía y pongo los scripts en cada una de sus carpetas con su Readme.md

Carlos Mondragón

On Mon, Mar 18, 2013 at 8:13 AM, Rod Wilhelmy notifications@github.comwrote:

Agree sobre la carpeta /script, pero creo que vale la pena que cada script tenga su documentación (i.e. README.md)

El script debe crear el log file si no existe.

— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15060192 .

mondras commented 11 years ago

Como no vi documentación del curul pensé que no ibas a hacer un Readme.md por script

defvol commented 11 years ago

:+1:

aunque a veces truena si el response header viene vacío: script/ifai/beisbol.rb:38:in block in <main>': undefined method[]' for nil:NilClass (NoMethodError)

new_cookie = response.headers['set-cookie']
defvol commented 11 years ago

mmm, un if response.headers no lo resolvió, tal vez sea que Nokogiri no encuentra el div#info en una de las páginas

mondras commented 11 years ago

Sí, me suena más bien a que no contestó bien HTTParty, quizás habría que ponerle un next si no encuentra div#info ¿Te pasa siempre en la misma página?

defvol commented 11 years ago

creo que faltan validaciones en cada match

fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]

Si no hay match (i.e. nil) lanza la excepción de que no hay method [] para nil

defvol commented 11 years ago

un method_missing no nos caería nada mal

mondras commented 11 years ago

Yo creo que está bien que se levante la excepción porque implica que está malformada la información y debemos de cambiar el script, ¿no te late?

Carlos Mondragón

2013/3/18 Rod Wilhelmy notifications@github.com

creo que faltan validaciones en cada match

fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]

Si no hay match (i.e. nil) lanza la excepción de que no hay method [] para nil

— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15063316 .

defvol commented 11 years ago

el manejo de la excepción podría ser o también monkey patching

class String
  # siempre regresa al menos []
  def match_regex(regex)
  end
end
mondras commented 11 years ago

Mmm... Nos llenaríamos de datos basura con eso y no aplicaría para el propósito del script. ¿Truena muy seguido? A mí no me tronaba pero si ahorita está tronando estaría estaría bueno tener un retry/recovery strategy más bien.

defvol commented 11 years ago

agree, sería un rescue entonces

mondras commented 11 years ago

Y la pregunta es ¿qué hacemos en el rescue?

defvol commented 11 years ago

Este parche horrible me funcionó:

    begin
      monto = div.content.match(/monto de \$\s*(\d+([.,]\d+)*)/)[1]
      razon = div.css('a').first.content
      fecha = div.content.match(/realizó el (.*) con el proveedor/)[1]
      id    = div.content.match(/con clave (.*) con el objeto/)[1]
      dependencia = div.css('.tit-info').last.content
      proveedor   = div.content.match(/proveedor (.*) un /)[1]
      fecha.gsub!(' ', '')
      datos = { id:id, fecha: fecha, razon: razon, monto: monto,
                dependencia: dependencia, proveedor: proveedor}
      puts datos
      contratos << datos
    rescue NoMethodError
      puts "No puedo parsear el contenido del documento"
    end
mondras commented 11 years ago

Híjole, ¿pero ese no entiendo nos deja sin los datos no? Y eso no está chido.

defvol commented 11 years ago

si tronó el match es porque algo tiene el div#info diferente y de todos modos no podemos sacar los datos

mondras commented 11 years ago

¿No deberíamos de adaptarnos y sacar la info? ¿Puedes poner el div content cuando no entendió para analizarlo?

defvol commented 11 years ago

El div está aquí https://dl.dropbox.com/u/47709433/error.html

Lo capturé en el rescue

    rescue NoMethodError
      f = File.new('error.txt', 'w+')
      f.puts doc.css('div#info')
      f.close
    end

En teoría alguno de los matchers truena ahí

Creo que es en la 2da página, porque el output fue json, nomethoderror, otro json

mondras commented 11 years ago

Puse erorres más descriptivos que nos van a ayudar a mejorar la extracción de datos y también ahora saca la moneda del contrato PESOS, EUROS y así. Ya no truena :) ¿cómo lo ves?

defvol commented 11 years ago

:+1:

yeah! ya no truena, y camina... we got a crawler!

defvol commented 11 years ago

también veo que la fecha la sacas de 2 redacciones posibles... good, después con un poco más de OO hacemos un strategy pattern o algo más fancy y re-usable.

yo creo que este pull request debería entrar a master ya

mondras commented 11 years ago

De acuerdo! Pues dale! jaja

Carlos Mondragón

2013/3/18 Rod Wilhelmy notifications@github.com

también veo que la fecha la sacas de 2 redacciones posibles... good, después con un poco más de OO hacemos un strategy pattern o algo más fancy y re-usable.

yo creo que este pull request debería entrar a master ya

— Reply to this email directly or view it on GitHubhttps://github.com/CodeandoMexico/los-scrapers/pull/5#issuecomment-15081234 .