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

Coleta Massiva de Dados

Felipe cruz
November 06, 2014

Coleta Massiva de Dados

Palestra sobre como montar uma solução simples e escalável para coletar dados usando como exemplo coletores de preços de passagens aéreas.

Felipe cruz

November 06, 2014
Tweet

More Decks by Felipe cruz

Other Decks in Programming

Transcript

  1. Agenda • O#que#é? • Perguntas#iniciais# • Etapas • Técnicas •

    Solução#escalável Domínio'Público,'2014 4
  2. >>> from voe import producer >>> producer.get_tasks() ['gol SDU CGH',

    'gol SDU REC', 'gol SDU POA', 'gol SDU BSB', 'gol SDU CNF', 'gol CGH REC', 'gol CGH POA', 'gol CGH BSB', 'gol CGH CNF', 'gol GRU REC', 'gol GRU POA', 'gol GRU BSB', 'gol GRU CNF', 'gol REC POA', 'gol REC BSB', 'gol REC CNF', 'gol POA BSB', 'gol POA CNF', 'gol BSB CNF', 'azul SDU GRU', 'azul SDU POA', 'azul SDU REC', 'azul SDU CNF', 'azul SDU CWB', 'azul GRU POA', 'azul GRU REC', 'azul GRU CNF', 'azul GRU CWB', 'azul POA REC', 'azul POA CNF', 'azul POA CWB', 'azul REC CNF', 'azul REC CWB', 'azul CNF CWB'] Domínio'Público,'2014 24
  3. context = zmq.Context() push = context.socket(zmq.PUSH) push.bind('tcp://127.0.0.1:1313') sync = context.socket(zmq.DEALER)

    sync.bind('tcp://127.0.0.1:13131') tasks = producer.get_tasks() Domínio'Público,'2014 27
  4. def distribute_tasks(tasks): for task in itertools.cycle(tasks): ready = sync.recv() print("Sent

    {}".format(task)) push.send(task) time.sleep(1) distribute_tasks(tasks) Domínio'Público,'2014 28
  5. import zmq context = zmq.Context() pull = context.socket(zmq.PULL) pull.connect('tcp://127.0.0.1:1313') sync

    = context.socket(zmq.DEALER) sync.connect('tcp://127.0.0.1:13131') Domínio'Público,'2014 36
  6. while True: sync.send('ready') data = pull.recv() print("Client {} recived {}".format(s,

    data)) handle(data) # illustrative Domínio'Público,'2014 37
  7. Detalhes(da(tarefa • De$onde$obter$a$informação? • Páginas(Web • Qual$o$5po$de$fonte$de$dados?$ • HTML/Texto •

    Como$obter$a$informação?$ • Xpath(+(Javascript((Selenium) Domínio'Público,'2014 39
  8. Selenium(+(Xpath xpath_exp = '//div[@class="sliderDates sliderGoing"]/ul[@class="listDates"]/li' els = browser.find_elements_by_xpath(xpath_exp) departure_result =

    [] for el in els: price = get_price(el.text) date = parse_date(get_date(el.text)) prices.append(dict(price=price, date=date)) Domínio'Público,'2014 43
  9. Selenium(+(Javascript script = """ var prices = []; $('#GoingPrices ul.tabset

    li').each(function(i, el) { var date = $(el).find('span').text(); var price = $(el).find('div').text(); prices.push({'date': date, 'price': price}); }); return prices; """ prices = executer(script) Domínio'Público,'2014 44
  10. Stack&Python • Paramiko • Boto • Supervisor • Pyzmq •

    Selenium6(específico) • PyVirtualDisplay6(específico) Domínio'Público,'2014 49