0% encontró este documento útil (0 votos)
162 vistas

Python Scraping

Este documento describe cómo raspar datos de una página web de la Galería Nacional de Arte utilizando Beautiful Soup y Python. Explica cómo importar las bibliotecas necesarias, recopilar la primera página web, crear un objeto BeautifulSoup y extraer el texto de los nombres de los artistas y enlaces relevantes de la página.

Cargado por

DanielCardona
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como ODT, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
162 vistas

Python Scraping

Este documento describe cómo raspar datos de una página web de la Galería Nacional de Arte utilizando Beautiful Soup y Python. Explica cómo importar las bibliotecas necesarias, recopilar la primera página web, crear un objeto BeautifulSoup y extraer el texto de los nombres de los artistas y enlaces relevantes de la página.

Cargado por

DanielCardona
Derechos de autor
© © All Rights Reserved
Formatos disponibles
Descarga como ODT, PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 24

Cómo raspar páginas web con

Beautiful Soup y Python 3


ANÁLISIS
Actualizado 20 de marzo de 2019 389.9k v DE DATOS DELPROYECTO DE
PROGRAMACIÓN DE DESARROLLO DE  i
PYTHON  
s
t
• a
• Por Lisa Tagliaferri s
Convertirse en autor

Introducción
Muchos proyectos de análisis de datos, big data y aprendizaje automático
requieren raspar sitios web para recopilar los datos con los que trabajará. El
lenguaje de programación Python se usa ampliamente en la comunidad de
ciencia de datos y, por lo tanto, tiene un ecosistema de módulos y
herramientas que puede usar en sus propios proyectos. En este tutorial nos
centraremos en el módulo Beautiful Soup.

Beautiful Soup , una alusión a la canción de Mock Turtle que se encuentra en el

Capítulo 10 de Alice's Adventures in Wonderland de Lewis Carroll , es una


biblioteca de Python que permite un cambio rápido en los proyectos de
raspado de la web. Actualmente disponible como Beautiful Soup 4 y compatible
con Python 2.7 y Python 3, Beautiful Soup crea un árbol de análisis a partir de
documentos HTML y XML analizados (incluidos documentos con etiquetas no

cerradas o sopa de etiquetas y otro marcado con formato incorrecto).

En este tutorial, recopilaremos y analizaremos una página web para obtener


datos textuales y escribir la información que hemos reunido en un archivo CSV.

Prerrequisitos
Antes de trabajar en este tutorial, debe tener un entorno de programación

Python local o basado en servidor configurado en su máquina.

Debería tener instalados los módulos Solicitudes y Beautiful Soup , lo que

puede lograr siguiendo nuestro tutorial " Cómo trabajar con datos web

mediante solicitudes y Beautiful Soup con Python 3 ". También sería útil tener

una familiaridad funcional con estos módulos.

Además, dado que trabajaremos con datos eliminados de la web, debe sentirse
cómodo con la estructura y el etiquetado HTML.

Comprender los datos


En este tutorial, trabajaremos con datos del sitio web oficial de la Galería

Nacional de Arte de los Estados Unidos. La National Gallery es un museo de

arte ubicado en el National Mall en Washington, DC. Cuenta con más de


120,000 piezas datadas desde el Renacimiento hasta la actualidad, realizadas
por más de 13,000 artistas.
Nos gustaría buscar el Índice de artistas, que, en el momento de la

actualización de este tutorial, está disponible a través del Internet

Archive ‘s Wayback Machine en la siguiente URL:

https://web.archive.org/web/20170131230332/https://www.nga.gov/col

lection/an.shtm

Nota : La URL larga anterior se debe a que este sitio web ha sido archivado por
Internet Archive.

Internet Archive es una biblioteca digital sin fines de lucro que brinda acceso
gratuito a sitios de Internet y otros medios digitales. Esta organización toma
instantáneas de sitios web para preservar las historias de los sitios, y actualmente
podemos acceder a una versión anterior del sitio de la Galería Nacional que estaba
disponible cuando se escribió este tutorial por primera vez. Internet Archive es una
buena herramienta para tener en cuenta al realizar cualquier tipo de raspado de
datos históricos, incluida la comparación entre iteraciones del mismo sitio y los
datos disponibles.

