Anuncio

Los programas que leen información de sitios web o rastreadores web tienen todo tipo de aplicaciones útiles. Puede buscar información sobre acciones, resultados deportivos, mensajes de texto desde una cuenta de Twitter o extraer precios de sitios web de compras.

Escribir estos programas de rastreo web es más fácil de lo que piensas. Python tiene una gran biblioteca para escribir scripts que extraen información de sitios web. Veamos cómo crear un rastreador web con Scrapy.

Instalar Scrapy

Scrapy es una biblioteca de Python que se creó para raspar la web y crear rastreadores web. Es rápido, simple y puede navegar a través de múltiples páginas web sin mucho esfuerzo.

Scrapy está disponible a través de la biblioteca Pip Installs Python (PIP), aquí hay una actualización sobre Cómo instalar PIP en Windows, Mac y Linux Cómo instalar Python PIP en Windows, Mac y LinuxMuchos desarrolladores de Python confían en una herramienta llamada PIP para Python para optimizar el desarrollo. Aquí se explica cómo instalar Python PIP. Lee mas .

Usando un entorno virtual de Python es preferible porque le permitirá instalar Scrapy en un directorio virtual que deja los archivos de su sistema en paz. La documentación de Scrapy recomienda hacer esto para obtener los mejores resultados.

Cree un directorio e inicialice un entorno virtual.

rastreador mkdir. rastreador de cd. virtualenv venv.. venv / bin / activar. 

Ahora puede instalar Scrapy en ese directorio utilizando un comando PIP.

pip instalar scrapy. 

Una comprobación rápida para asegurarse de que Scrapy esté instalado correctamente

tembloroso # impresiones. Scrapy 1.4.0 - sin proyecto activo Uso: scrapy  [opciones] [args] Comandos disponibles: banco Ejecutar prueba de prueba rápida de referencia Obtener una URL usando el descargador Scrapy genspider Genere una nueva araña usando plantillas predefinidas runpider Ejecute una araña autónoma (sin crear un proyecto)... 

Cómo construir un rastreador web

Ahora que el entorno está listo, puede comenzar a construir el rastreador web. Recortemos información de una página de Wikipedia sobre baterías: https://en.wikipedia.org/wiki/Battery_(electricity).

El primer paso para escribir un rastreador es definir una clase de Python que se extienda desde Scrapy Araña. Esto le da acceso a todas las funciones y características de Scrapy. Llamemos a esta clase araña1.

Una clase de araña necesita algunos datos:

  • un nombre para identificar la araña
  • un start_urls variable que contiene una lista de URL para rastrear (la URL de Wikipedia será el ejemplo en este tutorial)
  • un analizar gramaticalmente() método que se utiliza para procesar la página web para extraer información
