Cómo construir un rastreador web básico para extraer información de un sitio web
¿Alguna vez ha deseado capturar información específica de un sitio web mediante programación para su posterior procesamiento? ¿Diga algo como resultados deportivos, tendencias del mercado de valores o la última moda, bitcoin y otros precios de cripto-moneda? Si la información que necesita está disponible en un sitio web, puede escribir un rastreador (también conocido como raspador o araña) para navegar por el sitio web y extraer solo lo que necesita. Averigüemos cómo hacer eso en Python..
Tenga en cuenta que varios sitios web desalientan el uso de un rastreador para acceder a la información que proporciona el sitio web. Por lo tanto, consulte los términos y condiciones del sitio web antes de implementar un rastreador en cualquier sitio web.
Instalación de Scrapy
Utilizamos un módulo de Python llamado Scrapy para manejar el rastreo real. Es rápido, simple y puede navegar múltiples páginas web al igual que lo hace con un navegador.
Sin embargo, tenga en cuenta que scrapy no tiene instalaciones para procesar javascript cuando navega por el sitio web. Por lo tanto, los sitios web y las aplicaciones que utilizan javascript para manipular la interfaz de usuario no se pueden rastrear correctamente con este enfoque.
Ahora instalemos scrapy. Usamos virtualenv Aprende cómo usar el entorno virtual de Python Aprende a usar el entorno virtual de Python Ya sea que seas un desarrollador experimentado de Python, o simplemente estés empezando, aprender cómo configurar un entorno virtual es esencial para cualquier proyecto de Python. Leer más para instalar scrapy. Esto nos permite instalar scrapy en un directorio sin afectar a otros módulos instalados en el sistema.
Crear un directorio e inicializar un entorno virtual en ese directorio.
mkdir crawler cd crawler virtualenv venv. venv / bin / activar
Ahora puedes instalar scrapy en este directorio..
pip instalar scrapy
Compruebe que el scrapy está instalado correctamente.
scrapy # imprime Scrapy 1.4.0 - ningún proyecto activo Uso: scrapy [opciones] [argumentos] Comandos disponibles: banco Ejecutar prueba de referencia rápida obtener una URL usando el descargador de Scrapy genspider Generar una nueva araña usando plantillas predefinidas runpider Ejecutar una araña independiente (sin crear un proyecto) ...
Construyendo un rastreador de sitio web (también llamado araña)
Ahora escribamos un rastreador para cargar alguna información. Comenzamos raspando algo de información de una página de Wikipedia en una batería de 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.Spider. Llamemos a esta clase araña1.
Como mínimo, una clase de araña requiere lo siguiente:
- una nombre para identificar la araña, “Wikipedia” en este caso.
- una start_urls variable que contiene una lista de URL para comenzar a rastrear. Usamos la URL de Wikipedia que se muestra arriba para nuestro primer rastreo.
- una analizar gramaticalmente() Método que, aunque no se usa por ahora, se utiliza para procesar la página web para extraer lo que queremos..
importar scrapy class spider1 (scrapy.Spider): name = 'Wikipedia' start_urls = ['https://en.wikipedia.org/wiki/Battery_(electricity)'] def parse (self, response): pass
Ahora podemos ejecutar esta araña para asegurarnos de que todo funcione correctamente. Se ejecuta de la siguiente manera.
scrapy runspider spider1.py # prints 2017-11-23 09:09:21 [scrapy.utils.log] INFO: Scrapy 1.4.0 inició (bot: scrapybot) 2017-11-23 09:09:21 [scrapy.utils .log] INFO: Configuraciones anuladas: 'SPIDER_LOADER_WARN_ONLY': Verdadero 2017-11-23 09:09:21 [scrapy.middleware] INFO: Extensiones habilitadas: ['scrapy.extensions.memusage.MemoryUsage', 'scrapy.extensions .logstats.LogStats ',…
Desactivando el registro
Como puede ver, ejecutar scrapy con nuestra clase mínima genera un montón de resultados que no tienen mucho sentido para nosotros. Vamos a establecer el nivel de registro para advertencia y vuelva a intentarlo. Agregue las siguientes líneas al principio del archivo.
importar registro logging.getLogger ('scrapy'). setLevel (logging.WARNING)
Al volver a ejecutar la araña, deberíamos ver un mínimo de los mensajes de registro.
Usando Chrome Inspector
La extracción de información de una página web consiste en determinar la posición del elemento HTML del cual deseamos información. Una forma agradable y fácil de encontrar la posición de un elemento. Descubrir problemas del sitio web con Chrome Developer Tools o Firebug Descubrir problemas del sitio web con Chrome Developer Tools o Firebug Si has estado siguiendo mis tutoriales de jQuery hasta ahora, es posible que ya hayas encontrado Algunos problemas de código y no se sabe cómo solucionarlos. Cuando se enfrenta con un bit de código no funcional, es muy ... Leer más desde el navegador web Chrome es utilizar el Inspector.
- Navega a la página correcta en Chrome.
- Coloque el ratón sobre el elemento del que desea obtener la información..
- Haga clic derecho para desplegar el menú contextual.
- Seleccionar Inspeccionar del menu.
Eso debería abrir la consola del desarrollador con el Elementos pestaña seleccionada Debajo de la pestaña, debería ver la barra de estado con la posición del elemento que se muestra a continuación:
html body div # content.mw-body h1 # firstHeading.firstHeading.
Como explicamos a continuación, necesita algunas o todas las partes de esta posición..
Extracción del título
Ahora agreguemos algo de código a la analizar gramaticalmente() Método para extraer el título de la página..
… Def parse (self, response): print response.css ('h1 # firstHeading :: text'). Extract () ...
los respuesta argumento al método soporta un método llamado css () que selecciona elementos de la página utilizando la ubicación dada. Para nuestro caso, el elemento es h1.firstHeading. Necesitamos el contenido de texto del elemento por lo que agregamos ::texto a la seleccion. Finalmente, el extraer() método devuelve el elemento seleccionado.
Al ejecutar scrapy una vez más en esta clase, obtenemos el siguiente resultado:
[u'Batería (electricidad) ']
Esto muestra que el título se ha extraído en una lista de cadenas Unicode.
Cómo sobre la descripción?
Para demostrar algunos aspectos más de la extracción de datos de páginas web, obtengamos el primer párrafo de la descripción de la página de Wikipedia anterior..
En la inspección con la Chrome Developer Console, encontramos que la ubicación del elemento es (el corchete en ángulo recto (>) indica una relación padre-hijo entre los elementos):
div # mw-content-text> div> p
Esta ubicación devuelve todos la pag Elementos emparejados, que incluye la descripción completa. Como queremos solo lo primero pag Elemento, utilizamos el siguiente extractor:
response.css ('div # mw-content-text> div> p') [0]
Para extraer solo el contenido del texto, agregamos un extractor de CSS. ::texto:
response.css ('div # mw-content-text> div> p') [0] .css (':: text')
La expresión final utiliza extraer() que devuelve una lista de cadenas de Unicode. Usamos la piton unirse() función para unirse a la lista.
def parse (self, response): print ".join (response.css ('div # mw-content-text> div> p') [0] .css (':: text'). extract ())
El resultado de ejecutar scrapy con esta clase es lo que estamos buscando:
Una batería eléctrica es un dispositivo que consta de 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 ...
Recopilando datos usando rendimiento
El código anterior imprime los datos extraídos a la consola. Cuando necesite recopilar datos como JSON, puede utilizar el rendimiento declaración. La manera rendimiento funciona de la siguiente manera: ejecutar una función que contiene un rendimiento La declaración devuelve lo que se conoce como un generador a la persona que llama. El generador es una función que la persona que llama puede ejecutar repetidamente hasta que termina.
Aquí hay un código similar al anterior, pero que usa el rendimiento Declaración para devolver la lista de pag elementos dentro del HTML.
… Def parse (self, response): para e en response.css ('div # mw-content-text> div> p'): produce 'para': ". Join (e.css (':: text' ) .extract ()). strip ()…
Ahora puede ejecutar la araña especificando un archivo JSON de salida de la siguiente manera:
scrapy runspider spider3.py -o joe.json
La salida generada es la siguiente:
["para": "Una batería eléctrica es un dispositivo que consta de 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 el 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 están conectados a un circuito externo, fluirán y entregarán energía a un dispositivo externo. Cuando una batería está conectada a un dispositivo externo En el circuito, los electrolitos son capaces de moverse como iones dentro, lo que permite que las reacciones químicas se completen en los terminales separados y así entregar energía al circuito externo. 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 refiere específicamente a un dispositivo compuesto por varias celdas, sin embargo, el uso ha evolucionado adicionalmente para incluir dispositivos compuestos de un pecado. [4] ", " para ":" Las baterías primarias (de un solo uso o "desechables") se usan una vez y se descartan; 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 ...
Procesando múltiples bits de información
Veamos ahora cómo extraer múltiples bits relacionados con la información. Para este ejemplo, extraeremos los mejores éxitos de Taquilla de IMDb para el fin de semana actual. Esta información está disponible en http://www.imdb.com/chart/boxoffice, en una tabla con una fila de información para cada golpe.
Extraemos varios campos en cada fila usando el siguiente analizar gramaticalmente() método. Nuevamente, las ubicaciones de elementos de CSS se determinaron utilizando la Consola de desarrollador de Chrome como se explicó anteriormente:
… Def parse (self, response): para e en 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 (), 'weeks' : ". join (e.css ('td.weeksColumn :: text'). extract ()) strip (), 'image': e.css ('td.posterColumn img :: attr (src)'). extract_first (),…
Tenga en cuenta que el imagen el selector de arriba especifica que img es un descendiente de td.posterColumn, Y estamos extrayendo el atributo llamado. src usando la expresión :: attr (src).
Ejecutando la araña ahora devuelve el siguiente JSON:
["gross": "$ 93.8M", "weeks": "1", "weekend": "$ 93.8M", "image": "https://images-na.ssl-images-amazon.com/images /M/MV5BYWVhhZkYTItOGIwYS00NmRkLWJlPjPra el título de la clase de gpcQVGlPa de la clase de juego de la gimnasia de la cadera de la clase ",", ",,,,,,,,,,,,,,,,, , "bruto": "$ 247.3M", "semanas": "3", "fin de semana": "$ 21.7M", "imagen": "https://images-na.ssl-images-amazon.com/ images / M / MV5BMjMyNDkzMzI1OF5BMl5BanBnXkFtZTgwODcxODg5MjI @ ._ V1_UY67_CR0,0,45,67_AL_.jpg "," title ":" Thor: Ragnarok ", ...]
Usando su rastreador
Concluyamos ahora este artículo con algunos puntos destacados:
- El uso de python con scrapy facilita la escritura de rastreadores de sitios web para extraer cualquier información que necesite.
- Chrome Developer Console (o la herramienta Firebug de Firefox) ayuda a localizar ubicaciones de elementos para extraer.
- Pitón rendimiento declaración ayuda a extraer elementos de datos repetidos.
¿Tiene algún proyecto específico en mente para el sitio web? ¿Y a qué problemas te has enfrentado tratando de ponerlo en marcha? Por favor háznoslo saber en los comentarios más abajo.
Crédito de la imagen: dxinerz / Depositphotos | Lulzmango / Wikimedia Commons
Explorar más sobre: Programación, Python, Herramientas para webmasters.