Raspado web con módulo de rasguño de Python

Raspado web con módulo de rasguño de Python
La habilidad del raspado web se ha vuelto dorado 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 de Scrapy Python, lo que puede hacer y cómo usarlo. Empecemos.

Por qué Screapy?

Scrapy es una biblioteca robusta de raspado web, que proporciona la capacidad de descargar páginas web, imágenes y cualquier datos que se le ocurra a la velocidad del rayo. La velocidad es de gran importancia en el cálculo, y Scrapy trabaja en esto visitando sitios web de manera asincrónica y haciendo mucho trabajo de fondo, lo que hace que toda la tarea se vea fácil.

Debe decirse que Python tiene otras bibliotecas que pueden usarse para raspar datos de los sitios web, pero ninguno es comparable a Scrapy cuando se trata de eficiencia.

Instalación

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

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

PIP Instale Scrapy

Puede verificar si la instalación fue exitosa importando Scrapy en la carcasa interactiva de Python.

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

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

>>> Importar desechos

Ahora que hemos terminado con la instalación, vamos a meternos en las cosas.

Creación de un proyecto de raspado web

Durante la instalación, la palabra clave de Scrapy se agregó a la ruta para que podamos usar la palabra clave directamente desde la línea de comando. Estaríamos aprovechando esto, a lo largo 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 cable En el directorio actual y la recursos.archivo cfg. En el cable el 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 yo.mi. El script que hace que el cáscara web se almacene se almacenará en el arañas directorio.

Escribiendo nuestra araña

Antes de seguir adelante para escribir nuestra araña, se espera que ya sepamos qué sitio web queremos raspar. A los efectos de este artículo, estamos raspando un sitio web de SweScraping de muestra: http: // Ejemplo.embarcadero.comunicarse.

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

http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/0
http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/1
http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/2

Volver a nuestra araña, vamos a crear una muestra_spider.Py en el directorio de las arañas. Del terminal, un simple toque sample_spider.py El 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:

Importación de recursos
Samplespider de clase (Scrapy.Araña):
nombre = "muestra"
start_urls = [
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/0 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/1 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/2 "
]
Def Parse (Self, Respuesta):
page_number = respuesta.url.Split ('/') [-1]
file_name = "página .html ".Formato (Page_Number)
con Open (file_name, 'wb') como archivo:
archivo.Escribir (respuesta.cuerpo)

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

Muestra de rastreo de scrape

Recuerde que dimos nuestro Samplespider clase A nombre atributo muestra.

Después de ejecutar ese comando, notaría 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:

Importación de recursos

Primero importamos la biblioteca a nuestro espacio de nombres.

Samplespider de clase (Scrapy.Araña):
nombre = "muestra"

Luego creamos una clase de araña que llamamos Samplespider. Nuestra araña hereda de escrapaz.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 una nombre atributo, este nombre El atributo se usa para convocar la araña del terminal. Si recuerdas, corrimos el Muestra de rastreo de scrape comandar ejecutar nuestro código.

start_urls = [
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/0 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/1 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/2 "
]

También tenemos una lista de URL para que la araña visite. 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 más capacidades. Para obtener más información, puede consultar la documentación de Scrapy.

De todos modos, no olvide incluir http: // o https: // para sus enlaces de lo contrario, tendrá que lidiar con un error de esquema que falta.

Def Parse (Self, Respuesta):

Luego seguimos 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 análisis y se envía el objeto de respuesta en el que contiene toda la información de la página web visitada.

page_number = respuesta.url.Split ('/') [-1]
file_name = "página .html ".Formato (Page_Number)

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:
archivo.Escribir (respuesta.cuerpo)

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

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

Desde la página que se desechará, aquí hay un extracto del HTML que contiene los datos que necesitamos:









Afganistán

Islas Aland

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

Importación de recursos
de bs4 import beautifulsoup
Samplespider de clase (Scrapy.Araña):
nombre = "muestra"
start_urls = [
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/0 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/1 ",
"http: // ejemplo.embarcadero.com/lugares/predeterminado/índice/2 "
]
Def Parse (Self, Respuesta):
page_number = respuesta.url.Split ('/') [-1]
file_name = "página .TXT".Formato (Page_Number)
con Open (file_name, 'w') como archivo:
html_content = beautifulSoup (respuesta.cuerpo, "lxml")
div_tags = html_content.find ("div", "id": "resultados")
country_tags = div_tags.find_all ("div")
country_name_position = zip (rango (len (country_tags)), country_tags)
Para la posición, country_name en country_name_position:
archivo.escribir ("número de país : \ n".formato (posición + 1, country_name.texto))

El código es más o menos el mismo que el inicial, sin embargo, he agregado BeautifulSoup a nuestro espacio de nombres y he cambiado la lógica en la función de análisis.

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

Def Parse (Self, Respuesta):

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

page_number = respuesta.url.Split ('/') [-1]
file_name = "página .TXT".Formato (Page_Number)
con Open (file_name, 'w') como archivo:

Esto hace lo mismo que se discutió en el código intial, la única diferencia es que estamos trabajando con un archivo de texto en lugar de un archivo HTML. Guardaríamos los datos raspados 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 a la biblioteca beautifulsoup, y asignó los resultados al html_content variable.

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

Tomando el contenido HTML, lo analizamos aquí buscando un div etiqueta que también tiene y identificación atribuir resultados Como es valor, entonces podemos guardarlo en un Div_tags variable.

country_tags = div_tags.find_all ("div")

Recuerda que los países existían en div Etiquetas también, ahora simplemente estamos obteniendo todo el div etiquetas y guardarlas como una lista en el country_tags variable.

country_name_position = zip (rango (len (country_tags)), country_tags)
Para la posición, country_name en country_name_position:
archivo.escribir ("número de país : \ n".formato (posición + 1, country_name.texto))

Aquí, estamos iterando a través de la posición de los países entre todas las etiquetas del país, entonces estamos guardando 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 potentes que existen, es muy rápido y básicamente descarga la página web. Luego te da la libertad de lo que desees con el contenido web.

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