Cómo implementar la función de rastreo de índices de Baidu
He leído un artículo esclarecedor antes, que habla sobre la tecnología anti-rastreo frontal de varios fabricantes importantes. Sin embargo, como se menciona en este artículo, no existe un método 100% anti-rastreo. El artículo presenta una forma sencilla de evitar todos estos métodos anti-rastreo de front-end.
El siguiente código toma Baidu Index como ejemplo. El código se ha empaquetado en la biblioteca del nodo rastreador de Baidu Index: instalación pm, o cambie la dirección de descarga a Taobao mirror y luego instale:
npm config set PUPPETEER_DOWNLOAD_HOST=https://npm.taobao.org/mirrors
npm install --save puppeteer
También puedes omitir la descarga de Chromium durante la instalación, especificando esto en el código Ruta local de Chrome para ejecutar:
/ npm
npm install --save puppeteer --ignore-scripts
/ node
puppeteer .launch({ executablePath: '/path/to/Chrome' });
Implementación
Para mayor claridad, a continuación solo se enumeran las partes principales. Para mayor claridad, a continuación solo se enumeran las partes principales. En la parte principal, las partes del código que hacen referencia al selector se reemplazan por... Para obtener el código completo, consulte el repositorio de github en la parte superior del artículo.
Abre la página de índice de Baidu y simula el inicio de sesión.
Lo que hacemos aquí es simular las operaciones del usuario, hacer clic y escribir paso a paso. Los códigos de verificación de inicio de sesión no se manejan aquí. El manejo de códigos de verificación es otro tema. Si ha iniciado sesión en Baidu localmente, generalmente no necesita un código de verificación.
//Inicie el navegador,
//Si el parámetro sin cabeza está configurado en verdadero, Puppeteer operará su Chromium en segundo plano. En otras palabras, no verá el navegador. Proceso de operación
//Establecer en falso; por el contrario, abrirá el navegador en su computadora y mostrará todas las operaciones del navegador.
const browser = aguardar puppeteer.launch({headless: false});
const page = aguardar browser.newPage();
//Abrir Baidu Índice
await page.goto(BAIDU_INDEX_URL);
// Simular inicio de sesión
await page.click('...');
await page.waitForSelecto('...');
//Ingrese la contraseña de la cuenta de Baidu e inicie sesión
await page.type('...');
esperar página.tipo('...', 'nombre de usuario');
esperar página.tipo('...', 'contraseña');
await page.click('...') )
await page.waitForNavigation();
console.log(':white_check_mark: inicio de sesión exitoso');
p>
Simule mover el mouse para obtener los datos requeridos
Debe desplazar la página hasta el área del gráfico de tendencias, luego mover el mouse a una fecha determinada, esperar la solicitud para finalizar, la información sobre herramientas para mostrar el valor y luego tomar una captura de pantalla. Guarde la imagen.
//Obtener las coordenadas del primer día del gráfico
const position = await page.evaluate(() =gt; {
const $image = document.querySelector('...') ;
const $area = document.querySelector('...') ;
const areaRect = $area.getBoundingClientRect() ;
const imageRect = $image.getBoundingClientRect();
const position = await page.evaluate(() =gt; {
// Obtener el coordenadas del primer día de la carta.
getBoundingClientRect();
// Desplácese al área de visualización del gráfico
window.scrollBy(0, areaRect.top);
return { x: imageRect. x , y: 200 };
});
espera página.mouse.move( posición.x, posición.y); waitForSelector ('...');
//Obtener información sobre herramientas
const tooltipInfo = await page.evaluate(() =gt; {
const $tooltip = document.querySelector('...') ;
const $title = $tooltip.querySelector('...') ;
const $value = $tooltip .querySelector('...') ;
const $título = $tooltip.querySelector('...') ;
const $valor = $tooltip.querySelector(' ...')querySelector('...');
const valueRect = $value.getBoundingClientRect();
const padding = 5; return {
título: $title.textContent.split(' ')[0],
x: valueRect.x - relleno,
y: valueRect .y,
ancho: valueRect.width padding * 2,
alto: valueRect.height
}
});
Captura de pantalla
Calcula las coordenadas de los valores, toma una captura de pantalla y usa pares de jimp para recortar la imagen.
await page.screenshot({ path: imgPath });
// Recorta la imagen, manteniendo solo la parte digital
const img = await jimp. read( imgPath);
await img.crop( tooltipInfo.x, tooltipInfo.y, tooltipInfo.width, tooltipInfo.height);
//Agrandar la imagen mejorará el reconocimiento precisión
p>espera img.scale(5);
espera img.write(imgPath);
}
consola. log(val);
De hecho, Tesseract no entrenado cometerá algunos errores en el reconocimiento, como reconocer números que comienzan con 9 como "3", por lo que debemos entrenar para mejorar la precisión de Tesseract. Si el problema es el mismo, se puede solucionar mediante regularización.
Encapsulación
Después de implementar los puntos anteriores, solo necesita combinarlos para encapsular una biblioteca de nodos del rastreador de índice de Baidu. Por supuesto, existen muchos métodos de optimización, como el rastreo por lotes, especificar el número de días para rastrear, etc. No es difícil lograrlo sobre esta base.
reconocimiento constante = require('. /src/recognition');
const Spider = require('. /src/spider'); .exports = {
ejecución asíncrona (palabra, opciones, titiriteroOptions = { headless: true }) {
const spider = new Spider({
imgDir,
..options
}, puppeteerOptions);
// Obtener datos
await spider.run(word); p>
// Lee la captura de pantalla capturada y realiza el reconocimiento de la imagen
const wordDir = path.const wordDir = path.resolve(imgDir, word);
const imgNames = fs .readdirSync(wordDir);
resultado const = [];
imgNames = imgNames.filter(item =gt. path.extname(item) === '.png ') ;
for (let i = 0; i lt; imgNames.length; i ) {
const imgPath = ruta.dirección(wordDir, palabra);
const imgNames.filter(item =gt.resolve(wordDir, imgNames[i]);
const val = espera reconocimiento.run(imgPath);
resultado.push (val
}
devolver resultado
}
}
Anti-rastreador
Finalmente, ¿cómo resistir a tales rastreadores? Personalmente creo que juzgar la trayectoria del movimiento del mouse puede ser una forma. Por supuesto, no existe un método 100% anti-rastreador en la parte frontal. un poco más difícil. p>
Creo que después de leer el caso de este artículo, domina el método. Para obtener más información interesante, preste atención a otros artículos relacionados en el sitio web de Gxl.
Lectura recomendada:
Cómo manejar el cuadro de fecha y hora de easyui en términos de compatibilidad con IE
Vue determina si el contenido de entrada tiene espacios