2015-07-22 4 views
9

मैं इस पृष्ठ पर प्रत्येक लिंक के लिए पृष्ठ विवरण पृष्ठ के पीछे स्क्रैप करना चाहता हूं।जावास्क्रिप्ट के साथ वेबसाइट से स्क्रैपिंग टेबल: सब ओपेन href लिंक

मैं इस पृष्ठ पर सभी जानकारियां प्राप्त कर सकते हैं:

href="javascript:subOpen('9ca8ed0fae15d43dc1257e7300345b99')" 

: PAGE

हालांकि, मैं सभी जानकारी विवरण पृष्ठ पर है, लेकिन href लिंक है कि तरह लग रहा है, उदाहरण के लिए प्राप्त करना चाहते हैं सामान्य अवलोकन पाने के लिए ImportHTML फ़ंक्शन का उपयोग करके मेरा नमूना स्प्रेडशीट यहां दिया गया है।

Google Spreadsheet

कोई सुझाव कैसे विवरण पृष्ठों पाने के लिए?

अद्यतन

मैं विधि निम्नलिखित कार्यान्वित:

function doGet(e){ 
    var base = 'http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/' 
    var feed = UrlFetchApp.fetch(base + 'suche?OpenForm&subf=e&query=%28%5BVKat%5D%3DEH%20%7C%20%5BVKat%5D%3DZH%20%7C%20%5BVKat%5D%3DMH%20%7C%20%5BVKat%5D%3DMW%20%7C%20%5BVKat%5D%3DMSH%20%7C%20%5BVKat%5D%3DGGH%20%7C%20%5BVKat%5D%3DRH%20%7C%20%5BVKat%5D%3DHAN%20%7C%20%5BVKat%5D%3DWE%20%7C%20%5BVKat%5D%3DEW%20%7C%20%5BVKat%5D%3DMAI%20%7C%20%5BVKat%5D%3DDTW%20%7C%20%5BVKat%5D%3DDGW%20%7C%20%5BVKat%5D%3DGA%20%7C%20%5BVKat%5D%3DGW%20%7C%20%5BVKat%5D%3DUL%20%7C%20%5BVKat%5D%3DBBL%20%7C%20%5BVKat%5D%3DLF%20%7C%20%5BVKat%5D%3DGL%20%7C%20%5BVKat%5D%3DSE%20%7C%20%5BVKat%5D%3DSO%29%20AND%20%5BBL%5D%3D0').getContentText(); 

     var d = document.createElement('div'); //assuming you can do this 
     d.innerHTML = feed;//make the text a dom structure 
     var arr = d.getElementsByTagName('a') //iterate over the page links 
     var response = ""; 
     for(var i = 0;i<arr.length;i++){ 
     var atr = arr[i].getAttribute('onclick'); 
     if(atr) atr = atr.match(/subOpen\((.*?)\)/) //if onclick calls subOpen 
     if(atr && atr.length > 1){ //get the id 
      var detail = UrlFetchApp.fetch(base + '0/'+atr[1]).getContentText(); 
      response += detail//process the relevant part of the content and append to the reposnse text 
     } 
     }  
     return ContentService.createTextOutput(response); 
} 

हालांकि, जब विधि चल मैं एक त्रुटि मिलती है:

ReferenceError: "document" is not defined. (line 6, file "")

document एक क्या है की वस्तु?

मैंने वेबपैप के साथ Google Spreadsheet अपडेट किया है।

मैं आपके उत्तर की सराहना करता हूं!

+0

