2013-08-19 5 views
16

Wenn ich versuche, this site mit PhantomJS auszurangieren, die standardmäßig PhantomJS die folgenden Header an den Server senden:Pretend Firefox statt Phantom.js

"name":"User-Agent", 
"value":"Mozilla/5.0 (Unknown; Linux i686) AppleWebKit/534.34 (KHTML, like Gecko) PhantomJS/1.9.1 Safari/534.34"} 

Und ich erhalte eine status 405 "Not Allowed" Antwort.

Ich lese in der Phantomjs API Reference, dass ich meinen User-Agent-Wert ändern sollte, um eine Anfrage von einem anderen Browser zu imitieren. In der Wikipedia fand ich den Wert, den ich für vorgibt sein Firefox unter Ubuntu verwenden soll:

'name': 'User-Agent', 
'value': 'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:16.0) Gecko/20120815 Firefox/16.0' 

In welchem ​​Teil von PhantomJS soll ich diese Eigenschaften? Wo sollte ich sie einfügen - innerhalb page.open, oder innerhalb page.evaluate, oder an der Spitze?

Antwort

20

Eigentlich ist auf page.settings. Tun Sie es vor der open.

Hier ist ein Beispiel gegen die Seite mit Ihnen verbunden:

var page = require('webpage').create(); 
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36'; 
page.open('http://www.oddsportal.com/baseball/usa/mlb/results/page/', function() { 
    window.setTimeout(function() { 
     var output = page.evaluate(function() { 
      return document.getElementById('tournamentTable') 
      .getElementsByClassName('deactivate')[0] 
      .getElementsByTagName('a')[0] 
      .textContent; 
     }); 
     console.log(output); 
    }, 1000); 
}); 

Dieses Beispiel wird den Spielnamen, in der ersten Reihe auf dem Tisch kratzen. (Was in diesem Moment ist "San Francisco Giants - Boston Red Sox")


über Ihren Kommentar, eigentlich kann man jquery unter PhantomJS verwenden! Überprüfen Sie folgendes Beispiel:

var page = require('webpage').create(); 
page.settings.userAgent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.71 Safari/537.36'; 
page.open('http://www.oddsportal.com/baseball/usa/mlb/results/page/', function() { 
    window.setTimeout(function() { 
     page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js", function() { 
      var output = page.evaluate(function() { 
       return jQuery('#tournamentTable .deactivate:first a:first').text(); 
      }); 
      console.log(output); 
     }); 
    }, 1000); 
}); 

By the way, zu warten, statt der window.setTimeout ich auf dieser Beispiele verwendet, empfehle ich Ihnen waitfor.js stattdessen zu verwenden.

+0

Vielen Dank, es ist schwer zu spielen mit 'getElementsByClassName' nach jQuery> Sizzle – khex

+2

@khaljava Oh, aber Sie können jquery unter phantomjs verwenden, ich habe es einfach nicht so gemacht, um es einfach zu halten. Überprüfen Sie die aktualisierte Antwort. –

+1

einige Websites haben eine Möglichkeit, PhantomJS zu erkennen, auch wenn Sie Header setzen, sie geben Fehler oder leeren Bildschirm zurück. Wenn ich sie in Chrome öffne, ist alles in Ordnung. Ich frage mich, gibt es einen Weg, damit umzugehen – Toolkit

Verwandte Themen