Está en la página 1de 3

Web Scraping

Formulario

Beautiful Soup
Selenium
Scrapy

Frank Andrade
Web Scraping “Hermanos” son nodos con los mismos padres.
El hijo de un nodo y los hijos de sus hijos son
XPath

Formulario
llamados sus “descendientes”. Del mismo modo, el Necesitamos aprender XPath para hacer web
padre de un nodo y el padre de su padre son scraping con Selenium y Scrapy.
llamados “ancestros”.
Es recomendado buscar elementos en este orden
El web scraping nos permite extraer data de la web. Antes de a. ID XPath Sintaxis
aprender Beautiful Soup, Selenium o Scrapy, vamos a revisar b. Class name Un XPath usualmente contiene un tag, nombre de
c. Tag name
conceptos básicos de HTML. d. Xpath atributo y valor de atributo.

Beautiful Soup //tag[@Atributo="Valor"]


HTML básico para Web Scraping
Analicemos el siguiente elemento HTML. Flujo de Trabajo Veamos algunos ejemplos de como localizar el
Importar librerías elemento article, el titulo de la película y transcript
Tag Nombre Valor Tag from bs4 import BeautifulSoup del código HTML que vimos antes.
apertura Atributo Atributo cierre import requests

Obtener páginas //article[@class="main-article"]


<h1 class="title"> Titanic (1997) </h1> result=requests.get("www.google.com")
result.status_code #obtener status //h1
result.headers #obtener encabezados //div[@class="full-script"]
Atributo Contenido Afectado
Contenido de la página
Elemento HTML contenido = result.text XPath Funciones y Operadores
XPath funciones
Este es solo un elemento HTML, pero el documento HTML detrás Crear soup
soup=BeautifulSoup(contenido,"lxml") //tag[contains(@Atributo, "Valor")]
de una página web tiene varios elmentos como este.
HTML en formato legible XPath Operadores: and, or
Código HTML ejemplo
print(soup.prettify())
<article class="main-article">
//tag[(expresion 1) and (expresion 2)]
<h1> Titanic (1997) </h1> Encontrar un elemento
<p class="plot"> 84 years later ... </p> soup.find(id="mi_id")
XPath Caracteres Especiales
<div class="full-script"> 13 meters. You ... </div> Encontrar elementos
soup.find_all("a") Selecciona los hijos del nodo ubicado a la
</article> /
soup.find_all("a","css_class") izquiera de este caracter
El documento HTML está estructurado con "nodos". Cada soup.find_all("a",class_="mi_class") Especifica que el nodo a emparejar puede
soup.find_all("a",attrs={"class": //
rectángulo debajo representa un nodo (elemento, atributo o texto) "mi_class"}) estar en cualquier nivel del documento
Obtener texto Especifica que el contexto actual debería
Elemento Raíz
<article>
Nodo Padre ejemplo=elemento.get_text() . ser usado (el nodo referencia)
ejemplo=elemento.get_text(strip=True,
separator= ' ') .. Selecciona a un nodo padre
Obtener atributos Caracter comodín que selecciona todos los
Elemento Atributo Elemento Elemento ejemplo = elemento.get('href') * elementos sin importar el nombre
<h1> class="main-article" <p> <div>
Hermanos Selecciona un atributo
@
Texto Atributo Texto Atributo Texto () Indica una agrupación dentro de un XPath
Titanic (1997) class="plot" 84 years later ... class="full-script"" 13 meters. You ...
Indica que un nodo con index "n" debe ser
[n]
seleccionado
Selenium Scrapy
Flujo de Trabajo Scrapy es el framework más complete de web scraping en Python. Para
from selenium import webdriver configurarlo revisa la documentación de Scrapy.
web="www.google.com"
path='introduce ruta del chromedriver'
driver = webdriver.Chrome(path) Crear un Proyecto y Spider
driver.get(web) Para crear un nuevo proyecto, corre el siguiente comando en el terminal o cmd
scrapy startproject mi_primer_spider
Encontrar un elemento Para crear un nuevo spider, primero cambia el directorio
driver.find_element_by_id('nombre') cd mi_primer_spider
Crear un spider
Encontrar elementos scrapy genspider ejemplo ejemplo.com
driver.find_elements_by_class_name()
driver.find_elements_by_css_selector La plantilla básica
driver.find_elements_by_xpath() Cuando creamos un spider, obtenemos una plantilla con el siguiente contenido.
driver.find_elements_by_tag_name()
driver.find_elements_by_name() import scrapy
class ExampleSpider(scrapy.Spider):
Cerrar driver
driver.quit() name = 'ejemplo'
allowed_domains = ['ejemplo.com'] Clase
Obtener el texto start_urls = ['http://ejemplo.com/']
data = elemento.text
def parse(self, response):
Espera Implícita Método Parse
import time pass
time.sleep(2)
La clase es contruida con la data que introducimos en el comando previo, pero el
Espera Explícita método parse tenemos que construirlo nosotros.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait Buscando elementos
from selenium.webdriver.support import expected_conditions as EC Para buscar elementos con Scrapy, usa el argumento "response" del método parse
response.xpath('//tag[@Atributo="Valor"]')
WebDriverWait(driver,5).until(EC.element_to_be_clickable((By.ID,
'id_name'))) #esperar 5 segundos hasta poder encontrar elemento Obtener texto
Para obtener el elemento texto usamos text() y luego .get() o .getall(). Por ejemplo:
Opciones: Headless mode, cambiar tamaño de ventana response.xpath(‘//h1/text()’).get()
from selenium.webdriver.chrome.options import Options response.xpath(‘//tag[@Atributo=”Valor”]/text()’).getall()
opciones = Options()
opciones.headless = True Devolver la data extraída
opciones.add_argument('window-size=1920x1080') Para ver la data extraída tenemos que usar la palabra clave yield
driver = webdriver.Chrome(path,options=opciones)
def parse(self, response):
title = response.xpath(‘//h1/text()’).get()
Puedes encontrar tutoriales sobre # Devolver data extraída
Python en YouTube o Medium yield {'titles': title}
YT: www.youtube.com/andradefrank
Correr el spider y exportar data a CSV o JSON
Medium: frank-andrade.medium.com scrapy crawl ejemplo
scrapy crawl ejemplo -o nombre_archivo.csv
scrapy crawl ejemplo -o nombre_archivo.json

También podría gustarte