2013-08-19 7 views
16

Quando cerco di rottami this site con Phantomjs, per impostazione predefinita, Phantomjs inviare le seguenti intestazioni per server:Pretend Firefox invece di 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"} 

e ottengo una risposta status 405 "Not Allowed".

Ho letto nell'Riferimento API Phantomjs che, per imitare una richiesta proveniente da qualche altro browser, dovrei cambiare il valore del mio User-Agent. Su Wikipedia ho scoperto il valore è necessario utilizzare per fingere di essere Firefox sotto Ubuntu:

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

In quale parte del Phantomjs devo mettere gli annunci di questo? Dove devo inserirli - all'interno della pagina .open, o all'interno della pagina .Valutare o nella parte superiore?

risposta

20

Attualmente è page.settings. Fatelo prima dello open.

Ecco un esempio di usarlo contro di quella pagina si è collegato:

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

Questo esempio raschiare il nome partita in prima fila sul tavolo. (Il che, in questo preciso momento è "San Francisco Giants - Boston Red Sox")


proposito il commento, in realtà è possibile utilizzare jQuery sotto phantomjs! Controllare questo esempio:

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

Tra l'altro, per l'attesa, al posto del window.setTimeout ho utilizzato in questo esempio, vi consiglio di utilizzare waitfor.js invece.

+0

grazie mille, è difficile giocare con 'getElementsByClassName' dopo jQuery> sfrigolare – khex

+2

@khaljava Oh ma puoi usare jquery sotto phantomjs, non l'ho fatto per mantenerlo semplice. Controlla la risposta aggiornata. –

+1

alcuni siti web hanno un modo per rilevare PhantomJS anche se si impostano le intestazioni, restituiscono l'errore o lo schermo vuoto. Se li apro in Chrome, tutto va bene. Mi chiedo se ci sia un modo per affrontarlo – Toolkit