Guía de Web Scraping con Python usando Beautiful Soup
Publicado: 2020-06-23Introducción al Web Scraping con Python:
Cuando se trata de web scraping, se prefieren algunos lenguajes de programación sobre otros. Uno de los más populares entre estos es Python. Además de ser uno de los lenguajes más fáciles de aprender debido a su curva de aprendizaje más suave, también tiene la ventaja de ser un lenguaje con soporte masivo para desarrolladores, lo que ha llevado a numerosos paquetes de terceros. Estos paquetes se pueden usar para múltiples funcionalidades, que pueden ser difíciles de realizar con el núcleo de Python. Algunos ejemplos comunes son: para procesamiento de imágenes o visión por computadora, usamos OpenCV, para aprendizaje automático, usamos TensorFlow y para trazar gráficos, usamos MatplotLib. Cuando se trata de web scraping, una de las bibliotecas más utilizadas es BeautifulSoup. Esta biblioteca no extrae específicamente datos de Internet, pero en caso de que pueda obtener el archivo HTML de una página web, puede ayudar a extraer puntos de datos específicos. En general, la biblioteca se utiliza para extraer puntos de datos de documentos XML y HTML.
¿Cómo funciona BeautifulSoup?
Antes de pasar a escribir código en Python, debe comprender cómo funciona BeautifulSoup. Una vez que haya extraído el contenido HTML de una página web y lo haya almacenado en una variable, digamos html_obj, puede convertirlo en un objeto BeautifulSoup con solo una línea de código.
| sopa_obj = HermosaSopa(html_obj, 'html.parser') |
Donde html_obj son los datos HTML, soup_obj es el objeto bs que se ha obtenido y “html.parser” es el analizador que se utilizó para realizar la conversión. Una vez que tenga el objeto bs, llamado soup_obj, recorrerlo es muy fácil y dado que recorrerlo es lo suficientemente sencillo, la extracción de datos también se vuelve simple. Tomemos un ejemplo. Digamos que necesita obtener un punto de datos llamado título del producto, que está presente en cada página de un sitio web de comercio electrónico. Ahora descargó una sola página de producto HTML de ese sitio web y se dio cuenta de que cada página tiene el nombre del producto mencionado en un elemento de tipo span con id como productTitle. Entonces, ¿cómo obtendrá estos datos de, digamos, 1000 páginas de productos? Bueno, obtendrá los datos HTML para cada página y obtendrá el punto de datos de esta manera:
| para tramos en sopa.findAll('span', attrs={'id': 'productTitle'}): nombre_del_producto = spans.text.strip() |
Si bien esta es una forma de obtener datos textuales presentes entre un determinado elemento de etiqueta, también puede obtener datos de los atributos de una etiqueta.

