Как передать переменные в Puppeteer page.on?

1

Если у меня есть это

page.on('response', this.extractImages);

Первый вопрос: как передать дополнительные переменные в this.extractImages? Функция определяется как extractImages(...args) но args это только:

[ Response {
    _client:
     Session {
       domain: null,
       _events: [Object],
       _eventsCount: 15,
       _maxListeners: undefined,
       _lastId: 9,
       _callbacks: Map {},
       _connection: [Object],
       _targetId: '3879dfee-f3de-48a8-a735-ac3b8cb4110e',
       _sessionId: '3879dfee-f3de-48a8-a735-ac3b8cb4110e:1' },
    _request:
     Request {
       _client: [Object],
       _requestId: '39213.259',
       _interceptionId: null,
       _interceptionHandled: false,
       _response: [Circular],
       _completePromiseFulfill: [Function],
       _completePromise: [Object],
       url: 'https://cm.g.doubleclick.net/pixel?google_nid=rubicon&google_cm&google_sc&google_awbid',
       method: 'GET',
       postData: undefined,
       headers: [Object] },
    _contentPromise: null,
    headers:
     Map {
       'pragma' => 'no-cache',
       'date' => 'Sat, 09 Sep 2017 06:46:10 GMT',
       'server' => 'HTTP server (unknown)',
       'status' => '302',
       'p3p' => 'policyref="https://googleads.g.doubleclick.net/pagead/gcn_p3p_.xml", CP="CURa ADMa DEVa TAIo PSAo PSDo OUR IND UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"',
       'location' => 'https://pixel.rubiconproject.com/tap.php?v=7751&nid=2249&expires=30&put=CAESEBK_unCwxxtI7mj-7CUjh3g&google_cver=1',
       'cache-control' => 'no-cache, must-revalidate',
       'content-type' => 'text/html; charset=UTF-8',
       'alt-svc' => 'quic="googleads.g.doubleclick.net:443"; ma=2592000; v="39,38,37,35",quic=":443"; ma=2592000; v="39,38,37,35"',
       'content-length' => '326',
       'x-xss-protection' => '1; mode=block',
       'expires' => 'Fri, 01 Jan 1990 00:00:00 GMT' },
    status: 302,
    ok: false,
    url: 'https://cm.g.doubleclick.net/pixel?google_nid=rubicon&google_cm&google_sc&google_awbid' } ]

Второй вопрос: как получить возврат из функции, вызванной page.on (в данном случае: this.extractImages)?

Теги:
google-chrome-devtools
puppeteer
chromium

1 ответ

1

Если вы хотите извлечь изображения с целевой HTML-страницы, это неправильное место для этого.

Когда вы пишете

page.on('response', this.extractImages);

puppeteer вызовет this.extractImages и передаст ему объект класса Response, который содержит различную информацию о том, как сервер ответил на запрос, что наиболее важно, заголовки. (Это именно то, что вы показали в вопросе). Но он не содержит HTML.


Чтобы проанализировать любые данные со страницы, вы предпочтете дождаться ее полной загрузки, а затем используйте page.evaluate для извлечения любой необходимой информации:

'use strict';

const puppeteer = require('puppeteer');

const url = 'https://example.com';
const extractImages = (selector) => {
    const imgs = Array.from(document.querySelectorAll(selector));
    return imgs.map(img => img.src);
}
const selector = '#some .content img';

(async() => {

    const browser = await puppeteer.launch()

    const page = await browser.newPage();

    await page.goto(url, {waitUntil: 'networkidle'});

    const images = await page.evaluate(extractImages, selector);

    console.log(images.join('\n'));
    browser.close();

})();

Адаптированный из этого примера, здесь можно найти больше примеров.

У кукловода есть еще несколько способов взаимодействия с целевой страницей, но я лично нахожу page.evaluate более логичным, так как он явно отделяет контекст сценария узла от контекста целевой страницы, как и в PhantomJS.

  • 0
    Этот сценарий не будет делать это много раз, изображения появляются не в теге <img>. Это может быть в div или background, и т. Д.
  • 0
    Пример не важен, просто хотел помочь. Реальный ответ - это первые два параграфа. Хорошо, я перефразирую.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню