Data Sci aventuras - parte 4, raspado web en JavaScript y Python

Publicado en 2021-07-15 17:56

Idiomas disponibles:

Recientemente trabajé en dos proyectos que necesita raspado web. Un proyecto de Python está un proyecto paralelo y otro proyecto está los deberes para el trabajo potencial.

Lo siento para errores gramaticales, español es mí quinto idioma.

Para personas interesadas en mi búsqueda de trabajo, esta empresa no está para mi.

Para esto artículo uno necesita saber CSS selectors.

Obteniendo los datos

En los dos casos necesitamos obtener los datos y nosotros necesitamos las bibliotecas. En Python tenemos requests y en JavaScript axios

npm install axios # instala la axios biblioteca en JavaScript
pip install requests # instala la requests biblioteca en Python

Probablemente la diferencia grande entre request y axios está la asincronicidad. request hace una solicitud al servidor y espera a la repuesta o el error. En JavaScript axios está asíncrono y el código después de una llamada al servidor ejecuta normalmente. await hace axios ejecutar sincrono.

En Python uno usa request:

import requests

data = requests.get("url")

En JavaScript:

const { data } = await axios.get("url");

// O

await axios.get("url")
.then((res) => { // process data })
.catch((err) => { //deal with errors })

Trabajando con los datos

Trabajando con los datos es similar excepto diferente. Necesitamos también las bibliotecas. Podemos escoger entre el puñado de bibliotecas. En JavaScript escogí JSDOM porque estoy comfortabel con querySelector en front-end JavaScript.

En Python escogí BeautifulSoup porque en freeCodeCamp está un buen artículo.

Primero necesitamos importar las bibliotecas.

from bs4 import BeautifulSoup

soup = BeautifulSoup(data, 'html.parser')
const { JSDOM } = require("jsdom")


const dom = new JSDOM(data, {
runScripts: "dangerously",
resources: "usable"
});

Una consulta básico en JSDOM está similar como en front-end JavaScript. La siguiente consulta devuelve el primero div que se puede encontrar.

document.querySelector("div")

Para todos elementos usamos:

document.querySelectorAll("div")

Nosotros necesitamos recordar que querySelector devuelve NodeList y no un vector. Podemos transformar NodeList al vector y usar map().

BeautifulSoup tiene dos modos para buscando los elementos. Primero es find() y find_all(). Ellos tienen los mismos parámetros. Una sola diferencia es cuántos elementos ello devuelve. find() devuelve solo un primero y find_all() todos. El próximo ejemplo devuelve primero elemente div:

soup.find("div")

Para más especificidad podemos filtrar con los parametros. Un de ellos está class. El próximo ejemplo devuelve primero elemente div con class square:

soup.find("div", class="square")

BeautifulSoup nos permite usar los selectores de CSS con el método select().

soup.select("div") # is same as document.querySelectorAll("div")

Las recursos