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

Maintaining 200+ spiders and still having time to sleep

Maintaining 200+ spiders and still having time to sleep

O Jusbrasil lida diariamente com milhares de documentos públicos. O volume de documentos extraídos é trabalho de inúmeros spiders que constantemente acessam a Surface e Deep Web em busca de novos artefatos. Nessa palestra discutiremos como o projeto de Notícias foi estruturado para lidar com o grande volume de dados e aproximadamente 200 spiders em execução.

6dbafc7a4ba86959b02c97995bf7be70?s=128

Victor Martinez

December 02, 2016
Tweet

Transcript

  1. sleep and still having time to Maintaining 200+ by Victor

    "Frodo" Martinez crawlers
  2. vcrmartinez twitte r email blog Victor Frodo Martinez Software Developer

    vcrmartinez@gmail.com victormartinez.github.io
  3. None
  4. None
  5. Informação Pessoas Advogados

  6. JUSTICE GAP ?

  7. A Jusbrasil tem revolucionado o acesso a informação jurídica

  8. Páginas de D.O. Jurisprudências Notícias Leis 128 mi 23 mi

    7 mi 975 K 160 mi documentos
  9. Crawler Team

  10. Jurisprudências Diários Oficiais Legislações Notícias ~200 3 ~180 ~105

  11. None
  12. notícias extraídas/ mês 200K 17K notícias persistidas/ mês

  13. notícias extraídas/ dia 7K 700 notícias persistidas/ dia

  14. sleep and still having time to Maintaining 200+ crawlers

  15. None
  16. 2 Testes e Integração 1 Spiders 3 Execução 4 Persistência

  17. 2 Testes e Integração 1 Spiders 3 Execução 4 Persistência

    Métricas Monitorament o
  18. NewsPipeline Scrapinghub item 1 item 2 item 4 item 5

    item 3 item n Jusbrasil Network tests build Spiders 1 2 3 4 5 Monitoramento Métricas
  19. 1Spiders

  20. Framework Open Source e colaborativo para extração de dados de

    websites de forma rápida, simples e extensível. scrapy.or g
  21. None
  22. Spiders Itens Downloader Item Pipeline

  23. semcomp/ ├── scrapy.cfg └── semcomp/ ├── __init__.py ├── items.py ├──

    pipelines.py ├── settings.py └── spiders/ └── __init__.py $ scrapy startproject <project_name> $ scrapy startproject semcomp
  24. None
  25. Pipelines are AWESOME

  26. Verifique Duplicidade

  27. Salve no MongoDB

  28. Concurrent Requests Enable/Disable Cookie Default Request Headers Autothrottle Spider Middlewares

    Downloader Middlewares …
  29. 2Testes e Integração

  30. Como enviar esse código para produção?

  31. $ git push origin master Build and Push $ docker-compose

    -f docker-compose-test.yml rm 1 2 $ git pull 3 unit regression 4 $ docker-compose -f docker-compose-deploy up
  32. Unit and Regression Tests

  33. 3Execução

  34. None
  35. None
  36. None
  37. None
  38. None
  39. Scrapinghub Command Line Client $ shub login $ shub deploy

    projects: default: 12345 prod: 33333 apikeys: default: 0bbf4f0f691e0d9378ae00ca7bcf7f0c scrapinghub.yml https://doc.scrapinghub.com/shub.htm l
  40. scrapinghub/python-s crapinghub

  41. >>> from scrapinghub import Connection >>> conn = Connection('1q2w3e4r54t56ydy87u89u8') >>>

    conn Connection('1q2w3e4r54t56ydy87u89u8')
  42. >>> from scrapinghub import Connection >>> conn = Connection('1q2w3e4r54t56ydy87u89u8') >>>

    conn Connection('1q2w3e4r54t56ydy87u89u8') >>> conn.project_ids() [123, 456]
  43. >>> from scrapinghub import Connection >>> conn = Connection('1q2w3e4r54t56ydy87u89u8') >>>

    conn Connection('1q2w3e4r54t56ydy87u89u8') >>> conn.project_ids() [123, 456] >>> project = conn[123] >>> job = project.job(u'123/1/2')
  44. >>> from scrapinghub import Connection >>> conn = Connection('1q2w3e4r54t56ydy87u89u8') >>>

    conn Connection('1q2w3e4r54t56ydy87u89u8') >>> conn.project_ids() [123, 456] >>> for item in job.items(): ... # do something with item (it's just a dict) >>> for logitem in job.log(): ... # logitem is a dict with logLevel, message, time >>> project = conn[123] >>> job = project.job(u'123/1/2')
  45. https://doc.scrapinghub.com/api/over view.html Scrapinghub API

  46. $ curl -u APIKEY: https://storage.scrapinghub.com/items/53/34/7 $ curl -u APIKEY: https://storage.scrapinghub.com/items/53

    Todos os itens de um Job Todos os itens de um Projeto
  47. unlimited team members unlimited projects unlimited requests 24 hour max

    job run time 1 concurrent crawl 7 day data retention no credit card required 0 CLOUD-BASED CRAWLING. FREE $
  48. None
  49. 4Persistência

  50. NewsPipeline Scrapinghub item 1 item 2 item 4 item 5

    item 3 item n Jusbrasil Network
  51. Extração Consumo Consulta Persistência

  52. http://docs.celeryproject.org/en/latest/index.ht ml

  53. Task?

  54. Tasks! Consumo Consulta Persistência

  55. Celery RabbitMQ Envia Mensagem (Task) Worker s Pegam Tasks Envia

    resultado Obtém Resultado Message Broker Backend
  56. NewsPipeline Scrapinghub item 1 item 2 item 4 item 5

    item 3 item n Jusbrasil Network
  57. Primitivas : chain group chord map & startmap chunks

  58. Métricas

  59. None
  60. SÉRIE TEMPORAL ?

  61. time measurement field (key-value string) tag(s) 2015-10-21T19:28:07.580664347 Z cpu region=us_west

    value=0.64
  62. TEMP O

  63. None
  64. Monitoramento

  65. Status dos Crawlers

  66. Frequência de publicação

  67. O que aprendemos até aqui

  68. Adote a tecnologia que atende ao seu problema. 1

  69. Métricas são importantes! 2

  70. Monitore! Sempre! 3

  71. Estabeleça prioridades 4

  72. Entenda os impactos 5

  73. DRY Don’t Repeat Yourself 6

  74. Pense em mudanças de layout 7

  75. Crie um processo de validação 8

  76. Seja realista! Seu crawler vai quebrar em algum momento 9

  77. 10 Have Fun!

  78. Obrigado! Victor Frodo Martinez Software Developer vcrmartinez vcrmartinez@gmail.com victormartinez.github.io