Подтвердить что ты не робот

Очистите веб-страницу и перемещайтесь с помощью кнопок

Я хочу выполнить следующие действия со стороны сервера:

1) Очистите веб-страницу
2) Имитировать клик на этой странице, а затем перейти к новой странице.
3) Очистите новую страницу
4) Имитировать некоторые нажатия кнопок на новой странице
5) Отправка данных обратно клиенту через json или что-то в этом роде

Я думаю использовать его с помощью Node.js.

Но я смущен относительно того, какой модуль я должен использовать a) Зомби
b) Node.io
c) Phantomjs
d) JSDOM
e) Что-нибудь еще

Я установил node, io, но не могу запустить его с помощью командной строки.

PS: Я работаю в сервере Windows 2008

4b9b3361

Ответ 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();
})();