1

Si j'ai cetteComment transmettre des variables à Puppeteer page.on?

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

Première question: Comment passer I variables supplémentaires en fonction this.extractImages? La fonction est définie comme extractImages(...args) mais args est seulement ceci:

[ 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' } ] 

Deuxième question: Comment puis-je obtenir le retour de la fonction qui a déclenché page.on (dans ce cas: this.extractImages)?

Répondre

1

Si vous souhaitez extraire des images d'une page HTML cible, ce n'est pas le bon endroit pour le faire.

Lorsque vous écrivez

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

marionnettiste appellera this.extractImages et passer à un objet de la Response class, qui contient diverses informations sur la façon dont le serveur a répondu à la demande, surtout, les en-têtes. (C'est exactement ce que vous avez montré dans la question). Mais il ne contient pas de HTML.


Pour analyser toutes les données d'une page que vous préférez attendre pour charger complètement puis utilisez page.evaluate pour extraire toutes les informations nécessaires:

'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(); 

})(); 

Adapté de this example, d'autres exemples peuvent être trouvé here. Dans le marionnettiste, il y a plusieurs façons d'interagir avec une page cible, mais je trouve personnellement page.evaluate plus logique car elle sépare clairement le contexte de script de nœud du contexte d'une page cible, comme dans PhantomJS.

+0

Ce scénario ne le fera pas autant de fois, les images ne sont pas en . Il pourrait être en div ou en arrière-plan, etc. –

+0

L'exemple est sans importance, je voulais juste aider. La vraie réponse est les deux premiers pararaphes. Ok, je vais reformuler. – Vaviloff