python:webscraping
Diferencias
Muestra las diferencias entre dos versiones de la página.
| Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
| python:webscraping [2024/02/03 01:01] – [Módulo requests] alberto | python:webscraping [2024/02/05 19:00] (actual) – [Encontrar elementos] alberto | ||
|---|---|---|---|
| Línea 18: | Línea 18: | ||
| ===== Módulo requests ===== | ===== Módulo requests ===== | ||
| + | Con este módulo es posible descargar archivos de la web de forma sencilla. \\ | ||
| + | No viene por defecto instalado con python, por lo que habría que ejecutar: | ||
| + | <code python> | ||
| + | pip install --user requests | ||
| + | </ | ||
| + | |||
| + | Python dispone de la librería ulllib2 para este cometido, pero es complicada de manejar. | ||
| + | |||
| + | Para descargar una página web, o un archivo, basta con especificar la URL en la fución .get() | ||
| + | <code python> | ||
| + | import requests | ||
| + | res = requests.get(' | ||
| + | type(res) | ||
| + | res.status_code == requests.codes.ok | ||
| + | len(res.txt) | ||
| + | print(rest.text[: | ||
| + | type(res) | ||
| + | res.status_code == requests.codes.ok | ||
| + | len(res.txt) | ||
| + | print(rest.text[: | ||
| + | </ | ||
| + | |||
| + | ==== Chequeo de errores ==== | ||
| + | requests dispone del atributo **status_code**, | ||
| + | |||
| + | Podemos usar el método **res.raise_for_status()** (no lleva parámetros) para lanzar una excepción si se produce un error. Si no queremos ser tan radicales y queremos que se siga ejecutando el programa manejando lo que se hace, podemos y usar la sentencia //try//: | ||
| + | <code python> | ||
| + | import requests | ||
| + | res = requests.get(' | ||
| + | |||
| + | try: | ||
| + | res.raise_for_status() | ||
| + | except Exception as exc: | ||
| + | print(' | ||
| + | |||
| + | print ("\nEl programa continúa" | ||
| + | </ | ||
| + | |||
| + | ==== Guardar archivos en el disco duro ==== | ||
| + | Para guardar el archivo descargado, usamos las funciones **open()** y **write()** habituales. \\ | ||
| + | Sólo tenemos que tener en cuenta un par de cosas: | ||
| + | * Deben de abrirse (open) en formato ' | ||
| + | * Usar el método **ither_content(**número de bytes**)**, que divide el archivo en porciones del número de bytes especificado, | ||
| + | |||
| + | En resumen: | ||
| + | - Llamada a requests.get() para descargar el archivo. | ||
| + | - Llamada a open() con ' | ||
| + | - Bucle con el método iter_content(). | ||
| + | - Llamar a write en cada iteración del bucle para escribir (guardar) el contenido. | ||
| + | - Cerrar el archivo con close(). | ||
| + | |||
| + | <code python> | ||
| + | import requests | ||
| + | res = requests.get(' | ||
| + | res.raise_for_status() | ||
| + | playFile = open(' | ||
| + | for chunk in res.iter_content(100000): | ||
| + | playFile.write(chunk) | ||
| + | </ | ||
| ===== Módulo bs4 ===== | ===== Módulo bs4 ===== | ||
| + | El módulo //Beautiful Soup version 4// tampoco forma parte de python, y puede instalarse con: | ||
| + | <code python> | ||
| + | pip install --user beautifulsoup4 | ||
| + | |||
| + | import bs4 | ||
| + | </ | ||
| + | |||
| + | El módulo **bs4** sirve para parsear código HTML. \\ | ||
| + | **Parsear**: | ||
| + | |||
| + | De este modo, la idea es poder identificar los elementos HTML que nos interese y recuperarlos para extraer información. \\ | ||
| + | |||
| + | Para poder trabajar de este modo, necesitamos convertir la información del HTML en un objeto tipo // | ||
| + | El método **bs4.BeautifulSoup()** necesita un string con el texto del HTML que será parseado, el cual es posible obtenerlo con la función requests.get() que vimos anteriormente, | ||
| + | <code python> | ||
| + | import requests, bs4 | ||
| + | res = requests.get(' | ||
| + | res.raise_for_status() | ||
| + | noStarchSoup = bs4.BeautifulSoup(res.text, | ||
| + | type(noStarchSoup) | ||
| + | </ | ||
| + | |||
| + | También es posible pasar un documento HTML que se encuentre en local con la función open() | ||
| + | <code python> | ||
| + | exampleFile = open(' | ||
| + | exampleSoup = bs4.BeautifulSoup(exampleFile, | ||
| + | type(exampleSoup) | ||
| + | </ | ||
| + | |||
| + | También puede usarse el parseador ' | ||
| + | |||
| + | ==== Encontrar elementos ==== | ||
| + | Para identificar los elementos que interesen en el HTML, usaremos los selectores CSS. \\ | ||
| + | Para obtener estos elementos usaremos el método **.select()**\\ | ||
| + | |||
| + | {{ : | ||
| + | |||
| + | Se pueden utilizar varios patrones de selectores para realizar búsquedas más sofisticadas, | ||
| + | |||
| + | El método **.select** devuelve una lista de objetos tipo //tag//, que es como BeautifulSoup representa los elementos HTML. Pueden ser pasados a string sin problemas con la función str(). \\ | ||
| + | |||
| + | Los elementos tipo " | ||
| + | |||
| + | También es posible obtener el texto que se encuentra asociado a un elemento HTML (el que aparece en la web) a través del método **.getText()**. | ||
| + | |||
| + | Suponemos el siguiente código HTML | ||
| + | <code html> | ||
| + | <!-- This is the example.html example file. --> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | inventwithpython.com"> | ||
| + | <p class=" | ||
| + | <p>By <span id=" | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | Podemos buscar elementos del siguiente modo, directamente en la terminal de python: | ||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | <class ' | ||
| + | >>> | ||
| + | 1 | ||
| + | >>> | ||
| + | <class ' | ||
| + | >>> | ||
| + | '< | ||
| + | >>> | ||
| + | 'Al Sweigart' | ||
| + | >>> | ||
| + | {' | ||
| + | >>> | ||
| + | >>> | ||
| + | '< | ||
| + | inventwithpython.com"> | ||
| + | >>> | ||
| + | ' | ||
| + | >>> | ||
| + | '<p class=" | ||
| + | >>> | ||
| + | 'Learn Python the easy way!' | ||
| + | >>> | ||
| + | '< | ||
| + | >>> | ||
| + | 'By Al Sweigart' | ||
| + | </ | ||
| + | ==== Obtener datos de atributos de elementos ==== | ||
| + | Para obtener fácilmente los valores de los atributos de un elemento (objeto tipo tag), podemos usar el método **get()**. Se le pasa el string del nombre de un atributo, y devuelve su valor. Vemos un ejemplo en la consola de Python: | ||
| + | <code python> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | >>> | ||
| + | '< | ||
| + | >>> | ||
| + | ' | ||
| + | >>> | ||
| + | True | ||
| + | >>> | ||
| + | {' | ||
| + | </ | ||
| ===== Módulo selenium ===== | ===== Módulo selenium ===== | ||
python/webscraping.1706918499.txt.gz · Última modificación: por alberto
