13

क्रोम देव उपकरण नेटवर्क टैब में एक प्रारंभकर्ता कॉलम है जो आपको दिखाएगा कि नेटवर्क अनुरोध किस कोड ने शुरू किया था।प्रोग्रामेटिक रूप से वेब अनुरोध आरंभकर्ता

network tab of chrome dev tools

मैं नेटवर्क अनुरोध सर्जक जानकारी प्रोग्राम के रूप में प्राप्त करने में सक्षम होना चाहते हैं, तो मैं एक url और request search string तर्क के साथ एक स्क्रिप्ट चलाने सकता है, और इसके बारे में जानकारी के वापसी होगी, जहां एक यूआरएल मिलान के साथ हर अनुरोध request search string पृष्ठ पर url पर आया था। तो तर्क www.stackoverflow.com और google उत्पादन कुछ इस तरह लग सकता है को देखते हुए (यूआरएल, लाइन नंबर का अनुरोध दिखा रहा है, और अनुरोध किए गए url):

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

मैं PhantomJS में देखा है, लेकिन इसकी onResourceRequested कॉलबैक किसी भी सर्जक जानकारी प्रदान नहीं करता , या संदर्भ से इसे प्राप्त किया जा सकता है, दस्तावेज के अनुसार: http://phantomjs.org/api/webpage/handler/on-resource-requested.html

क्या फैंटॉमजेएस के साथ, या सेलेनियम जैसे किसी अन्य उपकरण या सेवा के साथ ऐसा करना संभव है?

अद्यतन

टिप्पणियां और जवाब से अब तक ऐसा लगता है जैसे कि यह वर्तमान में प्रेत, सेलेनियम या कुछ और के द्वारा समर्थित नहीं है। तो यहां एक वैकल्पिक दृष्टिकोण है जो काम कर सकता है: पृष्ठ लोड करें, और सभी संपत्तियां, और फिर सभी फ़ाइलों में request search string की किसी भी घटना को ढूंढें। ऐसा कैसे किया जा सकता था?

+0

कुछ हद तक संबंधित: http://stackoverflow.com/questions/17650466/how-to-retrieve-the-initiator-of-a-request-when-extending-chrome-devtool। मुझे संदेह है कि शुरुआत के बाद से आप सेलेनियम के साथ पहलुओं को प्राप्त कर सकते हैं, दोनों वेबड्राइवर और क्रोम डेवलपर टूल क्रोम डिबगर्स हैं और एक ही समय में नहीं चल रहे हैं: https://sites.google.com/a/chromium.org/chromedriver/ मदद/devtools-window-keeps-clososing .. – alecxe

+0

'window.performance.getEntries()' में '' initiatorType'] है (https://w3c.github.io/resource-timing/#widl-PerformanceResourceTiming-initiatorType) प्रत्येक प्रविष्टि के लिए, लेकिन उससे अधिक नहीं और यह वही नहीं है जो आप खोज रहे हैं। – alecxe

उत्तर

2

आपको DevTools के विरुद्ध समस्या ट्रैकर में file a feature request होना चाहिए। शुरुआतकर्ता की जानकारी एचएआर में निर्यात नहीं की जाती है, इसलिए इसे बाहर निकालना काम नहीं करेगा। जहां तक ​​मुझे पता है, कोई भी मौजूदा एपीआई इसके लिए अनुमति नहीं देता है।

0

आप एक प्रक्रिया से Chrome की debugger protocol क्रोम के लिए बाहरी का उपयोग करें या एक Chrome extension में chrome.debugger एपीआई का उपयोग (How to retrieve the Initiator of a request when extending Chrome DevTool? देखें) कर सकते हैं।

+1

आपके द्वारा लिंक किया गया उत्तर कहता है कि यह संभव नहीं है। –

+0

