На все можно залезть - кукольный бой

Node.js

puppeteer — это официальная безголовая библиотека узлов Chrome, созданная Chrome. Он предоставляет ряд API-интерфейсов, которые могут вызывать функции Chrome без пользовательского интерфейса и подходят для различных сценариев, таких как поисковый робот и автоматическая обработка.

puppteer

puppeteer — это официальная безголовая библиотека узлов Chrome для Chrome (веб-браузер без графического интерфейса). Он предоставляет ряд API-интерфейсов, которые могут вызывать функции Chrome без пользовательского интерфейса и подходят для различных сценариев, таких как поисковый робот и автоматическая обработка.

Для чего я могу его использовать?

  • Создание скриншотов страниц и PDF-файлов
  • Автоматизируйте отправку форм, тестирование пользовательского интерфейса, ввод с клавиатуры и многое другое.
  • Создайте новую автоматизированную тестовую среду. Используя новейшие возможности JavaScript и браузера, вы можете запустить тест прямо в последней версии Chrome.
  • Сканирование страниц SPA и предварительный рендеринг (например, «SSR»)
  • ...

Разница между cheerio и cheerio

  • cheerio - Проще говоря, этот продукт представляет собой библиотеку html-документов, которая исчерпывает синтаксические операции jq. Она может сканировать только статический html и не может получать данные ajax. Обычно используется в сочетании с axios+cherrio.
  • pupteer — может имитировать среду работы браузера, может запрашивать информацию о веб-сайте. Он может выполнять симулированные операции (щелчок/пролистывание/наведение курсора и т. д.) и даже внедрять скрипты узлов во внутреннюю среду браузера для запуска.

схема архитектуры кукольника

  • Puppeteer - Общайтесь с браузером через devTools
  • Браузер — экземпляр браузера (chroium), который может иметь несколько страниц.
  • Страница - страница с хотя бы одним фреймом
  • Фрейм - по крайней мере еще одна среда выполнения для выполнения javascript, также может расширять несколько сред выполнения

Легко начать


const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(targetUrl);
  await page.screenshot({path: 'example.png'});
  await browser.close();
})();

Анализ кода

1. Представьте кукольника

 const puppeteer = require('puppeteer');
 

2. Создайте экземпляр

То есть запустить браузерное окружение через Puppeteer

const browser = await puppeteer.launch(options);

options:

  • executablePath: puppeteer.executablePath() — получить местоположение исполняемого файла Chrome по умолчанию
  • headless: false — включать ли безголовый режим
  • slowMo: 250 — этот параметр замедляет работу кукловода на указанное количество миллисекунд.
  • devtools: true — использовать отладчик в браузере кода приложения
  • defaultViewport — по умолчанию 800 x 600
    • width
    • height
    • deviceScaleFactor - Масштабный коэффициент
    • isMobile — учитывать ли мета-теги окна просмотра, по умолчанию — false
    • hasTouch — указывает, поддерживает ли область просмотра сенсорные события, по умолчанию — false.
    • isLandscape — указывает, находится ли рот в ландшафтном режиме.
  • Дополнительные параметры см.Puppeteer.launch()
  • 3. Откройте новую страницу

const page = await browser.newPage();

4. Перейдите на целевую страницу

await page.goto(targetUrl);

Примечание. Здесь допустим второй параметр, который является объектом для некоторой простой конфигурации с такими параметрами, как

waitUntil:

  • load — возвращает сразу после запроса данных
  • domcontentloaded — возвращается при загрузке dom
  • networkidle0 - не более 0 сетевых подключений, возвращенных через 500 мс
  • networkidle2 — не более 2-х сетевых подключений, возвращенных через 500 мс

тайм-аут: время ожидания перехода, единица измерения — миллисекунды, по умолчанию — 30 секунд, передать 0, чтобы означать бесконечное ожидание, вы можете изменить значение по умолчанию с помощью метода page.setDefaultNavigationTimeout(timeout)

referer (нечасто используется): значение заголовка страницы referer. Если он предоставлен, он будет иметь преимущество перед значением заголовка реферера, установленным page.setExtraHTTPHeaders().

