
Web Scraping en Python
En algunos casos, es posible que deseemos obtener algunos datos de sitios web para usar en nuestras aplicaciones o software en el que estamos trabajando. Supongamos que queremos saber los "Próximos eventos" en el sitio web de Python, pero no quieres visitar el sitio web de Phyton cada vez para ver si hay un evento nuevo en el sitio web.
Para manejar este problema, imagina que estás trabajando en un bot de Python que envía un correo electrónico a tu dirección de correo cuando se publica un nuevo evento próximo en el sitio web de Python. En este caso, generalmente usaríamos una API donde enviamos una solicitud GET para traernos los nuevos eventos. Pero ¿qué pasa si no tienen una API pública en la que podamos hacer una solicitud GET? Aquí es donde entra en juego el web scraping.
Utilizando técnicas de web scraping podemos obtener el código fuente HTML de un sitio web, y de esta forma, podemos conseguir algunos datos valiosos como algunos textos o enlaces, es fácil analizar el código fuente HTML usando unas pocas líneas de código.
Lo primero es lo primero, a continuación, puedes ver el código completo y luego explicaré cómo funciona paso a paso.
import requests
import cssselect
from lxml import html
def get_events(url, css_selector):
response = requests.get(url)
status_code = response.status_code
if status_code == 200:
content = str(response.content, 'utf-8')
tree = html.fromstring(content)
titles = tree.cssselect(css_selector)
for title in titles:
print(title.text_content())
if __name__ == "__main__":
get_events(
'https://www.python.org',
'div.event-widget > div.shrubbery > ul.menu > li > a',
)
En Python hay diferentes bibliotecas para web crawling como "lxml" y "BeautifulSoup". Personalmente me gusta usar lxml. Si quieres saber más acerca de "BeautifulSoup", puedes consultar en su documentación para obtener más detalles.
En la definición de la función estamos pasando dos parámetros. url: esta es la URL del sitio web al cual queremos hacer web scrapping. css_selector: usamos un selector css para seleccionar algunas etiquetas específicas.
response = requests.get(url)
Hacemos una solicitud GET al sitio web y el resultado lo guardamos en la variable response.
if status_code == 200
En esta línea comprobamos si la solicitud se ha realizado correctamente, comprobando que el código de estado es 200.
content = str(response.content, ‘utf-8’)
El contenido es el código fuente HTML del sitio web. Analizaremos ese contenido.
Nota: algunos sitios web no utilizan codificación utf-8 o Unicode. En este caso, podemos tener algunos caracteres extraños en nuestro resultado. Es por eso que estamos pasando un parámetro llamado "utf-8".
tree = html.fromstring(content)
La función html.fromstring analiza el codigo HTML y devuelve un solo elemento/documento.
titles = tree.cssselect(css_selector)
Usamos un selector de CSS para seleccionar el elemento HTML que queremos analizar y en este caso obtenemos los títulos de los próximos eventos.
for title in titles:
print(title.text_content())
Aquí estamos iterando todos los títulos de los próximos eventos usando un bucle for. La función text_content() nos da el texto dentro de una etiqueta. Podríamos obtener un atributo (como "href") usando la función attrib ["href"]. Para obtener más información, puede consultarlo en la documentación oficial.
Ahora es momento de llamar nuestro método.
get_events(
'https://www.python.org',
'div.event-widget > div.shrubbery > ul.menu > li > a'
)
El resultado será;

Obtuvimos el resultado correctamente. Ahora, aclaremos la parte de los selectores de CSS. Primero, vaya al sitio web original de Python. En la página, desplácese un poco hacia abajo, y verá una parte llamada "Upcoming Events".

Haga clic derecho en uno de los títulos de los eventos y luego haga clic en "Inspeccionar".

Como puede ver, aquí tenemos algunos elementos HTML anidados. Entonces, en nuestro selector, no solo usamos la etiqueta <a> para seleccionar el título, porque puede haber muchas más etiquetas <a> en el documento HTML, por lo tanto, usamos un selector más específico para seleccionar solo la parte de "Upcoming Events".
Recordemos el selector css que pasamos en nuestra función
'div.event-widget > div.shrubbery > ul.menu > li > a'
En general, los desarrolladores y diseñadores web utilizan los selectores CSS para darle estilos a los elementos HTML y para controlar el DOM mediante JS, pero en este caso también lo usamos para hacer web scraping.
Nota: El web scraping tiene una desventaja. Cuando el propietario del sitio web reconstruye el sitio web o cambia su estilo, no podremos usar nuestro selector como antes. En este caso, necesitamos cambiar nuestro selector CSS. Aunque el web scraping tiene una desventaja como esa, sigue siendo una buena opción cuando no tenemos una API para obtener datos de sitios web.
Definitivamente el web scraping puede ser de mucha utilidad en situaciones muy específicas cuando no se cuenta con una API púbica, además es una técnica ampliamente utilizada junto a web crawling.
Contenido del articulo
- Comentarios
Comentarios
No hay comentarios. Inicia sesión para comentar.