Я периодически искал информацию и проверял различные методы реализации. Наконец, я в основном получил скриншот страницы. Поскольку промежуточный процесс занимает много времени, я поделюсь им, чтобы помочь вам быстро реализовать скриншот.
Почему выбирают фантомы для скриншотов
Есть много способов сделать снимок экрана, например:
selenium
HtmlUnit
Html2Изображение
, и так далее
Но скриншоты этих реализаций не годятся. Selenium может добиться только скриншотов, а не всей страницы, а HtmlUnit, Html2Image поддерживает js не очень хорошо, и на скриншотах будет много пробелов. phantomjs — это эфирное масло, он может перехватить всю страницу и хорошо влияет на поддержку js.
Посмотреть эффектОбнаружил, что картинка не загружается должным образом
Взгляните на командную строку только что:/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs: адрес сохранения исполняемого файла phantomjs/Users/hetiantian/SoftWares/phantomjs/examples/rasterize.js: адрес файла rasterize.js
Эту команду можно понимать как использование phantomjs для запуска файла rasterize.js, поэтому для решения проблемы с пустыми изображениями нам нужно посмотреть файл rasterize.js.
попробуй:
правильноpage.viewportSize = { width: 600, height: 600 };Вопрос 🤔️
Увеличьте высоту в десять раз и обнаружите, что это в основном идеальный снимок экрана, но если страница очень короткая, вы найдете недостатки, оставив внизу большое пустое место. причина:page.viewportSize = { width: 600, height: 600 };Размер начального открытого браузера установлен, и js можно загрузить, увеличив это значение. Если бы мы могли получить фактический размер страницы при установке размера высоты, но нет, я не могу.
И недопустимо заранее ставить большое значение высоты, например 30000, т.к. недопустим эффект пустого пространства внизу
Попытка вторая:
Добавьте следующий код перед методом window.setTimeout
page.evaluate(function(){
scrollBy(0, 18000);
});
К сожалению, цикл for не может использоваться в оценке, шлак фронтенда действительно не знает, как его изменить, поэтому я сдался.
Делаем скриншоты в java-коде
требуемые зависимости
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>2.45.0</version>
</dependency>
<dependency>
<groupId>com.codeborne</groupId>
<artifactId>phantomjsdriver</artifactId>
<version>1.2.1</version>
<!-- this will _always_ be behind -->
<exclusions>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
</exclusion>
<exclusion>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-remote-driver</artifactId>
</exclusion>
</exclusions>
</dependency>
Код
public class PhantomjsTest2 {
public static void main(String[] args) throws InterruptedException, IOException {
//设置必要参数
DesiredCapabilities dcaps = new DesiredCapabilities();
//ssl证书支持
dcaps.setCapability("acceptSslCerts", true);
//截屏支持
dcaps.setCapability("takesScreenshot", true);
//css搜索支持
dcaps.setCapability("cssSelectorsEnabled", true);
//js支持
dcaps.setJavascriptEnabled(true);
//驱动支持(第二参数表明的是你的phantomjs引擎所在的路径)
dcaps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY,
"/Users/hetiantian/SoftWares/phantomjs/bin/phantomjs");
//创建无界面浏览器对象
PhantomJSDriver driver = new PhantomJSDriver(dcaps);
//设置隐性等待(作用于全局)
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
long start = System.currentTimeMillis();
//打开页面
driver.get("https://juejin.cn/post/6844903686821396487");
Thread.sleep(30 * 1000);
JavascriptExecutor js = driver;
for (int i = 0; i < 33; i++) {
js.executeScript("window.scrollBy(0,1000)");
//睡眠10s等js加载完成
Thread.sleep(5 * 1000);
}
//指定了OutputType.FILE做为参数传递给getScreenshotAs()方法,其含义是将截取的屏幕以文件形式返回。
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
Thread.sleep(3000);
//利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象
FileUtils.copyFile(srcFile, new File("/Users/hetiantian/Desktop/juejin-01.png"));
System.out.println("耗时:" + (System.currentTimeMillis() - start) + " 毫秒");
}
}
Комментарии уже достаточно подробные. Единственное, что нужно сказать: скольжение страниц достигается за счет выполнения js-кода, и каждое скольжение будет гарантировать, что есть время для загрузки js через сон. Он вызовет 33 раза скольжения, потому что максимальная высота перехвата phantomjs составляет 32767 пикселей, поэтому 33-кратное скольжение может гарантировать, что большая часть страницы, которая может быть перехвачена, уже загружена.
Вложение: Разница между window.scrollBy(0,1000) и window.scrollTo(0,1000)
window.scrollTo(0, document.body.scrollHeightМожно провести пальцем вниз по странице, не выбранной по двум причинам:
1) Сразу смахните вниз и js не загрузится вовремя
2) Некоторые страницы не имеют нижней части и их можно постоянно пролистывать для загрузки.
Примечание. Упомянутый здесь js слишком поздно для загрузки относится к: js, который хочет перехватить страницу, слишком поздно для загрузки
Недостаток этого метода: он занимает много времени. Конечно же, у медведя и у рыбы не может быть и того, и другого: по статистике, чтобы сделать снимок, требуется около четырех минут.