[इस प्रश्न] का डुप्लिकेट (http://stackoverflow.com/questions/31452272/google-app-script-urlfetch-not-giving-html-output-but-javascript-ouput)। आपके जवाब के लिए – Mogsdad

उत्तर

6

आप पृष्ठ सामग्री और जावास्क्रिप्ट का निरीक्षण करने के लिए फ़ायरबग का उपयोग कर सकते हैं। उदाहरण के लिए आप पाते हैं कि सब ओपेन वास्तव में xmlhttp01.js में घोषित subOpenXML का उपनाम है।

function subOpenXML(unid) {/*open found doc from search view*/ 
if (waiting) return alert(bittewar); 
var wState = dynDoc.getElementById('windowState'); 
wState.value = 'H';/*httpreq pending*/ 
var last = ''; 
if (unid==docLinks[0]) {last += '&f=1'; thisdocnum = 1;} 
if (unid==docLinks[docLinks.length-1]) { 
    last += '&l=1'; 
    thisdocnum = docLinks.length; 
} else { 
    for (var i=1;i<docLinks.length-1;i++) 
    if (unid==docLinks[i]) {thisdocnum = i+1; break;} 
} 
var url = unid + html_delim + 'OpenDocument'+last + '&bm=2'; 
httpreq.open('GET', // &rand=' + Math.random(); 
    /*'/edikte/test/ex/exedi31.nsf/0/'+*/ '0/'+url, true); 
httpreq.onreadystatechange=onreadystatechange; 
// httpreq.setRequestHeader('Accept','text/xml'); 
httpreq.send(null); 
waiting = true; 
title2src = firstTextChild(dynDoc.getElementById('title2')).nodeValue; 
} 

तो, http कॉल करने से पहले एक console.log(url) जोड़ने के लिए समारोह स्रोत को कॉपी करने और फ़ायरबग कंसोल टैब में संशोधित करने के बाद, इस तरह:

var url = unid + html_delim + 'OpenDocument'+last + '&bm=2'; 
console.log(url) 
httpreq.open('GET', // &rand=' + Math.random(); 
    /*'/edikte/test/ex/exedi31.nsf/0/'+*/ '0/'+url, true); 

आप फ़ायरबग कंसोल टैब में समारोह घोषणा निष्पादित कर सकते हैं और संशोधित स्रोत के साथ उप ओपन ओवरराइट करें। लिंक में Clickin तो पता चलेगा कि लागू यूआरएल, '0 /' लगाया जाता subOpen को तो उदाहरण में आप पोस्ट यह एक पाने के लिए किया जाएगा आईडी पैरामीटर के रूप में पारित से बना है:

http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/0/1fd2313c2e0095bfc1257e49004170ca?OpenDocument&f=1&bm=2 

आप फ़ायरबग में नेटवर्क टैब खोलकर और लिंक पर क्लिक करके इसे सत्यापित भी कर सकता है।

इसलिए, आदेश विवरण पृष्ठ स्क्रैप करने में आप '0 /' के लिए

  • आईडी subOpen को
  • किसी GET कॉल करें पारित कर दिया पार्स

    1. नहीं करनी अनुरोध प्रतिक्रिया पार्स

    फ़ायरबग के नेटवर्क टैब में अनुरोध प्रतिक्रिया को देखते हुए दिखाता है कि शायद आपको दिखाए गए सामग्रियों को वास्तव में प्राप्त करने के लिए समान पार्सिंग करने की आवश्यकता होगी, लेकिन मैंने इसमें गहराई से नहीं देखा है।

    अद्यतन आयात HTML फ़ंक्शन आपके इच्छित स्क्रैपिंग के लिए उपयुक्त नहीं है। Google के HTML या Content सेवाएं इसके लिए बेहतर अनुकूल हैं। आप एक web app बना सकते हैं और doGet समारोह को लागू करने की आवश्यकता होगी:

    function doGet(e){ 
        var base = 'http://www.ediktsdatei.justiz.gv.at/edikte/ex/exedi3.nsf/' 
        var feed = UrlFetchApp.fetch(base + 'suche?OpenForm&subf=e&query=%28%5BVKat%5D%3DEH%20%7C%20%5BVKat%5D%3DZH%20%7C%20%5BVKat%5D%3DMH%20%7C%20%5BVKat%5D%3DMW%20%7C%20%5BVKat%5D%3DMSH%20%7C%20%5BVKat%5D%3DGGH%20%7C%20%5BVKat%5D%3DRH%20%7C%20%5BVKat%5D%3DHAN%20%7C%20%5BVKat%5D%3DWE%20%7C%20%5BVKat%5D%3DEW%20%7C%20%5BVKat%5D%3DMAI%20%7C%20%5BVKat%5D%3DDTW%20%7C%20%5BVKat%5D%3DDGW%20%7C%20%5BVKat%5D%3DGA%20%7C%20%5BVKat%5D%3DGW%20%7C%20%5BVKat%5D%3DUL%20%7C%20%5BVKat%5D%3DBBL%20%7C%20%5BVKat%5D%3DLF%20%7C%20%5BVKat%5D%3DGL%20%7C%20%5BVKat%5D%3DSE%20%7C%20%5BVKat%5D%3DSO%29%20AND%20%5BBL%5D%3D0').getContentText(); 
         var response = ""; 
         var match = feed.match(/subOpen\('.*?'\)/g) 
         if(match){ 
         for(var i = 0; i < match.length;i++){ 
           var m = match[i].match(/\('(.*)'\)/); 
           if(m && m.length > 1){ 
           var detailText = UrlFetchApp.fetch(base + '0/'+m[1]); 
           response += //dosomething with detail text 
              //and concatenate in the response 
           } 
         } 
         } 
         return ContentService.createTextOutput(response); 
    
    
    } 
    
  • +0

    Thx! मुझे यह कहना है कि मैं गुगल स्क्रिप्टिंग भाषा के साथ बहुत savy नहीं हूँ, इसलिए अगर आप Google स्प्रेडशीट में अपने वांछित पृष्ठ से सामग्री दिखाने के लिए मेरी मदद कर सकते हैं तो मैं सराहना करता हूं। अपने आप से पार्सिंग को समझ लेंगे। – mrquad

    +1

    आपके उत्तर के लिए उत्तर – Grasshopper

    +0

    Thx अद्यतन किया गया है! हालांकि, मुझे अभी भी एक त्रुटि मिलती है, कृपया मेरे अपडेट पर नज़र डालें! – mrquad

    -1

    आप जावा पृष्ठभूमि की बिट है, तो आप http://htmlunit.sourceforge.net/ (या अन्य परीक्षण ढांचे) का उपयोग कर सकते वेबपेज के किसी भी प्रकार स्क्रैप करने के लिए। यह वेब पेजों के तत्व प्राप्त करने के लिए जावा स्क्रिप्ट इंटरैक्शन के साथ-साथ उपयोगिता विधियों का समर्थन करता है।

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