Scrapy

Web Scraping con el módulo Python Scrapy

Web Scraping con el módulo Python Scrapy
La habilidad del web scraping se ha vuelto dorada hoy, así que aprendamos cómo podemos obtener los datos necesarios de las páginas web. En este artículo, estaríamos hablando de la biblioteca Scrapy Python, lo que puede hacer y cómo usarla. Empecemos.

Por qué Scrapy?

Scrapy es una biblioteca robusta de web scraping, que brinda la capacidad de descargar páginas web, imágenes y cualquier dato que se te ocurra a la velocidad del rayo. La velocidad es de gran importancia en la computación, y Scrapy trabaja en esto visitando sitios web de forma asincrónica y haciendo mucho trabajo en segundo plano para que toda la tarea parezca fácil.

Debe decirse que Python tiene otras bibliotecas que se pueden usar para extraer datos de sitios web, pero ninguna es comparable a Scrapy en lo que respecta a la eficiencia.

Instalación

Echemos un vistazo rápido a cómo se puede instalar esta poderosa biblioteca en su máquina.

Al igual que con la mayoría de las bibliotecas de Python, puede instalar Scrapy usando el módulo pip:

pip instalar Scrapy

Puede verificar si la instalación fue exitosa importando scrapy en el shell interactivo de Python.

$ python
Python 3.5.2 (predeterminado, 14 de septiembre de 2017, 22:51:06)
[CCG 5.4.0 20160609] en Linux

Escriba "ayuda", "derechos de autor", "créditos" o "licencia" para obtener más información.

>>> importar scrapy

Ahora que hemos terminado con la instalación, entremos en el meollo de las cosas.

Creación de un proyecto de web scraping

Durante la instalación, se agregó la palabra clave scrapy a la ruta para que podamos usar la palabra clave directamente desde la línea de comando. Estaríamos aprovechando esto, a través de nuestro uso de la biblioteca.

Desde el directorio de su elección, ejecute el siguiente comando:

scrapy startproject webscraper

Esto crearía un directorio llamado raspador de telarañas en el directorio actual y scrapy.archivo cfg. En el raspador de telarañas  directorio tendría __en eso__.py, artículos.py, middlewares.py, tuberías.py, configuración.py archivos y un directorio llamado arañas.

Nuestros archivos de araña i.mi. el script que hace el webscraping por nosotros se almacenaría en el arañas directorio.

Escribiendo nuestra araña

Antes de seguir adelante con la escritura de nuestra araña, se espera que ya sepamos qué sitio web queremos raspar. Para el propósito de este artículo, estamos raspando un sitio web de raspado web de muestra: http: // ejemplo.raspado.com.

Este sitio web solo tiene nombres de países y sus banderas, con diferentes páginas y vamos a eliminar tres de las páginas. Las tres páginas en las que estaríamos trabajando son:

http: // ejemplo.raspado.com / places / default / index / 0
http: // ejemplo.raspado.com / places / default / index / 1
http: // ejemplo.raspado.com / places / default / index / 2

Volviendo a nuestra araña, vamos a crear un sample_spider.py en el directorio de arañas. Desde la terminal, un simple toque sample_spider.py comando ayudaría a crear un nuevo archivo.

Después de crear el archivo, lo llenaríamos con las siguientes líneas de código:

importar scrapy
 
clase SampleSpider (scrapy.Araña):
nombre = "muestra"
start_urls = [
"http: // ejemplo.raspado.com / places / default / index / 0 ",
"http: // ejemplo.raspado.com / places / default / index / 1 ",
"http: // ejemplo.raspado.com / places / default / index / 2 "
]
 
def parse (auto, respuesta):
page_number = respuesta.url.dividir ('/') [- 1]
file_name = "página .html ".formato (número_página)
con open (file_name, 'wb') como archivo:
expediente.escribir (respuesta.cuerpo)

Desde el nivel superior del directorio del proyecto, ejecute el siguiente comando:

muestra de rastreo scrapy

Recuerde que le dimos nuestro SampleSpider clase A nombre atributo muestra.

Después de ejecutar ese comando, notará que tres archivos llamados page0.html, página1.html, página2.html se guardan en el directorio.

Echemos un vistazo a lo que sucede con el código:

importar scrapy

Primero importamos la biblioteca a nuestro espacio de nombres.

clase SampleSpider (scrapy.Araña):
nombre = "muestra"

Luego creamos una clase de araña a la que llamamos SampleSpider. Nuestra araña hereda de scrapy.Araña. Todas nuestras arañas tienen que heredar de scrapy.Araña. Después de crear la clase, le damos a nuestra araña un nombre atributo, este nombre El atributo se usa para convocar a la araña desde la terminal. Si recuerda, ejecutamos el muestra de rastreo scrapy comando para ejecutar nuestro código.

start_urls = [
 
"http: // ejemplo.raspado.com / places / default / index / 0 ",
"http: // ejemplo.raspado.com / places / default / index / 1 ",
"http: // ejemplo.raspado.com / places / default / index / 2 "
]

También tenemos una lista de URL para que las visite la araña. La lista debe llamarse start_urls. Si desea darle a la lista un nombre diferente, tendríamos que definir un start_requests función que nos da algunas capacidades más. Para obtener más información, puede consultar la documentación incompleta.

Independientemente, no olvide incluir http: // o https: // para sus enlaces, de lo contrario tendría que lidiar con un error de esquema faltante.

