@alexmixaylov

Как выяснить причину по которой не загружается страница (puppeteer) в безголовом режиме когда вызываю ее с сервера без X?

Делаю скрипт который подтягивает актуальную информацию о движении контейнеров
На сайте zim.com возникли определенные затруднения. Когда включал безголовый режим, сайт определял бота и запрещал доступ.
Я установил большую задержку перед выполнением, информации получать много не нужно, так что это не должно создавать проблемы для сайта

Смог побороть это указанием юзер агента и указанием некоторых параметров для evaluateOnNewDocument
На локальном компьютере это помогло, все корректно отрабатывает, но когда пытаюсь запустить это со своего сервера - вообще не загружается страница.
Как можно было бы определить причину? подскажите плиз, бьюсь уже несколько дней

Так можно запустить скрипт
node bin/sealines/zim --container=FSCU8147907

const fs = require('fs').promises;
const puppeteer = require('puppeteer');
const path = require('path');
const params = require('optimist').argv;
const url = 'https://www.zim.com/tools/track-a-shipment';
const containerNumber = params.container;
const cookies = [
    {
        name: 'OptanonAlertBoxClosed',
        value: "2021-01-27T16:30:01.824Z",
        url: 'https://zim.com',
        domain: '.zim.com'
    },
];

let promise = (async () => {
    try {
        console.log('START SCRIPT');
        const browser = await puppeteer.launch({
            args: ['--no-sandbox'],
            headless: true,
            devtools: true,
            timeout: 120000 // иногда сайт не справляется за 60 секунд, удвоим таймаут
        });
        const page = await browser.newPage();
        await page.setDefaultTimeout(120000);

        await page.setExtraHTTPHeaders({
            'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8'
        });
        await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');

        await page.setCookie(...cookies);

        // Pass the Webdriver Test.
        await page.evaluateOnNewDocument(() => {
            Object.defineProperty(navigator, 'webdriver', {
                get: () => false,
            });

            // этот помогает обойти защиту
            const originalQuery = window.navigator.permissions.query;
            return window.navigator.permissions.query = (parameters) => (
                parameters.name === 'notifications' ?
                    Promise.resolve({state: Notification.permission}) :
                    originalQuery(parameters)
            );
        });

        await console.log(url);
        const response = await page.goto(url, {
            waitUntil: ['networkidle0', 'networkidle2'],
            timeout: 20000
        });

        await page.screenshot({
            path: path.resolve(__dirname) + '/first.jpeg',
            type: 'jpeg',
            quality: 100,
        });

        await page.waitForSelector('#ConsNumber');
        await page.type('#ConsNumber', containerNumber);
        await page.keyboard.press(String.fromCharCode(13));
        await page.waitForNavigation({waitUntil: 'networkidle0'});

        const infoZim = await page.evaluate(() => {
            const el = document.getElementById('etaDate');
            const date = el ? el.innerText.replace('ETA:', "").trim() : null;
            const lastStopTD = $('.routing-table tr').last().children('td');
            const lastCity = $(lastStopTD).last().prev().prev().text().trim();
            const lastDate = $(lastStopTD).last().prev().text().trim();
            let latest = {}
            if (lastCity && lastDate) {
                latest.lastCity = lastCity
                latest.lastDate = lastDate
            } else {
                latest = null
            }
            const result = {
                date: date,
                latest: latest
            }

            console.log(result);
            return JSON.stringify(result);
        })

        await page.screenshot({
            path: path.resolve(__dirname) + '/screen.jpeg',
            type: 'jpeg',
            quality: 100,
        });
        await browser.close()
        return infoZim;

    } catch (err) {
        console.log(err)
    }
})();
promise.then(res => console.log(res)).catch(e => console.log(e))
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы