Herramientas de usuario

Herramientas del sitio


informatica:programacion:python:web_scraping

¡Esta es una revisión vieja del documento!


Python: Web Scraping

import webbrowser
 
# Abre el navegador en cierta página:
webbrowser.open("https://example.org")

En el web scraping, normalmente se siguen unos pasos:

  1. Definir la URL de base
  2. Hacer petición a esa URL
  3. Obtener respuesta HTML
  4. Extraer datos del HTML
  5. Volver al paso 2 con nuevas URLs.

XPath

Lenguaje para el procesado de documentos XML.

Buscar en cualquier parte del documento:

//

Para buscar cualquier etiqueta h1:

//h1

Después de definir el step, añadimos un predicado al step para afinar más la búsqueda:

//h1[@class="title"]

Con la expresión anterior estaríamos buscando etiquetas h1 por el atributo class con el valor title.

Podemos usar operadores lógicos para añadir expresiones:

//h1[@class="title" or @class="subtitle"]

Una vez encontremos un elemento de partida, podemos hacer búsquedas dentro de él añadiéndolo a la expresión:

//div[@class="container container-uno"]//li

En los predicados podemos indicar la posición de los elementos que queremos buscar:

//div[@class="container container-uno"]//li[1]

Solo nos quedaríamos con el primer li

Si solo nos queremos quedar con el texto que contiene cierto elemento:

//h1[contains(text(), "This is")]/text()

Si solo queremos obtener el valor de un atributo:

//h1[contains(text(), "This is")]/@class

En los navegadores Google Chrome y Mozilla Firefox se pueden probar expresiones XPath desde la consola de las herramientas de desarrolladores introduciendo las expresiones en $x(): $x(“h2[1]”) </WRAP> ==== Funciones ==== * position * contains * starts-with * not * text <code xpath> div[@class=“container container-uno”]li[starts-with(@id, “elem”)] </code> Obtiene todos los li cuyo atributo id comience por elem. Si queremos buscar por un texto: <code xpath> h1[contains(text(), “Hola, mundo”)] </code> Nos buscará todos los elementos h1 que contengan el texto Hola, mundo. ===== Descargar ficheros ===== El módulo no viene incluido por defecto en la instalación de Python así que hay que instalarlo con pip: pip install requests * Requests: HTTP for Humans™ <code python> import requests res = requests.get(“https://example.org/fichero”) # 'res' es el objeto con la respuesta # Resultado de la petición res.status_code # Resultado # 200 → Si ha ido bien El contenido de la descarga está en: res.text </code> ===== Procesar HTML ===== Es necesario instalar BeautifulSoup: pip install beautifulsoup4 * Beautiful Soup: We called him Tortoise because he taught us <code python> import bs4 import requests # es el módulo que hará la descarga # Para las webs que no permiten scraping, le hacemos creer que # nos estamos conectando con un navegador headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.71 Safari/537.36'} res = requests.get(“https://www.amazon.es/dp/B07DLRWFF8/”, headers = headers) # Nos aseguramos de que no ha habido errores al descargar la web anterior res.raise_for_status() soup = bs4.BeautifulSoup(res.text, “html.parser”) # Se crea un objeto 'BeautifulSoup' donde se podrán hacer búsquedas # utilizando selectores CSS, por ejemplo: elementos = soup.select('<ruta CSS al elemento que interesa>') # Eliminamos el HTML quedándonos solo con el texto: elementos[0].text # Quitamos también saltos de línea y espacios: elementos[0].text.strip() </code> ===== Interacción automática con webs ===== Usar el navegador sin intervención del usuario, de forma automática. Es necesario instalar Selenium: pip install selenium * Selenium with Python <code python> from selenium import webdriver # Para lanzar el Firefox browser = webdriver.Firefox() # Para abrir una web en esa instancia de Firefox browser.get(“http://example.org”) </code> Si queremos simular un click en cierto elemento: <code python> # Buscamos el elemento mediante selector CSS: elem = browser.find_element_by_css_selector('<selector CSS al elemento>') elem.click() </code> Si sabemos que hay más de un elemento con el mismo selector CSS, el método cambia: <code python> # Buscamos los elementos mediante selector CSS: elem = browser.find_elements_by_css_selector('<selector CSS a los elementos>') </code> ^ Método ^ Objeto / lista devuelto ^ | browser.find_element_by_class_name(name) | Elementos que tengan la clase name | | browser.find_elements_by_class_name(name) | Elementos que tengan la clase name | | browser.find_element_by_css_selector(selector) | Elemento que tengan el selector CSS | | browser.find_elements_by_css_selector(selector) | Elementos que tengan el selector CSS | | browser.find_element_by_id(id) | Elemento con el id igual a id | | browser.find_elements_by_id(id) | Elementos con el id igual a id | | browser.find_element_by_link_text(texto) | Enlace con el texto texto | | browser.find_elements_by_link_text(texto) | Enlaces con el texto texto | | browser.find_element_by_partial_link_text(texto) | Enlaces que contengan el texto texto | | browser.find_elements_by_partial_link_text(texto) | Enlaces que contengan el texto texto | | browser.find_element_by_name(name) | Elemento con un atributo name | | browser.find_elements_by_name(name) | Elementos con un atributo name | | browser.find_element_by_tag_name(name) | Elemento con la etiqueta name | | browser.find_elements_by_tag_name(name) | Elementos con la etiqueta name | ==== Enviar texto ==== Por ejemplo para formularios: <code python> # Buscamos el elemento elem = browser.find_element_by_css_selector('ruta CSS al elemento') elem.send_keys('texto') # Enviamos el formulario elem.submit() </code> ==== Navegación ==== * browser.back(): página anterior * browser.forward(): página siguiente * browser.refresh(): actualizar página * browser.quit(): cerrar el navegador ==== Scraping ==== Al seleccionar un elemento, podemos acceder al texto con el atributo text: <code python> elem = browser.find_element_by_css_selector('<selector CSS al elemento>') elem.text </code> Si quisiésemos todo el código HTML de la página: <code python> elem = find_element_by_css_selector('html') </code> ===== Recursos ===== * Everything you Need to Know About Web Scraping

informatica/programacion/python/web_scraping.1621677154.txt.gz · Última modificación: por tempwin