def parse (auto, respuesta):

Luego continuamos para declarar una función de análisis y darle un parámetro de respuesta. Cuando se ejecuta el código, se evoca la función de parse y se envía el objeto de respuesta que contiene toda la información de la página web visitada.

page_number = respuesta.url.dividir ('/') [- 1]
file_name = "página .html ".formato (número_página)

Lo que hemos hecho con este código es dividir la cadena que contiene la dirección y guardar el número de página solo en un número de página variable. Entonces creamos un Nombre del archivo variable insertando el número de página en la cadena que sería el nombre de archivo de los archivos que estaríamos creando.

con open (file_name, 'wb') como archivo:
expediente.escribir (respuesta.cuerpo)

Ahora hemos creado el archivo y estamos escribiendo el contenido de la página web en el archivo usando el cuerpo atributo del respuesta objeto.

Podemos hacer más que solo guardar la página web. La biblioteca BeautifulSoup se puede utilizar para analizar el cuerpo.respuesta. Puede consultar este tutorial de BeautiulSoup si no está familiarizado con la biblioteca.

De la página que se va a eliminar, aquí hay un extracto del html que contiene los datos que necesitamos:

Notará que todos los datos necesarios están incluidos en etiquetas div, por lo que vamos a reescribir el código para analizar el html.
Aquí está nuestro nuevo guión:

importar scrapy
desde bs4 importar BeautifulSoup
 
clase SampleSpider (scrapy.Araña):
nombre = "muestra"
 
start_urls = [
"http: // ejemplo.raspado.com / places / default / index / 0 ",
"http: // ejemplo.raspado.com / places / default / index / 1 ",
"http: // ejemplo.raspado.com / places / default / index / 2 "
]
 
def parse (auto, respuesta):
page_number = respuesta.url.dividir ('/') [- 1]
file_name = "página .TXT".formato (número_página)
con open (file_name, 'w') como archivo:
html_content = BeautifulSoup (respuesta.cuerpo, "lxml")
div_tags = html_content.buscar ("div", "id": "resultados")
country_tags = div_tags.find_all ("div")
country_name_position = zip (range (len (country_tags)), country_tags)
para la posición, country_name en country_name_position:
expediente.write ("número de país : \ n".formato (posición + 1, nombre_país.texto))

El código es prácticamente el mismo que el inicial, sin embargo, agregué BeautifulSoup a nuestro espacio de nombres y cambié la lógica en la función de análisis.

Echemos un vistazo rápido a la lógica.

def parse (auto, respuesta):

Aquí hemos definido la función de análisis y le hemos dado un parámetro de respuesta.

page_number = respuesta.url.dividir ('/') [- 1]
file_name = "página .TXT".formato (número_página)
con open (file_name, 'w') como archivo:

Esto hace lo mismo que se discutió en el código inicial, la única diferencia es que estamos trabajando con un archivo de texto en lugar de un archivo html. Estaríamos guardando los datos extraídos en el archivo de texto, y no todo el contenido web en html como se hizo anteriormente.

html_content = BeautifulSoup (respuesta.cuerpo, "lxml")

Lo que hemos hecho en esta línea de código es enviar el respuesta.cuerpo como argumento de la biblioteca BeautifulSoup, y asignó los resultados a la html_content variable.

div_tags = html_content.buscar ("div", "id": "resultados")

Tomando el contenido html, lo estamos analizando aquí buscando un div etiqueta que también tiene y identificación atributo con resultados como su valor, entonces podemos guardarlo en un div_tags variable.

country_tags = div_tags.find_all ("div")

Recuerda que los países existieron en div también, ahora simplemente estamos obteniendo todas las div etiquetas y guardarlas como una lista en el country_tags variable.

country_name_position = zip (range (len (country_tags)), country_tags)
 
para la posición, country_name en country_name_position:
expediente.write ("número de país : \ n".formato (posición + 1, nombre_país.texto))

Aquí, estamos iterando a través de la posición de los países entre todas las etiquetas de países y luego guardamos el contenido en un archivo de texto.

Entonces, en su archivo de texto, tendría algo como:

país número 1: Afganistán
país número 2: Islas Aland
país número 3: Albania
..

Conclusión

Scrapy es sin duda una de las bibliotecas más poderosas que existen, es muy rápida y básicamente descarga la página web. A continuación, le da la libertad de hacer lo que desee con el contenido web.

Debemos tener en cuenta que Scrapy puede hacer mucho más de lo que hemos comprobado aquí. Puede analizar datos con Scrapy CSS o selectores XPath si lo desea. Puede leer la documentación si necesita hacer algo más complejo.

Cómo cambiar la configuración del mouse y el panel táctil con Xinput en Linux
La mayoría de las distribuciones de Linux se envían con la biblioteca "libinput" de forma predeterminada para manejar eventos de entrada en un sistema...
Vuelva a asignar los botones del mouse de manera diferente para diferentes programas con X-Mouse Button Control
Tal vez necesite una herramienta que pueda hacer que el control de su mouse cambie con cada aplicación que use. Si este es el caso, puede probar una a...
Revisión del mouse inalámbrico Microsoft Sculpt Touch
Recientemente leí sobre el Microsoft Sculpt Touch mouse inalámbrico y decidí comprarlo. Después de usarlo por un tiempo, decidí compartir mi experienc...