Как скачать содержимое сайта?

Родственник недавно купил себе электричку китайскую.
Он попросил меня скачать гайд по машину по ссылке, а там нет ни единой кнопки скачки.

Вот сам сайт .

Как содержимое скачать в виде PDF файла?

Потом уже буду пытаться ему перевести.
  • Вопрос задан
  • 323 просмотра
Решения вопроса 1
Fzero0
@Fzero0
Вечный студент
const puppeteer = require('puppeteer');
const { KnownDevices } = require('puppeteer');
const fs = require('fs');
const path = require('path');
const { PDFDocument } = require('pdf-lib');
const { readFile } = require('fs/promises');

function delay(time) {
    return new Promise(function(resolve) { 
        setTimeout(resolve, time)
    });
}

async function takeScreenshots(url) {
    const browser = await puppeteer.launch({ headless: true });
    const page = await browser.newPage();

    // Устанавливаем мобильный User-Agent и разрешение экрана для iPhone 15 Pro
    const iPhone = KnownDevices['iPhone 15 Pro'];
    await page.emulate(iPhone);

    await page.goto(url);
    await delay(5000); // Ждем 5 секунд, чтобы страница полностью загрузилась

    // Получаем общее количество страниц
    const numPages = await page.evaluate(() => window.originTotalPageCount);
    console.log(`Total pages: ${numPages}`);

    // Создаем папку для сохранения скриншотов, если ее нет
    const imagesDir = 'images';
    if (!fs.existsSync(imagesDir)) {
        fs.mkdirSync(imagesDir);
    }

    for (let pageNumber = 1; pageNumber <= numPages; pageNumber++) {
        // Делаем скриншот всей страницы
        const screenshotPath = path.join(imagesDir, `page_${pageNumber}.png`);
        await page.screenshot({ path: screenshotPath, fullPage: true });
        console.log(`Screenshot saved to ${screenshotPath}`);

        // Свайп влево для перехода на следующую страницу
        if (pageNumber < numPages) {
            const { width, height } = await page.evaluate(() => ({
                width: document.documentElement.clientWidth,
                height: document.documentElement.clientHeight
            }));

            const startX = width - 10;
            const endX = 10;
            const swipeY = height / 2;

            // Имитация свайпа
            await page.touchscreen.touchStart(startX, swipeY);
            await delay(100);
            await page.touchscreen.touchMove(endX, swipeY);
            await delay(100);
            await page.touchscreen.touchEnd();

            await delay(1000); // Ждем 1 секунду, чтобы страница переключилась
        }
    }

    await browser.close();

    // Создаем папку для сохранения PDF, если ее нет
    const outputDir = 'output';
    if (!fs.existsSync(outputDir)) {
        fs.mkdirSync(outputDir);
    }

    // Создаем PDF из изображений
    const pdfDoc = await PDFDocument.create();
    const imageFiles = fs.readdirSync(imagesDir).sort((a, b) => {
        const numA = parseInt(a.match(/\d+/)[0]);
        const numB = parseInt(b.match(/\d+/)[0]);
        return numA - numB;
    });

    for (const imageFile of imageFiles) {
        const imagePath = path.join(imagesDir, imageFile);
        const imageBytes = await readFile(imagePath);
        const image = await pdfDoc.embedPng(imageBytes);
        const page = pdfDoc.addPage([image.width, image.height]);
        page.drawImage(image, {
            x: 0,
            y: 0,
            width: image.width,
            height: image.height,
        });
    }

    const pdfBytes = await pdfDoc.save();
    const pdfPath = path.join(outputDir, `book.pdf`);
    fs.writeFileSync(pdfPath, pdfBytes);
    console.log(`PDF saved to ${pdfPath}`);
}

const url = process.argv[2] || 'https://www.yunzhan365.com/book/12345.html'; // Replace with your URL
takeScreenshots(url);

Ставим зависимости
Запускаем так
node screenshot.js https://book.yunzhan365.com/klqn/xobm/mobile/index.html
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Либо делать реверс-инжиниринг, разбираться, что там в JS и WASM накручено, либо просто сделать скриншоты и отправить в распознавалку.
Второе, IMHO, на пару порядков быстрее, даже с учётом того, что скриншоты надо делать с увеличением.
Ответ написан
VoidVolker
@VoidVolker Куратор тега JavaScript
Dark side eye. А у нас печеньки! А у вас?
Как бы в первых строчках гугла предлагают решение - пробовали?
https://github.com/lcandy2/YunZhanDownloader
https://gist.github.com/DMHYT/3755eec84f4384e57561...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы