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

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

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

Procesar HTML

Es necesario instalar BeautifulSoup: pip install beautifulsoup4

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()

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

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")

Si queremos simular un click en cierto elemento:

# Buscamos el elemento mediante selector CSS:
elem = browser.find_element_by_css_selector('<selector CSS al elemento>')
elem.click()

Si sabemos que hay más de un elemento con el mismo selector CSS, el método cambia:

# Buscamos los elementos mediante selector CSS:
elem = browser.find_elements_by_css_selector('<selector CSS a los elementos>')
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:

# Buscamos el elemento
elem = browser.find_element_by_css_selector('ruta CSS al elemento')
elem.send_keys('texto')
 
# Enviamos el formulario
elem.submit()
  • 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:

elem = browser.find_element_by_css_selector('<selector CSS al elemento>')
 
elem.text

Si quisiésemos todo el código HTML de la página:

elem = find_element_by_css_selector('html')

Recursos

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