Debajo del encabezado de Internet Archive, verá una página que se ve así:
Dado que haremos este proyecto para aprender sobre el raspado web con
Beautiful Soup, no necesitamos extraer demasiados datos del sitio, así que
limitemos el alcance de los datos del artista que buscamos raspar. Por lo tanto,
elija una letra (en nuestro ejemplo, elegiremos la letra Z ) y veremos una
página similar a esta:
En la página anterior, vemos que el primer artista en la lista al momento de
escribir es Zabaglia, Niccola , que es algo bueno para tener en cuenta
cuando comenzamos a extraer datos. Comenzaremos trabajando con esta
primera página, con la siguiente URL para la letra Z :

https://web.archive.org/web/20121007172955/http://www.nga.gov/coll

ection/an Z 1.htm

Es importante tener en cuenta para más adelante cuántas páginas hay en total
para la letra que está eligiendo enumerar, que puede descubrir haciendo clic
en la última página de artistas. En este caso, hay un total de 4 páginas, y el
último artista que aparece al momento de escribir es Zykmund, Václav . La
última página de artistas Z tiene la siguiente URL:

https://web.archive.org/web/20121010201041/http://www.nga.gov/coll

ection/an Z 4.htm

Sin embargo , también puede acceder a la página anterior utilizando la


misma cadena numérica de Internet Archive de la primera página:

https://web.archive.org/web/ 20121007172955 /http://www.nga.gov/co

llection/an Z 4.htm

Es importante tener en cuenta esto porque iteraremos por estas páginas más
adelante en este tutorial.

Para comenzar a familiarizarse con la configuración de esta página web, puede

echar un vistazo a su DOM , que lo ayudará a comprender cómo está

estructurado el HTML. Para inspeccionar el DOM, puede abrir las Herramientas

para desarrolladores de su navegador .

Importando las Bibliotecas


Para comenzar nuestro proyecto de codificación, activemos nuestro entorno de
programación Python 3. Asegúrese de estar en el directorio donde se
encuentra su entorno y ejecute el siguiente comando:
. my_env/bin/activate
Con nuestro entorno de programación activado, crearemos un nuevo archivo,
con nano, por ejemplo. Puede nombrar su archivo como desee, lo
llamaremos nga_z_artists.pyen este tutorial.

nano nga_z_artists.py
Dentro de este archivo, podemos comenzar a importar las bibliotecas que

usaremos: Solicitudes y Beautiful Soup.

La biblioteca de solicitudes le permite hacer uso de HTTP dentro de sus


programas de Python de una manera legible para los humanos, y el módulo
Beautiful Soup está diseñado para realizar rápidamente el raspado web.

Importaremos tanto Solicitudes como Beautiful Soup con


la importdeclaración . Para Beautiful Soup, lo importaremos desde bs4el
paquete en el que se encuentra Beautiful Soup 4.

nga_z_artists.py
# Import libraries
import requests
from bs4 import BeautifulSoup
Copiar
Con los módulos Solicitudes y Beautiful Soup importados, podemos pasar a
trabajar para recopilar primero una página y luego analizarla.

Recopilar y analizar una página web


El siguiente paso que tendremos que hacer es recopilar la URL de la primera
página web con Solicitudes. Asignaremos la URL de la primera página a
la variable page mediante el métodorequests.get() .

nga_z_artists.py
import requests
from bs4 import BeautifulSoup

# Collect first page of artists’ list


page =
requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/a
nZ1.htm')
Copiar
Nota : Debido a que la URL es larga, el código anterior y a lo largo de este tutorial
no pasará PEP 8 E501 que marca líneas de más de 79 caracteres. Es posible que
desee asignar la URL a una variable para que el código sea más legible en las
versiones finales. El código de este tutorial es para fines de demostración y le
permitirá intercambiar URL más cortas como parte de sus propios proyectos.

Ahora crearemos un BeautifulSoupobjeto o un árbol de análisis. Este objeto


toma como argumentos el page.textdocumento de Solicitudes (el contenido de
la respuesta del servidor) y luego lo analiza desde el incorporado de
Python html.parser.

