13

La scheda di rete di Chrome Dev Tools ha una colonna di iniziatore che ti mostrerà esattamente quale codice ha avviato la richiesta di rete.Avvia automaticamente la richiesta web

network tab of chrome dev tools

Mi piacerebbe essere in grado di ottenere informazioni di rete richiesta iniziatore di programmazione, in modo da poter eseguire uno script con un argomento url e request search string, e sarebbe tornare dettagli su dove ogni richiesta con un corrispondente URL request search string proviene dalla pagina url. Quindi, dato gli argomenti www.stackoverflow.com e google l'uscita potrebbe essere simile a questa (che mostrano la richiesta URL, numero di riga, e ha chiesto url):

/ 19 http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
/ 4291 http://www.google-analytics.com/analytics.js 

ho guardato in PhantomJS, ma la sua onResourceRequested callback non fornisce alcuna informazione iniziatore , o contesto dal quale può essere derivato, secondo la documentazione: http://phantomjs.org/api/webpage/handler/on-resource-requested.html

È possibile fare con PhantomJS o qualche altro strumento o servizio come il selenio?

UPDATE

Dai commenti e le risposte finora sembra come se questo non è attualmente supportato da Phantom, selenio o qualsiasi altra cosa. Ecco quindi un approccio alternativo che potrebbe funzionare: carica la pagina e tutte le risorse, quindi trova tutte le occorrenze di request search string in tutti i file. Come potrei farlo?

+0

Abbastanza collegato: http://stackoverflow.com/questions/17650466/how-to-retrieve-the-initiator-of-a-request-when-extending-chrome-devtool. Dubito che tu possa ottenere gli iniziatori con selenio dato che, per cominciare, sia gli strumenti di sviluppo per webdriver che quelli di Chrome sono debugger di Chrome e non possono essere eseguiti contemporaneamente: https://sites.google.com/a/chromium.org/chromedriver/ help/devtools-window-keeps-closing .. – alecxe

+0

'window.performance.getEntries()' ha il ['initiatorType'] (https://w3c.github.io/resource-timing/#widl-PerformanceResourceTiming-initiatorType) per ogni voce, ma non più di questo e non è esattamente quello che stai cercando. – alecxe

risposta

2

Si dovrebbe file a feature request nel tracker dei problemi contro DevTools. Le informazioni dell'iniziatore non vengono esportate nell'HAR, quindi portarlo fuori da lì non funzionerà. Per quanto ne so, nessuna API esistente lo consente.

0

È possibile utilizzare Chrome di debugger protocol da un processo esterno a Chrome o utilizzare il chrome.debugger API in una Chrome extension (vedi How to retrieve the Initiator of a request when extending Chrome DevTool?).

+1

La risposta che hai collegato dice che non è possibile. –

+0

@BenDowling, si dice che quando si utilizza un [Chrome DevTools Extension] (https://developer.chrome.com/extensions/devtools) e i dati esposti tramite HAR che non è possibile, ma è possibile tramite l'API debugger . Suggerisco [annusando il protocollo] (https://developer.chrome.com/devtools/docs/debugger-protocol#sniffing-the-protocol) come descritto in [Debug over the wire] (https://developer.chrome. com/devtools/docs/debugger-protocol # remote) per trovare le API necessarie necessarie per ottenere i dettagli di rete, ecc. e quindi implementare un'estensione chrome per acquisire ed esporre i dati desiderati. – mfulton26

+0

Voglio farlo in un ambiente senza testa. Un'estensione per Chrome funzionerebbe? Penso che il mio approccio suggerito di afferrare tutte le risorse per la stringa di ricerca sia il modo più semplice di procedere. –

1

Sono stato in grado di implementare una soluzione che utilizza PhantomJS per ottenere tutti gli URL caricati da una pagina e quindi utilizzare una combinazione di xargs, curl e grep per trovare la stringa di ricerca in quegli URL.

Il primo pezzo è questo PhantomJS script, che emette semplicemente ogni URL richiesto da una pagina:

system = require('system'); 
var page = require('webpage').create(); 

page.onResourceRequested= function(req) { 
    console.log(req.url); 
}; 

page.open(system.args[1], function(status) { 
    phantom.exit(1); 
}); 

Eccolo in azione:

$ phantomjs urls.js http://www.stackoverflow.com | head -n6 
http://www.stackoverflow.com/ 
http://stackoverflow.com/ 
http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js 
http://cdn.sstatic.net/Js/stub.en.js?v=06bb9dbfaca7 
http://cdn.sstatic.net/stackoverflow/all.css?v=af4b547e0e9f 
http://cdn.sstatic.net/img/share-sprite-new.svg?v=d09c08f3cb07 

per il mio problema non mi interessa in immagini, e quelli possono essere adattati aggiungendo l'argomento phantomjs --load-images=no.

Il secondo pezzo sta recuperando tutti gli URL e cercandoli. Non basta pubblicare la partita, ho bisogno anche del contesto intorno al quale l'URL è stato abbinato, e idealmente anche quale numero di riga.Ecco come fare:

$ cat urls | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})SEARCH_TERM(.{0,30})' | sed 's#^#% #'" 

Possiamo concludere questo tutto in un piccolo script, dove potremo pipe l'output indietro attraverso grep per ottenere colore di evidenziazione sulla stringa di ricerca:

#!/bin/bash 
phantomjs --load-images=no urls.js $1 | xargs -I% sh -c "curl -s % | grep -E -n -o '(.{0,30})$2(.{0,30})' | sed 's#^#% #' | grep $2 --color=always" 

Possiamo quindi usarlo per cercare qualsiasi termine su qualsiasi sito. Qui stiamo cercando adzerk.net su stackoverflow.com:

enter image description here

Così si può vedere che la richiesta adzerk.net viene iniziata da qualche parte intorno alla linea 4158 della pagina StackOverflow principale. Non è una soluzione perfetta perché l'invocazione potrebbe essere da qualche parte completamente diversa da dove è definito l'URL, ma probabilmente è una chiusura, e sicuramente un buon punto per iniziare a rintracciare il sito esatto di chiamata.

Potrebbe esserci un modo migliore per cercare i contenuti di ciascun URL. Non sembra che il gestore di PhantonJS onResourceReceived esponga attualmente il contenuto della risorsa, ma c'è lo ongoing work to address that e una volta disponibile tutto questo sarà molto più semplice.