Fundamentos de Web Scrapping Con Python y Xpath
Fundamentos de Web Scrapping Con Python y Xpath
y Xpath
Introducción Web Scrapping
¿Qué es el WebScrapping?
¿Qué es Xpath?
¿Porque usar un webscrapping?
Python: el lenguaje más poderoso para extraer datos
Fundamentos de la Web
Entender HTTP
Hasta aqui todo bien, pero ¿Como se estructura HTTP?
Peticion
Respuesta
¿Donde se ubica HTTP en la web?
¿Qué es HTML?
Reto: Para que sirve etiqueta script.
Reto: Que son los metadatos y como incluirlos dentro de un documento html.
Reto: Buscar etiqueta que sirve para colocar un sitio web dentro de otro.
Robots.txt
XML Path Language
Expresiones Regurales
Tipos de Nodos
Esquema HTML
Expresiones en XPath
Predicados en XPath
Operadores en XPath
Operadores Logicos
Wildcards en XPath
Asterisco *
node()
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/4b3cb6dc-ee2c-45b7-b2b218a1ae6366a
b/slidesxpath_c6d75e8b-c8b14359-bbe3048380ea4e86.pdf
¿Qué es Xpath?
Xpath significa XML Path Lenguage este es un lenguaje especializado que sirve para extraer datos de manera
efectiva.
Fundamentos de la Web
Entender HTTP
Hypertext Transger Protocol.
Este es un protocolo o conjunto de reglas con las cuales dos computadoras se comunican en el internet.
Respuesta
Contamos con el servidor con el cual se realizo esta respuesta, en este caso es apache, pero tambien podria
ser nginx.
Tenemos una Etag, la cual tiene que ver con el caché(no se ve en el curso).
Permite a la memoria caché ser más eficiente, y ahorrar ancho de banda, en tanto que un servidor web
no necesita enviar una respuesta completa si el contenido no ha cambiado.
Por otro lado, si el contenido cambió, los etags son útiles para ayudar a prevenir actualizaciones
simultáneas de un recurso de sobre-escribirlo por otro (“colisiones en el aire”).
Tenemos el Accept-Ranges el cual nos dice el tipo de dato que recibiremos, en este caso bytes.
¿Cuantos Bytes? En este caso lo delimita el Content-Length, el cual en este caso son 29 769 bytes o 29,7
KiloBytes.
Y finalemente el Content-Type este es el tipo de respuesta que contiene el cuerpo de la respuesta del
servidor. Siendo text/html.
¿Qué es HTML?
HyperText Markup Language, lenguaje que nos permite definir la estructura de una pagina web. Teniendo titulos,
parrafos, imagenes y encabezados (estructura de ejemplo)
Dentro de la web tenenmos varias partes, la estructura, estilos visuales y partes interactivas.
HTML —🡒 Estructura
Reto: Que son los metadatos y como incluirlos dentro de un documento html.
Los metadatos, literalmente «sobre datos», son datos que describen otros datos. En general, un grupo de
metadatos se refiere a un grupo de datos que describen el contenido informativo de un objeto al que se
denomina recurso.
Los metadatos se añaden dentro de la etiqueta <meta name="description" content="Esta es la descripción general de
Dentro de la etiqueta <head> debido a que ahi se almacenan las cabeceras del documento.
Reto: Buscar etiqueta que sirve para colocar un sitio web dentro de otro.
La etiqueta <iframe> permite insertar un documento html dentro de otro. La etiqueta <iframe> puede aparecer
como elemento de bloque o como elemento en-línea.
Robots.txt
Este archivo lo encontramos en la raiz del sitio web.
Este archivo cumple la función de informar al programador web-scrapper que no extraiga información de
estas rutas.
Definir este archivo es importante para que los web-scrappers no toquen/extraigan información sensible.
Respetar este archivo es importante, dado a que se puede incurrir en problemas legales.
User-Agent: Es la manera en
que se identifica una
computadora cunado hace una
petición a un sitio web. Con
esta linea User-Agent: * los
sitios como google, twitter o
platzi aceptan a cualquier
User-Agent, siendo un mac,
iphone, android, opera, chrome,
script de python u otros.
https://s3-us-west-2.amazonaws.com/secure.notion-static.com/bb66714990d642338314182087092ca
0/xpath-cheatsheet.md.pdf
Expresiones Regurales
Es un lenguaje que nos permite definir patrones para
encontrar coincidencias en un texto.
Supongamos que queremos buscar en un texto las
palabras que empiezan por la letra a y terminan con
la letra o. Esta linea de codigo dice que queremos
En este caso seria muy producente usar expresiones extraer el primer titulo de un span que
regulares para obtener este resultado.
esta dentro de un div.
Tipos de Nodos
Cuando hablamos de nodo nos referimos a una etiqueta HTML con todo lo que posea en su interior.
Scraping Sandbox
A website that lists quotes from famous people. It has many endpoints showing the quotes in many
different ways, each of them including new scraping challenges for you, as described below.
http://toscrape.com
Esquema HTML
Expresiones en XPath
CTRL + SHIFT + I —→ Acceder a las developer tools
Cabe recalcar que se puede usar con todos los nodos del
documento, como en este caso todas las etiquetas de
hipertexto del documento HTML.
Usando la siguiente declaración $x('//a/text()').map(x ⇒
x.wholeText)
Predicados en XPath
Debido a que debemos filtrar de una forma mucho más especifica en nuestros nodos y encontrar esa
información que queremos extraer usaremos los predicados.
ultimo de estos?
Usando el predicado (el cual en sí es un metodo)
[last()] , como dice su nombre, tomara el ultimo div .
Operadores en XPath
Como hemos visto desde el principio de nuestro primer lenguaje de programación, existen distintos tipos de
operadores aritméticos, los cuales tienen un uso bastante importante en todos lados.
📌 Los operadores + los predicados son una forma muy eficiente de extraer datos.
Otra cosa interesante es que podemos usar el método position() , el cual requiere un operador para que nos sea
útil.
Aquí si es útil usar el operador de:
igualdad =
desigualdad !=
mayor >
menor <
Operadores Logicos
Si recuerdas tu primer lenguaje de programación, existen operadores de tipo logico, los cuales son and , or y
not .
Wildcards en XPath
Que pasa si no sabemos que nodo queremos traer pero aproxiamdamente sabemos el lugar en donde se
encuentra.
Para estos casos en XPath tenemos los wildcards o comodines.
Asterisco *
documento.
En especifico con esta expresión le decimos al
navegador que saltemos todos los niveles ( // ) en
todas las direcciones ( * ), por lo tanto el navegador
nos trae todos los todos y atributos de estos nodos.
node()
Es usado para traernos todo, sí, todo lo que esta en los nodos y más allá (como el contenido), a diferencia de *
que solo nos trae los nodos existentes inmediatos a el nodo actual.
Claramente, si vemos este nodo, podemos determinar que el texto de las citas no están dentro de un nodo <p>
esta dentro de el nodo span . Sabiendo esto, podemos determinar si usamos el * o node() .
Contains
El método contains nos sirve para filtrar por los elementos que contenga nuestro nodo.
Ends-With
Esta expresión no funciona en el XPath 1.0 de los buscadores (a día de hoy 10082020, pero si funciona en
Python, así que no te preocupes, el syntax que veremos será el mismo que en Python.
Matches
Matches nos sirve para hacer una busqueda en el texto de un nodo que coincida con cierta expresión regular
🔥 En ends-with como matches nos causa un error debido a que estas son expresiones de XPath 2.0, las
cuales no soporta el navegador, pero sí Python 🐍
AXES en XPath
🔥 El punto . es azucar
syntaxica para usarlo
envez de axes.
Hijos
Y con los axes no solo me puedo traer al nodo en sí mismo, tambien me puede traer a los hijos.
Descendientes
Si queremos a los nietos/descendientes usamos
+ nombre del nodo. Descendant nos trae
descendant::
Resumen de XPath
Tarea
Extraer Titulo
Primero localice el nodo en el cual se ubica todo el
apartado del nombre div[@class="col-sm-6
product_main"] , de este nodo extraje el h1 y su texto
con text() para luego mostrarlo con el método
map(x⇒x.wholeText)
Extraer Precio
Para extraer el precio use la expresion anterior y solo
modifique el h1 por el p en el cual se halla la clase
price_color y luego lo mostré en pantalla con text() y
el método map
Extraer Descripción
Para este reto use algo distinto,
use el //* el cual buscara todo
en todos lados, para especificar
lo que quería use los predicados
y seleccione el atributo
@id="content_inner" , en el cual
seleccione el nodo article y en
este su nodo p y en este use el
wildcard node() . Para mostrarlo
Extraer Stock
Para esto solo use las
declaraciones de costumbre.
La respuesta si usáramos node()
Reto Extra