nga_z_artists.py
import requests
from bs4 import BeautifulSoup

page =
requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/a
nZ1.htm')

# Create a BeautifulSoup object


soup = BeautifulSoup(page.text, 'html.parser')
Copiar

Con nuestra página recopilada, analizada y configurada como


un BeautifulSoupobjeto, podemos pasar a recopilar los datos que nos gustaría.

Extraer texto de una página web


Para este proyecto, recopilaremos los nombres de los artistas y los enlaces
relevantes disponibles en el sitio web. Es posible que desee recopilar datos
diferentes, como la nacionalidad y las fechas de los
artistas. Independientemente de los datos que desee recopilar, debe averiguar
cómo se describe en el DOM de la página web.

Para hacer esto, en su navegador web, haga clic derecho - o CTRL+ clic en
macOS - en el nombre del primer artista, Zabaglia, Niccola . Dentro del menú
contextual que aparece, debería ver un elemento de menú similar a Inspect
Element (Firefox) o Inspect (Chrome).
Una vez que haga clic en el elemento del menú Inspeccionar relevante , las
herramientas para desarrolladores web deberían aparecer dentro de su
navegador. Queremos buscar la clase y las etiquetas asociadas con los
nombres de los artistas en esta lista.
Primero veremos que la tabla de nombres está dentro de las <div>etiquetas
donde class="BodyText". Es importante tener en cuenta que solo buscamos
texto dentro de esta sección de la página web. También notamos que el
nombre Zabaglia, Niccola está en una etiqueta de enlace, ya que el nombre
hace referencia a una página web que describe al artista. Por lo tanto,
querremos hacer referencia a la <a>etiqueta para enlaces. El nombre de cada
artista es una referencia a un enlace.

Para hacer esto, usaremos Beautiful Soup find()y find_all()métodos para


extraer el texto de los nombres de los artistas del BodyText <div>.

nga_z_artists.py
import requests
from bs4 import BeautifulSoup

# Collect and parse first page


page =
requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/a
nZ1.htm')
soup = BeautifulSoup(page.text, 'html.parser')

# Pull all text from the BodyText div


artist_name_list = soup.find(class_='BodyText')

# Pull text from all instances of <a> tag within BodyText div
artist_name_list_items = artist_name_list.find_all('a')
Copiar

A continuación, en la parte inferior de nuestro archivo de programa, querremos


crear un forbucle para iterar sobre todos los nombres de artistas que
acabamos de poner en la artist_name_list_itemsvariable.

Imprimiremos estos nombres con el prettify()método para convertir el árbol


de análisis Beautiful Soup en una cadena Unicode bien formateada.

nga_z_artists.py
...
artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

# Create for loop to print out all artists' names


for artist_name in artist_name_list_items:
print(artist_name.prettify())
Copiar
Ejecutemos el programa tal como lo tenemos hasta ahora:

python nga_z_artists.py
Una vez que lo hagamos, recibiremos el siguiente resultado:
Output
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630">
Zabaglia, Niccola
</a>
...
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=3427">
Zao Wou-Ki
</a>
<a href="/web/20121007172955/https://www.nga.gov/collection/anZ2.htm">
Zas-Zie
</a>

<a href="/web/20121007172955/https://www.nga.gov/collection/anZ3.htm">
Zie-Zor
</a>

<a href="/web/20121007172955/https://www.nga.gov/collection/anZ4.htm">
<strong>
next
<br/>
page
</strong>
</a>
Lo que vemos en el resultado en este punto es el texto completo y las
etiquetas relacionadas con todos los nombres de los artistas dentro de
las <a>etiquetas que se encuentran en la <div class="BodyText">etiqueta en la
primera página, así como también un texto de enlace adicional en la parte
inferior. Como no queremos esta información adicional, trabajemos para
eliminarla en la siguiente sección.

Eliminar datos superfluos


Hasta ahora, hemos podido recopilar todos los datos del texto del enlace
dentro de una <div>sección de nuestra página web. Sin embargo, no queremos
tener los enlaces inferiores que no hagan referencia a los nombres de los
artistas, así que trabajemos para eliminar esa parte.