5. Закройте браузер

 browser.close();

колокольчики и свистки

На самом деле, в разделе «Легкое начало работы» довольно хорошо описаны наши часто используемые функции.Подводя итог, можно сказать, что для лазания по веб-странице требуется несколько шагов.

  1. Открыть браузер
  2. взбираться
  3. закрыть браузер

Разве это не просто? Приходит вопрос? как лезть? Будете ли вы использовать jq?

Если вы можете использовать jq, вы будете использовать краулер!

Найдите видеосайт, который вам нравится (следующее предназначено только для обучения!)

const demo = async () => {
  const browser = await (puppeteer.launch({
    executablePath: puppeteer.executablePath(),
    headless: false
  }))
  var arr = []
  for (let i = 1; i <= 40; i++) {
    console.log('正在抓取全职高手第' + i + '集')
    const targetUrl = `https://goudaitv1.com/play/78727-4-${i}.html`
    console.log(targetUrl)
    const page = await browser.newPage()
    await page.goto(targetUrl, {
      timeout: 0,
      waitUntil: 'domcontentloaded'
    })
    const baseNode = '.row'
    const movieList = await page.evaluate((sel) => {
      var stream = Array.from($(sel).find('iframe#Player').attr('src'))
      stream && (stream = stream.join(''))
      return stream
    }, baseNode)
    arr.push(movieList)
    page.close()
  }
  console.log(arr)
  browser.close()
}

page.evaluate(pageFunction[, ...args])

  • pageFunction Метод для выполнения в контексте экземпляра страницы
  • ...args Аргументы для передачи pageFunction
  • Возвращает: результат выполнения pageFunction.

Если pageFunction возвращает промис, page.evaluate будет ждать завершения промиса и вернет его возвращаемое значение.

Если pageFunction возвращает значение, которое не может быть сериализовано, оно вернет неопределенное значение.

Пример передачи параметров в pageFunction:

const result = await page.evaluate(x => {
  return Promise.resolve(8 * x);
}, 7); // (注: 7 可以是你自己代码里任意方式得到的值)
console.log(result); // 输出 "56"

Вы также можете передать строку

console.log(await page.evaluate('1 + 2')); // 输出 "3"
const x = 10;
console.log(await page.evaluate(`1 + ${x}`)); // 输出 "11"

сохранить в базу данных

Возьми! Вы можете делать с этими данными все, что хотите, например

наконец

Конечно, «лазание» — это только верхушка айсберга. Вышеприведенная демонстрация ленива и напрямую получает адрес тега a для прыжка. Мы также можем использовать событие click для перехода на страницу. Если вам интересно, вы можете попробовать.

page.click(selector[, options])

  • selector Селектор элемента, по которому нужно щелкнуть. Если есть несколько совпадающих элементов, нажмите на первый из них.
  • options
    • кнопка слева, справа или посередине, по умолчанию слева.
    • clickCount по умолчанию равен 1. См. UIEvent.detail.
    • Пребывание между задержкой mousedown и mouseup времени в миллисекундах. По умолчанию 0
  • Возвращает: объект обещания, соответствующий элемент был нажат. Если ни один элемент не будет нажат, объект Promise будет отклонен.
  • Этот метод находит элемент, соответствующий селектору селектора, при необходимости прокручивает элемент до видимого и щелкает по нему с помощью page.mouse. Если селектор не соответствует ни одному элементу, этот метод выдаст ошибку.

    Обратите внимание, что если click() запускает переход, будет отдельный объект page.waitForNavigation() Promise для ожидания. Правильный прыжок после ожидания щелчка выглядит так:


const [response] = await Promise.all([
  page.waitForNavigation(waitOptions),
  page.click(selector, clickOptions),
]);

  • page.waitForNavigation([options])

Этот метод разрешается, когда страница переходит на новый адрес или перезагружается, и полезен, если ваш код косвенно вызывает переход страницы.

больше ссылокpage.waitForNavigation([options])

Ссылаться на

Кукловод китайский сайт

Puppeteer npm