Если у меня есть это
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
)?
Если вы хотите извлечь изображения с целевой 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.