Para eliminar los enlaces inferiores de la página, nuevamente haga clic derecho
e Inspeccione el DOM. Veremos que los enlaces en la parte inferior de la <div
class="BodyText">sección están contenidos en una tabla HTML <table
class="AlphaNav">:
Por lo tanto, podemos usar Beautiful Soup para encontrar la AlphaNavclase y
usar el decompose()método para eliminar una etiqueta del árbol de análisis y
luego destruirla junto con su contenido.

Usaremos la variable last_linkspara hacer referencia a estos enlaces inferiores


y agregarlos al archivo de programa:

nga_z_artists.py
import requests
from bs4 import BeautifulSoup

page =
requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/a
nZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

# Remove bottom links


last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:


print(artist_name.prettify())
Copiar

Ahora, cuando ejecutamos el programa con el python nga_z_artist.pycomando,


recibiremos el siguiente resultado:

Output
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=11630">
Zabaglia, Niccola
</a>
<a href="/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?artistid=34202">
Zaccone, Fabian
</a>
...
<a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=11631">
Zanotti, Giampietro
</a>
<a href="/web/20121007172955/http://www.nga.gov/cgi-bin/tsearch?artistid=3427">
Zao Wou-Ki
</a>
En este punto, vemos que la salida ya no incluye los enlaces en la parte inferior
de la página web, y ahora solo muestra los enlaces asociados con los nombres
de los artistas.

Hasta ahora, hemos apuntado específicamente a los enlaces con los nombres
de los artistas, pero tenemos los datos de etiquetas adicionales que realmente
no queremos. Eliminemos eso en la siguiente sección.

Extraer el contenido de una etiqueta


Para acceder solo a los nombres reales de los artistas, querremos dirigirnos al
contenido de las <a>etiquetas en lugar de imprimir la etiqueta de enlace
completa.

Podemos hacer esto con Beautiful Soup's .contents, que devolverá los


elementos secundarios de la etiqueta como un tipo de datos de lista
de Python .

Revisemos el forciclo para que, en lugar de imprimir el enlace completo y su


etiqueta, imprimamos la lista de niños (es decir, los nombres completos de los
artistas):
nga_z_artists.py
import requests
from bs4 import BeautifulSoup

