2014-10-21 12 views
7

Ich klicke auf einen Link in Firefox, die Webseite sendet eine Anfrage mit Javascript, dann sendet der Server eine Art von Antwort, die eine Website-Adresse enthält. Also öffnet sich diese neue Webseite in einem neuen Fenster. Der HTML-Code hinter dem Link ist (ich habe weggelassen Anfangs- und Abschluss <span> Tag):Capture AJAX Antwort mit Selen und Python

> class="taLnk hvrIE6" 
> onclick="ta.trackEventOnPage('AttractionContactInfo', 'Website', 
> 2316062, 1); ta.util.cookie.setPIDCookie(15190); 
> ta.call('ta.util.link.targetBlank', event, this, 
> {'aHref':'LqMWJQiMnYQQoqnQQxGEcQQoqnQQWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQJMsVCIpEVMSsVEtHJcSQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYmkXHJUokUHnmKTnJXB', 
> 'isAsdf':true})">Website 

ich die Antwort des Servers erfassen möchten und extrahieren Sie die "neue Website mit Python und Selen. Ich habe BeautifulSoup zum Scraping benutzt und bin ziemlich neu in Selenium.

Bis jetzt kann ich dieses Element finden und klicken Sie es mit Selen, die die "neue Website" in einem neuen Fenster öffnet. Ich weiß nicht, wie ich die Antwort vom Server erfassen soll.

+0

Ich denke, der Titel der Frage ist irreführend - Beautifulsoup hat nichts mit Ihrer Frage zu tun. "AJAX-Antwort mit Selenium erhalten" oder etwas ist relevant. – SiddharthaRT

+0

Ein leitender Mitglied schlug mir vor, meine Frage auf diese Weise umzubenennen ... mein eigentlicher Titel war in der Tat verwandt mit Python und Selen – Faisal

Antwort

1

Ich konnte nicht auf AJAX-Antwort mit Selen zu erfassen, aber hier ist, was funktioniert, wenn auch ohne Selen:

1- die XML-Anforderung finden Sie, indem Sie die Netzwerkanalysetools in Ihrem Browser Überwachung

2 = Sobald Sie die Anfrage identifiziert haben, regenerieren Sie sie mit den Anfragen von Python oder den Modulen von urllib2. Ich persönlich empfehle Anfragen wegen seiner zusätzlichen Funktionen, am wichtigsten war für mich Anfragen.

Sie können viel Hilfe und relevante Beiträge zu diesen beiden Schritten finden.

Ich hoffe, es wird jemandem irgendwann helfen.

+0

Habe genau das für eine Seite getan, die ich kratze.Es dauerte eine Weile, um herauszufinden, was der eigentliche Anruf von den Netzwerkwerkzeugen von Chrome war, aber ich fand es. Dann habe ich die Antwort in meinem Browser und schließlich mit Anfragen getestet. Lief wie am Schnürchen. In meinem Fall scheint die Ausgabe eine Mischung aus JSON und anderen Daten zu sein - alles leicht geparst. Danke noch einmal. –

+0

Ich bin froh, dass ich helfen konnte. – Faisal

8

Ich habe einmal einige Ajax-Aufrufe abgefangen, die Javascript auf der Seite mit Selen injizieren. Die schlechte Seite der Geschichte ist, dass Selen manchmal "fragil" sein könnte. Aus keinem Grund bekam ich während dieser Injektion Selen-Ausnahmen.

Wie auch immer, meine Idee war, die XHR-Aufrufe abzufangen und ihre Antwort auf ein neues dom-Element zu setzen, das ich selbst aus Selen manipulieren konnte. In der Bedingung für das Abhören können Sie auch die URL verwenden, die die Anfrage gemacht, um nur die eine abfangen, die Sie tatsächlich wollen (self._url)

btw, hatte ich die Idee von intercept all ajax calls?

Vielleicht hilft.

browser.execute_script(""" 
(function(XHR) { 
    "use strict"; 

    var element = document.createElement('div'); 
    element.id = "interceptedResponse"; 
    element.appendChild(document.createTextNode("")); 
    document.body.appendChild(element); 

    var open = XHR.prototype.open; 
    var send = XHR.prototype.send; 

    XHR.prototype.open = function(method, url, async, user, pass) { 
    this._url = url; // want to track the url requested 
    open.call(this, method, url, async, user, pass); 
    }; 

    XHR.prototype.send = function(data) { 
    var self = this; 
    var oldOnReadyStateChange; 
    var url = this._url; 

    function onReadyStateChange() { 
     if(self.status === 200 && self.readyState == 4 /* complete */) { 
     document.getElementById("interceptedResponse").innerHTML += 
      '{"data":' + self.responseText + '}*****'; 
     } 
     if(oldOnReadyStateChange) { 
     oldOnReadyStateChange(); 
     } 
    } 

    if(this.addEventListener) { 
     this.addEventListener("readystatechange", onReadyStateChange, 
     false); 
    } else { 
     oldOnReadyStateChange = this.onreadystatechange; 
     this.onreadystatechange = onReadyStateChange; 
    } 
    send.call(this, data); 
    } 
})(XMLHttpRequest); 
""") 
+0

Vielen Dank für Ihre Erfahrungen. Ich habe keine praktikablen Kenntnisse von Javascript. Ich musste nur einige Daten sammeln, die die Website als Antwort auf einen Ajax-Anruf gesendet hat. Die Lösung scheint zu identifizieren und den Aufruf mit Python-eigenen Modulen wie Anfragen oder urllib zu simulieren. Dies hilft mir, Daten ohne Javascript Zeug zu sammeln. – Faisal

+0

Wenn Sie die URL der Website im Voraus kennen, müssen Sie nicht mit Javascript beschäftigen, aber in meinem Fall war es nicht einfach, im Voraus einige der Parameter der zu wissen url, also musste ich mich mit js beschäftigen. Wenn die Lösung Ihres Problems das ist, was Sie vorher gepostet haben, markieren Sie es bitte als Antwort auf Ihre Frage. – supita

+0

Fast zwei Jahre später, ist das immer noch der richtige Weg? Ich muss die URLs der Ajaxaufrufe meiner Website abrufen, da ich einige der Parameter im Voraus nicht kenne. Und was ist mit Timing? Wie kann ich sicher sein, dass dieses Skript ausgeführt wird, bevor irgendwelche Ajax-Anfragen passieren? Danke. – Hinrich