@ बेनडॉलिंग, यह कहता है कि एक [क्रोम देवटूल एक्सटेंशन] (https://developer.chrome.com/extensions/devtools) और HAR के माध्यम से उजागर डेटा का उपयोग करते समय यह संभव नहीं है लेकिन यह डीबगर API के माध्यम से संभव है । मेरा सुझाव है [प्रोटोकॉल को स्नीफ करना] (https://developer.chrome.com/devtools/docs/debugger-protocol#sniffing-the-protocol) जैसा कि [तार पर डिबगिंग] के तहत वर्णित है (https://developer.chrome। कॉम/devtools/डॉक्स/डीबगर-प्रोटोकॉल # रिमोट) आवश्यक एपीआई खोजने के लिए आपको नेटवर्क विवरण प्राप्त करने की आवश्यकता होगी, और फिर अपने इच्छित डेटा को कैप्चर और एक्सपोज़र करने के लिए क्रोम एक्सटेंशन को कार्यान्वित करना होगा। – mfulton26

+0

मैं इसे एक हेडलेस एनवी में करना चाहता हूं। क्या क्रोम एक्सटेंशन उस के लिए काम करेगा? मुझे लगता है कि खोज स्ट्रिंग के लिए बस सभी संसाधनों को पकड़ने का मेरा सुझाया गया दृष्टिकोण जाने का सबसे आसान तरीका दिख रहा है। –

1

मैं एक ऐसे समाधान को कार्यान्वित करने में सक्षम हूं जो किसी पृष्ठ द्वारा लोड किए गए सभी यूआरएल प्राप्त करने के लिए फ़ैंटॉमजेएस का उपयोग करता है, और फिर उन यूआरएल पर खोज स्ट्रिंग को खोजने के लिए xargs, curl और grep के संयोजन का उपयोग करें।

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); 
}); 

यहाँ यह कार्रवाई में है:

पहले टुकड़ा इस स्क्रिप्ट है, जो केवल एक पृष्ठ से अनुरोध किया कि हर यूआरएल आउटपुट PhantomJS है

$ 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 

मेरी समस्या के लिए मुझे कोई दिलचस्पी नहीं छवियों में, और उन्हें phantomjs arg --load-images=no जोड़कर फिट किया जा सकता है।

दूसरा टुकड़ा सभी यूआरएल ले रहा है और उन्हें खोज रहा है। मैच को आउटपुट करने के लिए पर्याप्त नहीं है, मुझे उस संदर्भ की भी आवश्यकता है जिसके आसपास यूआरएल मिलान किया गया था, और आदर्श रूप से कौन सा लाइन नंबर भी था।

#!/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" 

:

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

हम यह सब ऊपर एक छोटे से स्क्रिप्ट, जहां हम पाइप हूँ उत्पादन ग्रेप के माध्यम से वापस रंग खोज स्ट्रिंग पर प्रकाश डाला प्राप्त करने के लिए लपेट कर सकते हैं: यहाँ कैसे ऐसा करने के लिए है इसके बाद हम किसी भी साइट पर किसी भी शब्द की खोज के लिए इसका उपयोग कर सकते हैं। यहाँ हम पर stackoverflow.com adzerk.net लिए देख रहे हैं:

enter image description here

तो आप देख सकते है कि adzerk.net अनुरोध मुख्य stackoverflow पेज की लाइन 4158 के आसपास कहीं शुरू किया जाता है। यह एक सही समाधान नहीं है क्योंकि यूआरएल परिभाषित किया गया है, जहां से आमंत्रण कहीं से अलग हो सकता है, लेकिन यह शायद एक करीबी है, और सटीक आमंत्रण साइट को ट्रैक करना शुरू करने के लिए निश्चित रूप से एक अच्छा बिंदु है।

प्रत्येक यूआरएल की सामग्री को खोजने का एक बेहतर तरीका हो सकता है। ऐसा लगता है कि फ़ैंटनजेएस के onResourceReceived हैंडलर वर्तमान में संसाधन सामग्री का खुलासा करते हैं, लेकिन ongoing work to address that है, और एक बार यह उपलब्ध होने के बाद यह सब आसान हो जाएगा।

संबंधित मुद्दे