page =
requests.get('https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/a
nZ1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

# Use .contents to pull out the <a> tag’s children


for artist_name in artist_name_list_items:
names = artist_name.contents[0]
print(names)
Copiar
Tenga en cuenta que estamos iterando sobre la lista anterior llamando

al número de índice de cada elemento.

Podemos ejecutar el programa con el pythoncomando para ver el siguiente


resultado:

Output
Zabaglia, Niccola
Zaccone, Fabian
Zadkine, Ossip
...
Zanini-Viola, Giuseppe
Zanotti, Giampietro
Zao Wou-Ki
Hemos recibido lo que es una lista de los nombres de todos los artistas
disponibles en la primera página de la letra Z .

Sin embargo, ¿qué pasa si queremos capturar también las URL asociadas con
esos artistas? Podemos extraer las URL que se encuentran dentro de
las <a>etiquetas de una página utilizando el get('href')método de Beautiful
Soup .

De la salida de los enlaces anteriores, sabemos que no se está capturando toda


la URL, por lo que concatenaremos la cadena de enlace con el frente de la
cadena de URL (en este caso https://web.archive.org/).
Estas líneas también las agregaremos al forbucle:

nga_z_artists.py
...
for artist_name in artist_name_list_items:
names = artist_name.contents[0]
links = 'https://web.archive.org' + artist_name.get('href')
print(names)
print(links)
Copiar
Cuando ejecutamos el programa anterior, recibiremos tanto los nombres de
los artistas como las URL de los enlaces que nos informan más sobre los
artistas:

Output
Zabaglia, Niccola
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?
artistid=11630
Zaccone, Fabian
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?
artistid=34202
...
Zanotti, Giampietro
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?
artistid=11631
Zao Wou-Ki
https://web.archive.org/web/20121007172955/https://www.nga.gov/cgi-bin/tsearch?
artistid=3427
Aunque ahora estamos obteniendo información del sitio web, actualmente solo
se está imprimiendo en nuestra ventana de terminal. En su lugar, capturemos
estos datos para poder usarlos en otro lugar escribiéndolos en un archivo.

Escribir los datos en un archivo CSV


Recopilar datos que solo viven en una ventana de terminal no es muy útil. Los
archivos de valores separados por comas (CSV) nos permiten almacenar datos
tabulares en texto plano, y es un formato común para hojas de cálculo y bases

de datos. Antes de comenzar con esta sección, debe familiarizarse con la forma

de manejar archivos de texto sin formato en Python .


Primero, necesitamos importar el csvmódulo integrado de Python junto con los
otros módulos en la parte superior del archivo de programación de Python:

import csv
Copiar

A continuación, crearemos y abriremos un archivo llamado z-artist-


names.csvpara que escribamos (usaremos la variable fpara el archivo aquí)
usando el 'w'modo. También escribiremos los encabezados de la fila
superior: Namey los Linkpasaremos al writerow()método como una lista:
f = csv.writer(open('z-artist-names.csv', 'w'))
f.writerow(['Name', 'Link'])
Copiar

Finalmente, dentro de nuestro forciclo, escribiremos cada fila con los


artistas namesy sus asociados links:

f.writerow([names, links])
Copiar
Puede ver las líneas para cada una de estas tareas en el archivo a
continuación:

nga_z_artists.py
import requests
import csv
from bs4 import BeautifulSoup

page =
requests.get('https://web.archive.org/web/20121007172955/http://www.nga.gov/collection/an
Z1.htm')

soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

# Create a file to write to, add headers row


f = csv.writer(open('z-artist-names.csv', 'w'))
f.writerow(['Name', 'Link'])

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:


names = artist_name.contents[0]
links = 'https://web.archive.org' + artist_name.get('href')

# Add each artist’s name and associated link to a row


f.writerow([names, links])
Copiar
Cuando ejecuta el programa ahora con el pythoncomando, no se devolverá
ningún resultado a su ventana de terminal. En su lugar, se creará un archivo en
el directorio en el que está trabajando llamado z-artist-names.csv.
Dependiendo de lo que use para abrirlo, puede verse así:

z-artist-names.csv

Name,Link
"Zabaglia,
Niccola",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-
bin/tsearch?artistid=11630
"Zaccone,
Fabian",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-
bin/tsearch?artistid=34202
"Zadkine, Ossip",https://web.archive.org/web/20121007172955/http://www.nga.gov/cgi-
bin/tsearch?artistid=3475w
...
O bien, puede parecerse más a una hoja de cálculo:
En cualquier caso, ahora puede usar este archivo para trabajar con los datos de
manera más significativa, ya que la información que ha recopilado ahora se
almacena en la memoria de su computadora.
Recuperando páginas relacionadas
Hemos creado un programa que va a extraer datos de la primera página de la
lista de artistas cuyos apellidos comiencen con la letra Z . Sin embargo, hay 4
páginas en total de estos artistas disponibles en el sitio web.

Para recopilar todas estas páginas, podemos realizar más iteraciones


con forbucles. Esto revisará la mayor parte del código que hemos escrito hasta
ahora, pero empleará conceptos similares.

Para comenzar, queremos inicializar una lista para contener las páginas:

pages = []
Copiar

Completaremos esta lista inicializada con el siguiente forbucle:

for i in range(1, 5):


url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ'
+ str(i) + '.htm'
pages.append(url)
Copiar

Anteriormente en este tutorial , notamos que deberíamos prestar atención a la


cantidad total de páginas que contienen nombres de artistas que comienzan
con la letra Z (o cualquier letra que estemos usando). Como hay 4 páginas
para la letra Z , construimos el forbucle anterior con un rango de 1a 5para que
recorra cada una de las 4 páginas.

Para este sitio web específico, las URL comienzan con la


cadena https://web.archive.org/web/20121007172955/https://www.nga.gov/collect
ion/anZy luego se siguen con un número para la página (que será el número
entero idel forbucle que convertimos en una cadena ) y terminan
con .htm. Concatenaremos estas cadenas juntas y luego agregaremos el
resultado a la pageslista.

Además de este ciclo, tendremos un segundo ciclo que pasará por cada una de
las páginas anteriores. El código en este forbucle será similar al código que
hemos creado hasta ahora, ya que está haciendo la tarea que completamos
para la primera página de los artistas de la letra Z para cada una de las 4
páginas en total. Tenga en cuenta que debido a que hemos colocado el
programa original en el segundo forciclo, ahora tenemos el ciclo original como
un ciclo anidadofor contenido en él.

Los dos forbucles se verán así:


pages = []

for i in range(1, 5):


url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ'
+ str(i) + '.htm'
pages.append(url)

for item in pages:


page = requests.get(item)
soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:


names = artist_name.contents[0]
links = 'https://web.archive.org' + artist_name.get('href')

f.writerow([names, links])
Copiar

En el código anterior, debería ver que el primer forciclo está iterando sobre las
páginas y el segundo forciclo está raspando datos de cada una de esas
páginas y luego agrega los nombres y enlaces de los artistas línea por línea a
través de cada fila de cada página.

Estos dos forbucles se encuentran debajo de las importdeclaraciones, la


creación y escritura del archivo CSV (con la línea para escribir los encabezados
del archivo) y la inicialización de la pagesvariable (asignada a una lista).

Dentro del contexto más amplio del archivo de programación, el código


completo se ve así:

nga_z_artists.py
import requests
import csv
from bs4 import BeautifulSoup

f = csv.writer(open('z-artist-names.csv', 'w'))
f.writerow(['Name', 'Link'])

pages = []

for i in range(1, 5):


url = 'https://web.archive.org/web/20121007172955/https://www.nga.gov/collection/anZ'
+ str(i) + '.htm'
pages.append(url)

for item in pages:


page = requests.get(item)
soup = BeautifulSoup(page.text, 'html.parser')

last_links = soup.find(class_='AlphaNav')
last_links.decompose()

artist_name_list = soup.find(class_='BodyText')
artist_name_list_items = artist_name_list.find_all('a')

for artist_name in artist_name_list_items:


names = artist_name.contents[0]
links = 'https://web.archive.org' + artist_name.get('href')

f.writerow([names, links])
Copiar
Dado que este programa está haciendo un poco de trabajo, tomará un poco de
tiempo crear el archivo CSV. Una vez hecho, la salida estará completa,
mostrando los nombres de los artistas y sus enlaces asociados
desde Zabaglia, Niccola a Zykmund, Václav .

Ser considerado
Al raspar páginas web, es importante ser considerado con los servidores de los
que obtiene información.

Verifique si un sitio tiene términos de servicio o términos de uso relacionados


con el raspado web. Además, verifique si un sitio tiene una API que le permita
obtener datos antes de eliminarlos usted mismo.

Asegúrese de no golpear continuamente los servidores para recopilar


datos. Una vez que haya recopilado lo que necesita de un sitio, ejecute scripts
que repasen los datos localmente en lugar de cargar los servidores de otra
persona.

Además, es una buena idea raspar con un encabezado que tenga su nombre y
correo electrónico para que un sitio web pueda identificarlo y hacer un
seguimiento si tienen alguna pregunta. Un ejemplo de un encabezado que
puede usar con la biblioteca de solicitudes de Python es el siguiente:

import requests
headers = {
'User-Agent': 'Your Name, example.com',
'From': '[email protected]'
}

url = 'https://example.com'

page = requests.get(url, headers = headers)


Copiar
El uso de encabezados con información identificable garantiza que las personas
que revisan los registros de un servidor puedan comunicarse con usted.

Conclusión
Este tutorial pasó por usar Python y Beautiful Soup para raspar datos de un
sitio web. Almacenamos el texto que reunimos dentro de un archivo CSV.

Puede continuar trabajando en este proyecto recopilando más datos y haciendo


que su archivo CSV sea más robusto. Por ejemplo, es posible que desee incluir
las nacionalidades y años de cada artista. También puede usar lo que ha
aprendido para extraer datos de otros sitios web.

Para continuar aprendiendo sobre cómo extraer información de la web, lea

nuestro tutorial " Cómo rastrear una página web con Scrapy y Python 3 ".

También podría gustarte