Очистите веб-страницу и перемещайтесь с помощью кнопок
Я хочу выполнить следующие действия со стороны сервера:
1) Очистите веб-страницу
2) Имитировать клик на этой странице, а затем перейти к новой странице.
3) Очистите новую страницу
4) Имитировать некоторые нажатия кнопок на новой странице
5) Отправка данных обратно клиенту через json или что-то в этом роде
Я думаю использовать его с помощью Node.js.
Но я смущен относительно того, какой модуль я должен использовать
a) Зомби
b) Node.io
c) Phantomjs
d) JSDOM
e) Что-нибудь еще
Я установил node, io, но не могу запустить его с помощью командной строки.
PS: Я работаю в сервере Windows 2008
Ответы
Ответ 1
Zombie.js и Node.io запускаются на JSDOM, поэтому ваши варианты либо идут с JSDOM (или любой эквивалентной оболочкой), безголовым браузером (PhantomJS, SlimerJS) или Cheerio.
- JSDOM довольно медленный, потому что он должен воссоздать DOM и CSSOM в Node.js.
- PhantomJS/SlimerJS являются подходящими браузерами без головы, поэтому характеристики в порядке, и они также очень надежны.
- Cheerio - легкая альтернатива JSDOM. Он не воссоздает всю страницу в Node.js(он просто загружает и анализирует DOM - не выполняется javascript). Поэтому вы не можете нажимать кнопки/ссылки, но очень быстро очищать веб-страницы.
Учитывая ваши требования, я бы, вероятно, пошел с чем-то вроде безголового браузера. В частности, я бы выбрал CasperJS, потому что у него хороший и выразительный API, он быстрый и надежный (ему не нужно изобретать колесо о том, как разобрать и отобразить dom или css, как JSDOM), и очень легко взаимодействовать с такими элементами, как кнопки и ссылки.
Ваш рабочий процесс в CasperJS должен выглядеть примерно так:
casper.start();
casper
.then(function(){
console.log("Start:");
})
.thenOpen("https://www.domain.com/page1")
.then(function(){
// scrape something
this.echo(this.getHTML('h1#foobar'));
})
.thenClick("#button1")
.then(function(){
// scrape something else
this.echo(this.getHTML('h2#foobar'));
})
.thenClick("#button2")
thenOpen("http://myserver.com", {
method: "post",
data: {
my: 'data',
}
}, function() {
this.echo("data sent back to the server")
});
casper.run();
Ответ 2
Введенные вами модули делают следующее:
- Phantomjs/Zombie - имитирует браузер (безголовый - ничего на самом деле не отображается). Может использоваться для соскабливания статического или динамического. Или тестирование ваших html-страниц.
- Node.io/jsdom - webcraping: извлечение данных со страницы (статические).
Глядя на ваши требования, вы можете использовать phantom или зомби.
Ответ 3
Краткий ответ (в 2019 году): использовать кукловод
Если вам нужен полный (обезглавленный) браузер, использовать кукольник вместо PhantomJS, как это предлагает уточненный Chromium браузер с богатым API, чтобы автоматизировать любой браузер ползать и выскабливание задач.
объяснение
Инструменты как jsdom (или Cheerio) позволяют ему извлекать информацию из HTML - документа, анализируя его. Это быстро и хорошо работает до тех пор, пока веб-сайт не содержит JavaScript. Извлечь информацию с веб-сайта, построенного на JavaScript, будет очень сложно или даже невозможно. Например, jsdom может выполнять скрипты, но запускает их в песочнице в вашей среде Node.js, что может быть очень опасно и может привести к сбою вашего приложения. Цитировать документы:
Однако это также очень опасно при работе с ненадежным контентом.
Поэтому для надежного сканирования более сложных веб-сайтов вам необходим реальный браузер. В течение многих лет самым популярным решением для этой задачи был PhantomJS. Но в 2018 году разработка PhantomJS была официально приостановлена. К счастью, с апреля 2017 года команда Google Chrome позволяет запускать браузер Chrome без заголовка (объявление). Это позволяет сканировать веб-сайты с использованием современного браузера с полной поддержкой JavaScript.
Для управления браузером библиотекарь- кукловод, который также поддерживается разработчиками Google, предлагает богатый API для использования в среде Node.js.
Пример кода
Строки ниже показывают простой пример. Он использует Promises и синтаксис async/await для выполнения ряда задач. Сначала запускается браузер ( puppeteer.launch
) и открывается page.goto
. После этого функции, такие как page.evaluate
и page.click
, используются для извлечения информации и выполнения действий на странице. Наконец, браузер закрывается ( browser.close
).
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('https://example.com');
// example: get innerHTML of an element
const someContent = await page.$eval('#selector', el => el.innerHTML);
// Use Promise.all to wait for two actions (navigation and click)
await Promise.all([
page.waitForNavigation(), // wait for navigation to happen
page.click('a.some-link'), // click link to cause navigation
]);
// another example, this time using the evaluate function to return innerText of body
const moreContent = await page.evaluate(() => document.body.innerText);
// click another button
await page.click('#button');
// close brower when we are done
await browser.close();
})();