Last active
February 4, 2020 15:50
-
-
Save elw00d/0784764b403900d8b4f9e20ed11ac7da to your computer and use it in GitHub Desktop.
Скрипт ходит по страницам и делает скриншоты div'а
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Скрипт ходит по страницам и делает скриншоты div'а | |
// Установка: `npm install puppeteer` | |
// Запуск: `nodejs screenshot.js` | |
// | |
// После работы в директории будет набор файлов 001.png 002.png ... итд | |
// Чтобы их сконвертировать в pdf, можно воспользоваться imagemagick | |
// | |
// # Установить imagemagick | |
// sudo apt-get install imagemagick | |
// | |
// # Этот шаг возможно будет падать из-за лимитов и прав в /etc/ImageMagick-6/policy.xml | |
// # В этом случае нужно пойти и подредактировать дефолты | |
// # Например поставить <policy domain="coder" rights="read|write" pattern="PDF" /> | |
// # И поднять лимит по ресурсам | |
// convert 001.png 002.png 003.png output.pdf | |
// | |
// # Взять все png по возрастанию modification time | |
// convert $(ls -trl *.png | awk '{print $9}' | xargs echo) output.pdf | |
const puppeteer = require('puppeteer') | |
function delay(time) { | |
return new Promise(function(resolve) { | |
setTimeout(resolve, time) | |
}); | |
} | |
function leftpad (str, len, ch) { | |
str = String(str); | |
var i = -1; | |
if (!ch && ch !== 0) ch = ' '; | |
len = len - str.length; | |
while (++i < len) { | |
str = ch + str; | |
} | |
return str; | |
} | |
;(async () => { | |
const browser = await puppeteer.launch({ | |
headless:false, // Это можно поставить в true | |
defaultViewport:null, | |
devtools: false, | |
args: ['--window-size=1920,1170','--window-position=0,0'], | |
// Здесь указать директорию, где браузер будет хранить данные пользователя | |
userDataDir: '/home/elwood/all/nodejs-test/user-data-dir' | |
}) | |
const page = (await browser.pages())[0] | |
// Ссылка на учебник для чтения | |
const open = await page.goto ( 'https://reader.lecta.rosuchebnik.ru/read/8234-64' ) | |
// Кол-во страниц | |
for (var page_num = 1; page_num <= 405; page_num++) { | |
await delay(3000); | |
var item = await page.evaluate(() => { | |
var iframes = document.getElementsByTagName('iframe'); | |
var iframe = undefined; | |
for (var i = 0; i < iframes.length; i++) { | |
if (iframes[i].id.startsWith('epubjs-')) { | |
iframe = iframes[i]; | |
} | |
} | |
var divs = iframe.contentWindow.document.getElementsByTagName('div'); | |
for (var i = 0; i < divs.length; i++) { | |
if (divs[i].getAttribute('data-page-no') != null) { | |
return divs[i].id; | |
} | |
} | |
} | |
); | |
const frame = page.frames().find(frame => { | |
console.log('Processing frame ' + frame.name()); | |
return frame.name().startsWith('epubjs-'); | |
}); | |
console.log(frame); | |
var div = await frame.$$('div[id="' + item + '"]'); | |
console.log('DIV:'); | |
console.log(div); | |
await div[0].screenshot({path: './' + leftpad(page_num, 3, '0') + '.png'}); | |
console.log('taken screenshot'); | |
await page.click('a[class="_icon forward"]'); | |
} | |
console.log('Finished OK'); | |
})() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment