Me baso en un web-scrapper, que, digamos, elimine las URL de Google
Obtengo una serie de URL de los resultados de Google:
const linkSelector = 'div.yuRUbf > a'
let links = await page.$$eval(linkSelector, link => {
return link.map( x => x.href)
})
la salida de 'enlaces' es algo así:
[
'https://google.com/.../antyhing'
'https://amazon.com/.../antyhing'
'https://twitter.com/.../antyhing'
]
Ahora tengo una 'lista negra', con algo así:
[
'https://amazon.com'
]
Por el momento, me quedé en ese punto donde puedo comparar ambas matrices y eliminar estas URL de los 'enlaces' que figuran en mi lista negra.
Así que se me ocurrió la idea de obtener el dominio de la URL dentro de mi matriz de enlaces, así:
const linkList = []
for ( const link of links ) {
const url = new URL(link)
const domain = url.origin
linkList.push(domain)
}
Sí, ahora tengo dos matrices que puedo comparar entre sí y eliminar el dominio de la lista negra, pero perdí la URL completa con la que necesito trabajar...
for( let i = linkList.length - 1; i >= 0; i--){
for( let j=0; j < blacklist.length; j++){
if( linkList[i] === blacklist[j]){
linkList.splice(i, 1);
}
}
}
Code Snippet es parte de la respuesta dada, aquí: Compare dos matrices de Javascript y elimine los duplicados
¿Alguna idea de cómo puedo hacer esto, con titiritero y node.js?
No pude encontrar un engaño obvio, así que convertí mis comentarios en una respuesta:
.includes :
const allowedLinks = links.filter(link => !blacklist.some(e => link.includes(e)))
.startsWith :
const allowedLinks = links.filter(link => !blacklist.some(e => link.startsWith(e)))
La segunda versión es más precisa. Si desea utilizar la versión URL, esto debería funcionar:
const links = [
"https://google.com/.../antyhing",
"https://amazon.com/.../antyhing",
"https://twitter.com/.../antyhing",
];
const blacklist = ["https://amazon.com"];
const allowedLinks = links.filter(link =>
!blacklist.some(black =>
black.startsWith(new URL(link).origin) // or use ===
)
);
console.log(allowedLinks);
En cuanto a Puppeteer, dudo que importe si haces esto del lado del node o del lado del navegador, a menos que estas matrices sean enormes. En ese tren de pensamiento, técnicamente tenemos un algoritmo cuadrático aquí, pero no me preocuparía a menos que tenga muchos cientos de miles de elementos y esté notando la lentitud. En ese caso, puede poner los orígenes de la lista negra en un Set de datos y buscar el origen de cada enlace en eso. El problema con esto es que es un === preciso, por lo que tendría que crear un conjunto de prefijos si necesita conservar la semántica .startsWith . Es probable que esto sea innecesario y esté fuera del alcance de esta respuesta, pero vale la pena mencionarlo brevemente.