importar scrapy class spider1 (scrapy. Araña): nombre = 'Wikipedia' start_urls = [' https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (auto, respuesta): pasar. 

Una prueba rápida para asegurarse de que todo esté funcionando correctamente.

scrapy runpider spider1.py. # impresiones. 2017-11-23 09:09:21 [scrapy.utils.log] INFORMACIÓN: Scrapy 1.4.0 comenzó (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils.log] INFORMACIÓN: Configuración anulada: {'SPIDER_LOADER_WARN_ONLY': Verdadero} 2017-11-23 09:09:21 [scrapy.middleware] INFORMACIÓN: Extensiones habilitadas: ['scrapy.extensions.memusage. MemoryUsage ',' scrapy.extensions.logstats. LogStats ', ...

Desactivar el registro

Ejecutar Scrapy con esta clase imprime información de registro que no lo ayudará en este momento. Vamos a simplificarlo eliminando este exceso de información de registro. Utilizar una advertencia declaración agregando código al comienzo del archivo.

registro de importación. logging.getLogger ('scrapy'). setLevel (registro. ADVERTENCIA)

Ahora, cuando vuelva a ejecutar el script, la información del registro no se imprimirá.

Usando el Inspector de Chrome

Todo en una página web se almacena en elementos HTML. Los elementos están organizados en el Modelo de Objetos del Documento (DOM). Comprender el DOM es crítico JavaScript y desarrollo web: uso del modelo de objetos de documentoEste artículo le presentará el esqueleto del documento con el que funciona JavaScript. Con un conocimiento práctico de este modelo de objeto de documento abstracto, puede escribir JavaScript que funcione en cualquier página web. Lee mas para aprovechar al máximo su rastreador web. Un rastreador web busca en todos los elementos HTML de una página para encontrar información, por lo que es importante saber cómo están organizados.

Google Chrome tiene herramientas que lo ayudan a encontrar elementos HTML más rápido. Puede localizar el HTML para cualquier elemento que vea en la página web utilizando el inspector.

  • Navega a una página en Chrome
  • Coloque el mouse sobre el elemento que desea ver
  • Haga clic derecho y seleccione Inspeccionar del menú

Estos pasos abrirán la consola del desarrollador con el Elementos pestaña seleccionada. En la parte inferior de la consola, verá un árbol de elementos. Este árbol es cómo obtendrá información para su script.

Extrayendo el título

Hagamos que el script haga un trabajo por nosotros; Un simple rastreo para obtener el texto del título de la página web.

Comience la secuencia de comandos agregando algún código al analizar gramaticalmente() Método que extrae el título.

... def parse (self, response): print response.css ('h1 # firstHeading:: text'). extract ()... 

los respuesta argumento admite un método llamado CSS () que selecciona elementos de la página utilizando la ubicación que proporciona.

En este ejemplo, el elemento es h1.firstHeading. Agregando ::texto para el script es lo que te da el contenido de texto del elemento. Finalmente, el extraer() El método devuelve el elemento seleccionado.

Ejecutar este script en Scrapy imprime el título en forma de texto.

[u'Batería (electricidad) ']

Encontrar la descripción

Ahora que hemos raspado el texto del título, hagamos más con el guión. El rastreador encontrará el primer párrafo después del título y extraerá esta información.

Aquí está el árbol de elementos en la Consola de desarrollador de Chrome:

div # mw-content-text> div> p

La flecha derecha (>) indica una relación padre-hijo entre los elementos.

Esta ubicación devolverá todos los pag elementos coincidentes, que incluye la descripción completa. Para obtener el primero pag elemento puedes escribir este código:

response.css ('div # mw-content-text> div> p') [0]

Al igual que el título, agrega extractor CSS ::texto para obtener el contenido de texto del elemento.

response.css ('div # mw-content-text> div> p') [0] .css (':: text')

La expresión final usa extraer() para devolver la lista. Puedes usar Python unirse() función para unirse a la lista una vez que se haya completado todo el rastreo.

 def parse (self, response): print '' .join (response.css ('div # mw-content-text> div> p') [0] .css (':: text'). extract ())

¡El resultado es el primer párrafo del texto!

Una batería eléctrica es un dispositivo que consiste en una o más celdas electroquímicas con conexiones externas provistas para alimentar electricidad dispositivos como linternas, teléfonos inteligentes y automóviles eléctricos. [1] Cuando una batería está suministrando energía eléctrica, su terminal positivo es... 

Recopilación de datos JSON

Scrapy puede extraer información en forma de texto, lo cual es útil. Scrapy también le permite ver los datos JavaScript Object Notation (JSON). JSON es una forma ordenada de organizar la información y se usa ampliamente en el desarrollo web. JSON funciona bastante bien con Python JSON Python Parsing: una guía simpleHay bibliotecas y kits de herramientas disponibles para analizar y generar JSON desde casi cualquier idioma y entorno. Este artículo se concentra en los métodos y problemas derivados del análisis JSON python. Lee mas también.

Cuando necesite recopilar datos como JSON, puede usar el rendimiento declaración incorporada en Scrapy.

Aquí hay una nueva versión del script usando una declaración de rendimiento. En lugar de obtener el primer elemento p en formato de texto, esto tomará todos los elementos p y lo organizará en formato JSON.

... def parse (self, response): para e en response.css ('div # mw-content-text> div> p'): yield {'para': '' .join (e.css (':: text' ) .extract ()). strip ()}... 

Ahora puede ejecutar la araña especificando un archivo JSON de salida:

scrapy runpider spider3.py -o joe.json. 

El script ahora imprimirá todos los elementos p.

[ {"para": "Una batería eléctrica es un dispositivo que consiste en una o más celdas electroquímicas con conexiones externas provistas para alimentar dispositivos eléctricos como linternas, teléfonos inteligentes y automóviles eléctricos. [1] Cuando una batería está suministrando energía eléctrica, su terminal positivo es el cátodo y su terminal negativo es el ánodo. [2] El terminal marcado como negativo es la fuente de electrones que cuando se conecta a un circuito externo fluirá y entregará energía a un dispositivo externo. Cuando una batería está conectada a un circuito externo, los electrolitos pueden moverse como iones dentro, permitiendo las reacciones químicas que se completarán en las terminales separadas y así entregarán energía al exterior circuito. Es el movimiento de esos iones dentro de la batería lo que permite que la corriente fluya fuera de la batería para realizar el trabajo. [3] Históricamente, el término \ "batería \" se refería específicamente a un dispositivo compuesto de múltiples celdas, sin embargo, el uso ha evolucionado adicionalmente para incluir dispositivos compuestos de una sola celda. [4] "}, {" para ": las baterías" primarias (de un solo uso o \ "desechables \") se usan una vez descartado; Los materiales del electrodo se cambian irreversiblemente durante la descarga. Ejemplos comunes son la batería alcalina utilizada para linternas y una multitud de dispositivos electrónicos portátiles. Las baterías secundarias (recargables) se pueden descargar y recargar múltiples ...

Raspado de elementos múltiples

Hasta ahora, el rastreador web ha eliminado el título y un tipo de elemento de la página. Scrapy también puede extraer información de diferentes tipos de elementos en un script.

Extraigamos los principales éxitos de IMDb en taquilla durante un fin de semana. Esta información se extrae de http://www.imdb.com/chart/boxoffice, en una tabla con filas para cada métrica.

los analizar gramaticalmente() El método puede extraer más de un campo de la fila. Usando las Herramientas para desarrolladores de Chrome puedes encontrar los elementos anidados dentro de la tabla.

... def parse (self, response): for e in response.css ('div # boxoffice> table> tbody> tr'): yield {'title': '' .join (e.css ('td.titleColumn> a:: text '). extract ()). strip (),' weekend ':' '.join (e.css (' td.ratingColumn ') [0] .css (':: text '). extract ()). strip (), 'gross': '' .join (e.css ('td.ratingColumn') [1] .css ('span.secondaryInfo:: text'). extract ()). strip (), 'semanas': '' .join (e.css (' td.weeksColumn:: text '). extract ()). strip (),' image ': e.css ('td.posterColumn img:: attr (src)'). extract_first (),}... 

los imagen selector especifica que img es descendiente de td.posterColumn. Para extraer el atributo correcto, use la expresión :: attr (src).

Ejecutar la araña devuelve JSON:

[ {"bruto": "$ 93.8M", "semanas": "1", "fin de semana": "$ 93.8M", "imagen": " https://images-na.ssl-images-amazon.com/images/M/MV5BYWVhZjZkYTIt[email protected]._V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Justice League"}, {"bruto": "$ 27.5M", "semanas": "1", "fin de semana": "$ 27.5M", "imagen": " https://images-na.ssl-images-amazon.com/images/M/MV5BYjFhOWY0OTgt[email protected]._V1_UX45_CR0,0,45,67_AL_.jpg", "title": "Wonder"}, {"bruto": "$ 247.3M", "semanas": "3", "fin de semana": "$ 21.7M", "imagen": " https://images-na.ssl-images-amazon.com/images/M/[email protected]_V1_UY67_CR0,0,45,67_AL_.jpg", "title": "Thor: Ragnarok"},... ]

Más Web Scrapers y Bots

Scrapy es una biblioteca detallada que puede hacer casi cualquier tipo de rastreo web que le pidas. Cuando se trata de encontrar información en elementos HTML, combinados con el soporte de Python, es difícil de superar. Ya sea que esté creando un rastreador web o aprender sobre los conceptos básicos del raspado web El único límite es cuánto estás dispuesto a aprender.

Si está buscando más formas de crear rastreadores o bots, puede intentar construir bots de Twitter e Instagram usando Python Cómo construir Twitter, Instagram y Reddit Bots usando Python¿Quieres construir tus propios bots de redes sociales? Aquí se explica cómo publicar automáticamente actualizaciones en Twitter, Instagram y Reddit usando Python. Lee mas . Python puede construir cosas increíbles en el desarrollo web, por lo que vale la pena ir más allá de los rastreadores web al explorar este idioma.

Anthony Grant es un escritor independiente que cubre programación y software. Es un experto en informática que se especializa en programación, Excel, software y tecnología.