1 of 28

Scrapy

Un framework para el desarrollo ágil de arañas web

2 of 28

Web crawlers

Robots que recorren sitios web, partiendo de una lista de urls (seed urls), siguiendo los links encontrados y descargado las páginas para su posterior procesamiento

3 of 28

Web crawlers - Tipos

  • Genéricos
    • gran escala
    • motores de búsqueda
  • Enfocados
    • agregadores
    • comparación de productos

4 of 28

Web crawlers - Componentes

  • Downloader
    • politeness/parallelization policies
    • coordinación para evitar sobrecargar sitios
    • Extractor de links
    • DNS cache
  • Scheduler
    • que páginas visitar a continuación
    • que páginas re-visitar para descubrir cambios
    • Filtro de duplicados
  •  Storage
    • donde se almacen las páginas crawleadas
    • eficiente para procesamiento bulk secuencial

5 of 28

Web crawlers - Ejemplos

  • Genéricos
    • Apache Nutch
      • precursor de Hadoop
    • Heritrix
      • usado por Internet Archive
    • wget
      • simple
  • Enfocados
    • Mechanize
      • single-thread
    • Scrapy
      • concurrente

6 of 28

Web scrapers

Utilizados para extraer datos estructurados (ej: diccionarios) a partir de contenido no estructurado, o semi-estructurado (HTML)

7 of 28

Web scrapers - Tecnologías

  • Regular expressions
    • <h1>(.*?)</h1>
  • XPath
    • //h1
  • Generar un objeto del HTML (tipo DOM)
    • page.h1

8 of 28

Web scrapers - Ejemplos

  • lxml (XPath)
  • BeautifulSoup (objetos)
  • Scrapy (XPath)

9 of 28

Scrapy = Crawler + Scraper

10 of 28

Scrapy - Orígenes

  • Cuando:
    • 2007
  • Donde:
    • Mydeco (agregador de sitios de decoración de interior)
  • Requisitos:
    • poder escrapear 1000 sitios de forma eficiente
    • poder mantener el código de 1000 scrapers de forma productiva
    • Python
  • Alternativas evaluadas:
    • BeautifulSoup - muy verboso (demasiado código)
    • lxml - muy verde aún
    • mechanize - lento

11 of 28

Scrapy - Características generales

  • Simple, conciso
  • Extensible
    • Señales, middlewares
  • Rápido
    • IO asíncrona (twisted), parseo en C (libxml2)
  • Portable
    • Linux, Windows, Mac
  • Bien testeado
    • 778 unit-tests, 80% de cobertura
  • Bien hackeable
    • Pure Python
    • Código limpio (PEP-8) y desacoplado
  • Zen-friendly
  • Divertido!

12 of 28

Scrapy - Arquitectura

13 of 28

Scrapy - Spiders

  • Definen como escrapear un sitio puntual

  • Reglas de crawleo
    • que links seguir
  • Reglas de extracción
    • cómo extraer los datos del HTML
    • selectores y loaders

14 of 28

Scrapy - Selectores y loaders

  • Selectores
    • para indicar regiones del HTML
    • Ejemplo:
      • //div[@class='price']
  • Loaders
    • politicas de como procesar las regiones extraidas del HTML, según el campo que se vaya a popular
    • Ejemplo:
      • "List Price: $200" -> 200.0

15 of 28

Scrapy - Pipelines y exports

  • Exports: generan feeds de los datos escrapeados
    • JSON, XML, CSV, etc
  • Pipelines: procesan los datos escrapeados 
    • validación, almacenamiento en DB

16 of 28

Scrapy - Línea de comando

  • Interfaz de control: línea de comando
  • Listar, correr y editar spiders
    • scrapy list
    • scrapy crawl spider1
    • scrapy edit spider1
  • Probar, bajar y ver URLs
    • scrapy shell http://insophia.com
    • scrapy fetch http://insophia.com
    • scrapy view http://insophia.com

17 of 28

Scrapy - Shell

$ scrapy shell http://insophia.com/

>>> hxs.select("//h2/text()").extract()

[u'Who we are?']

18 of 28

Scrapy - Otros servicios

  • Logging
  • Stats
  • Consola telnet
  • Descarga de estáticos (media pipeline)
  • Scrapyd

19 of 28

Scrapy - Servicios online

  • Repositorios APT para Ubuntu
    • provistos por Insophia
  • Plataforma (PaaS) para correr spiders en la nube
    • provisto por Scraping Hub
    • simil Heroku / App engine

20 of 28

Caso de ejemplo - PyDay speakers

21 of 28

Caso de ejemplo - PyDay speakers

22 of 28

Caso de ejemplo - PyDay speakers

23 of 28

Caso de ejemplo - PyDay speakers

24 of 28

Scrapy - Algunas estadísticas

  • 4 años de activo desarrollo
  • 3 años como proyecto open source
  • 2700 commits
  • 25 desarrolladores
  • X usuarios?

25 of 28

Scrapy - Comunidad hoy

  • Google groups
    • 900 threads, 2000+ mensajes,150 mensajes por mes
  • Sitio web y documentación
    • 500 visitas únicas diarias
  • Sala IRC
    • 30-40 personas promedio (90% de la comunidad)
  • Twitter
    •  310 seguidores (10% de Django)
  • Github
    • 192 watchers, 28 forks 
  • Bitbucket
    • 19 watchers, 7 forks
  • StackOverflow
    • 160 preguntas con tag "scrapy"

26 of 28

Scrapy - Links principales

27 of 28

Scrapy - Obteniendo ayuda

28 of 28

¿Preguntas?

¿Te gustaría trabajar con Scrapy?

jobs@insophia.com