Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Raspagem de Dados com Ruby

Duke
October 21, 2012

Raspagem de Dados com Ruby

Apresentação na UNIFEI - Universidade Federal de Itajuba onde falei sobre Raspagem de Dados com Ruby

Duke

October 21, 2012
Tweet

More Decks by Duke

Other Decks in Programming

Transcript

  1. Raspagem de dados

  2. Duke

  3. Duke github.com/dukex twitter.com/_dukex github : twitter : duke.vertigem.xxx blog* :

  4. Raspagem de dados

  5. THacker

  6. groups.google.com/group/thackday THacker

  7. @PROJdeLei

  8. @PROJdeLei github.com/dukex/projdelei github : twitter.com/PROJdeLei twitter :

  9. @PROJdeLei github.com/dukex/projdelei github : twitter.com/PROJdeLei twitter :

  10. Ruby?

  11. Ruby? Por que resolve BEM os meus problemas

  12. Nokogiri (ڒ) LibXML Hpricot

  13. Nokogiri (ڒ) LibXML scraperwiki.com/docs/ruby/ruby_libraries Hpricot

  14. Beautiful Soup lxml Scrapy

  15. Beautiful Soup lxml scraperwiki.com/docs/python/python_libraries Scrapy

  16. Simple HTML DOM YQL*

  17. Simple HTML DOM YQL* scraperwiki.com/docs/php/php_libraries

  18. Javascript?!?!

  19. ReactiveScraper Javascript?!?! github.com/OKFN-BR/reactive_scraper

  20. var parser = function(i, tr){ var item = $(tr) ,

    hour = item.find("td:eq(0)").text() , title = item.find("td:eq(1)").text(); document.save({ hour : hour, title : title }); }; $(".table-striped tbody tr").each(parser);
  21. Nokogiri (ڒ)

  22. Nokogiri (ڒ) Extensão em C Buscas em XPath ou CSS3

    selectors
  23. parser = Nokogiri::HTML(wewebconf_html) parser.search(".table-striped tbody tr").each do |tr| hour =

    tr.find("td:eq(0)") title = tr.find("td:eq(0)") ... end
  24. ScraperWiki

  25. ScraperWiki Web Plataforma Ruby, Python e PHP

  26. scraperwiki.com/scrapers/funk_download

  27. def download_funk(category) target = "#{BASE_URL}?cat=#{category}" music_index_parser = parser(target) music_index_parser.search(".download-funk").each do

    |parser_musica| begin music_show_link = parser_musica.search("a")[0].attr("href") music_show_parser = parser("#{BASE_URL}#{music_show_link}") music_info = music_show_parser.search("#interna_a") name = music_info.search("h2").text() link = music_info.search(".texto a").attr("href") download = parser_musica.search(".contador").text() date = parser_musica.search(".data").text() ScraperWiki.save(["name"], ....) rescue next end end end
  28. scraperwiki.com/profiles/emersonvinicius scraperwiki.com/tags

  29. Testes (BDD)

  30. Testes (BDD) Rspec Webmock

  31. @PROJdeLei github.com/dukex/projdelei/blob/master/spec/lib/ scraper_spec.rb

  32. class Beco203Bot < AugustaBot def create_parties! end private def parties

    parser(".agenda-item.beco-sp", "capa-beco-sp.php") end end class Beco203PartyBot < AugustaPartyBot def name end end
  33. require 'spec_helper' describe Beco203Bot do let(:beco_bot) { Beco203Bot.new } describe

    "create_parties!" do before do ...{stub_requests}... end it "saves a parties with name" do beco_bot.create_parties! Party.first.name.should == 'Festa 1' end end end
  34. class Beco203Bot < AugustaBot def create_parties! parties.each do |item| party_bot

    = Beco203PartyBot.new({params}) party_bot.name =(item/".texto").text Party.create! party_bot.attributes end end private def parties parser(".agenda-item.beco-sp", "capa-beco-sp.php") end end class Beco203PartyBot < AugustaPartyBot def name parser.search(".conteudo-interna h1").text.clean end end
  35. Redistribuir

  36. Redistribuir APIs REST

  37. None
  38. github.com/vertigem/api_metrosp api.metrosp.vertigem.xxx/lines.json

  39. None
  40. github.com/vertigem/api_camara

  41. github.com/vertigem/api_camara api.camara.vertigem.xxx

  42. None
  43. thedatahub.org

  44. Criar Valor

  45. Criar Valor Cruzamentos Visualizações Etc

  46. scraperwiki.com/scrapers/augusta

  47. augustaapp.com

  48. Criar Valor Cruzamentos Visualizações Etc

  49. datajournalism.stanford.edu

  50. Criar Valor Cruzamentos Visualizações Etc

  51. Qual era o preço médio uma casa no São Paulo

    em 1921? Que balada vai acontecer hoje na Rua Augusta? Dados para responder muitas, muitas perguntas como essas estão por aí na Internet em algum lugar - mas nem sempre é fácil encontrar. - Hackeado do thedatahub.org
  52. Obrigado!

  53. Obrigado! github.com/dukex github.com/vertigem

  54. Perguntas?

  55. Obrigado!