¿Cómo extraer datos de páginas web usando BeautifulSoup?
Ahora que tenemos una comprensión básica de cómo se atraviesa un objeto bs, escribamos algo de código y veamos cómo funciona. Usando el fragmento de código a continuación, puede extraer datos de Zillow, un mercado inmobiliario líder con sede en los EE. UU. muy fácilmente. Puede ejecutar este código e ingresar la URL de una lista para obtener los datos de salida en formato JSON. Entendamos el código, línea por línea. Lo primero es lo primero, asegúrese de tener Python 3.7 o superior instalado en su máquina. Usa pip para instalar BeautifulSoup. Todos los demás paquetes vienen preempaquetados con Python, por lo que no necesitará instalar ninguno de ellos. Una vez hecho esto, instale un editor de código como Atom o VS Code, y estará listo para comenzar. Comprender el código es importante y, por lo tanto, comenzaremos desde la primera línea. Necesita las cuatro declaraciones de importación para una funcionalidad específica. A continuación, tiene tres líneas que comienzan con "ctx". Estos son específicamente para ignorar los errores del certificado SSL que podría enfrentar al acceder a sitios web a través de su código. A continuación, tomamos la URL del sitio web como entrada del usuario. Aquí también puede codificar la URL, o incluso tener una matriz de múltiples URL.
Proceso de raspado web:
A continuación, accedemos a la página web mediante la función Solicitar de urllib. Asegúrese de agregar el User-Agent en el encabezado para que el sitio web crea que está utilizando un navegador. La razón detrás de hacer esto es que los sitios web están destinados a ser accedidos por navegadores y no por código, y por lo tanto pueden bloquear su IP si lo atrapan. Una vez hecho esto, hemos completado todos los pasos básicos y, a continuación, convertiremos el objeto HTML en un objeto bs y luego lo embelleceremos en el formato utf-8, para manejar caracteres especiales y símbolos en la página web. Una vez hecho esto, extraemos el título, los detalles breves y otras propiedades analizando el objeto bs. Como puede ver, en la etiqueta del script con tipo de atributo = application/ld+json, hay varios puntos de datos, todos almacenados en formato JSON. Además, puede ver que usamos un control i==0 e i==1. Esto se debe a que hay dos etiquetas de script (con el mismo atributo) como esta en una página. La primera etiqueta nos da algunos puntos de datos, mientras que la segunda nos da el resto. Una vez que hayamos extraído todos los puntos de datos, puede almacenarlo en un archivo JSON y guardarlo como lo hemos hecho. También puede guardarlo, cargarlo en un sitio o incluso acceder a una API con los datos si lo desea.

| importar json importar ssl de urllib.request Solicitud de importación, urlopen de bs4 importar BeautifulSoup # Ignorar errores de certificado SSL # Tome la URL de la lista de Zillow como entrada # Haz que el sitio web crea que estás usando un navegador # página HTML -> sopa de objetos BeautifulSoup = BeautifulSoup(página web, 'html.parser') # Extraer diferentes puntos de datos de la lista de propiedades para meta en sopa.findAll('meta', attrs={'nombre': 'descripción'}): para div en sopa.findAll('div', attrs={'clase': 'character-count-truncated'}): for (i, script) en enumerate(soup.findAll('script', con open('house_listing_data.json', 'w') como archivo de salida: con open('house_listing_data.html', 'wb') como archivo: print('———-La extracción de datos está completa. Verifique el archivo json.———-') |
El JSON de salida debería verse algo así:
| { “detalles_largo”: { “nº_de_habitaciones”: 3, “floor_size_in_sqrft”: “1,392” }, "Dirección": { “calle”: “22516 Joan Dr”, “localidad”: “California”, “región”: “MD”, “código_postal”: “20619” }, “Título”: “22516 Joan Dr, California, MD 20619 | MLS n.° MDSM167670”, “details_short”: “22516 Joan Dr , California, MD 20619-3175 es una casa unifamiliar listada para la venta en $150,000. La casa de 1,392 pies cuadrados es una propiedad de 3 dormitorios y 2.0 baños. Encuentre 40 fotos de la casa 22516 Joan Dr en Zillow. Vea más detalles de propiedades, historial de ventas y datos de Zestimate en Zillow. MLS n.° MDSM167670”, “precio_en_dólares”: 150000, “imagen”: “https://photos.zillowstatic.com/p_h/ISn2oi3glpvdv10000000000.jpg” } |
Conclusión:
Usar BeautifulSoup para sus necesidades de raspado web puede ser fácil siempre que pueda analizar las páginas HTML manualmente al principio y decidir las etiquetas que deben orientarse. Puede funcionar en páginas que no tienen ningún contenido dinámico y no se sientan detrás de una página de inicio de sesión. Para páginas web más complejas, necesitará herramientas más complejas. Nuestro equipo en PromptCloud ayuda a las empresas que buscan aprovechar los datos y tomar decisiones respaldadas por datos. No solo ayudamos a configurar motores de web scraping totalmente automatizados que se ejecutan a intervalos frecuentes en la nube, sino que también ayudamos a las empresas a analizar los datos para extraer tendencias y otra información útil.
