Crimson.Lab

Лаборатория Кримсона

20 June 2023

Парсим сайт спрятанный через Cloudflare

Нашёл способ обходить проверку cloudflare, но хром жрёт как не в себя оперативку. Отключаем скрипты слежения и всю медиа что есть на страницах. Авторизуемся где нибудь и парсим контент. Ещё плагины можно найти в репозитории puppeteer-extra - например обход рекапчи.

Не забываем установить chrome

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install ./google-chrome-stable_current_amd64.deb
import puppeteer from 'puppeteer-extra'
import StealthPlugin from 'puppeteer-extra-plugin-stealth'
import AdblockerPlugin from 'puppeteer-extra-plugin-adblocker'
import ResBlockPlugin from 'puppeteer-extra-plugin-block-resources'

class Nod {
    constructor() {
        puppeteer.use(StealthPlugin())
        puppeteer.use(AdblockerPlugin({ blockTrackers: true }))
        puppeteer.use(ResBlockPlugin({ blockedTypes: new Set(['image', 'stylesheet', 'media', 'font']) }))
    }

    parse() {
        let keys = [];
        const browser = await puppeteer.launch({
            executablePath: "/usr/bin/google-chrome-stable",
            args: ["--enable-features=NetworkService", "--no-sandbox"],
            ignoreHTTPSErrors: true,
            headless: "new"
        });
        // const browser = await puppeteer.launch({ headless: false })

        try {
            const page = await browser.newPage()
            // Открываем страницу
            await page.goto('https://', { timeout: 60000 });
            
            // Авторизуемся где нибудь
            await page.$eval('input[name=vb_login_username]', (el, login) => { el.value = login }, 'Логин какой нибудь');
            await page.$eval('input[name=vb_login_password]', (el, pwd) => { el.value = pwd }, 'Пароль какой нибудь');
            await page.click('input.button[type=submit]');
            await page.waitForNavigation({ waitUntil: 'load' });

            // Находим посты
            let messages = await page.$x("//*[contains(@id,'post_message_')]");
            for (let message of messages) {
                let text = await message.evaluate(element => element.innerHTML);
                // Находим ключи в постах
                let k = text.match(/([A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4}-[A-Z0-9]{4})/gm);
                if (k) {
                    keys.push(...k);
                }
            }
        } catch (e) {
            console.log(e);
        } finally {
            await browser.close();
        }
        return keys;
    } 
export default Nod;

Это небольшой пример кода моего бота

tags: coding - nodejs - bot