2013-08-19 12 views
16

Kiedy próbuję złom this site z Phantomjs domyślnie Phantomjs wysłać następujące nagłówki serwera:Udawaj Firefoksa zamiast 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"} 

i dostaję odpowiedź status 405 "Not Allowed".

Przeczytałem w Phantomjs API Reference, że aby naśladować żądanie pochodzące z innej przeglądarki, powinienem zmienić wartość User-Agent. Na Wikipedii znalazłem wartość należy używać do udając Firefox pod Ubuntu:

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

W jakiej części Phantomjs należy umieścić ogłoszenia? Gdzie powinienem je wstawić - wewnątrz page.open lub wewnątrz page.evaluate, lub na górze?

Odpowiedz

20

Aktualnie jest na page.settings. Zrób to przed open.

Oto przykład używając go od tej strony, która powiązana:

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

Ten przykład będzie zeskrobać nazwę mecz w pierwszym rzędzie na stole. (Który w tym właśnie momencie jest "San Francisco Giants - Boston Red Sox")


O swoim komentarzu, rzeczywiście można użyć jQuery pod phantomjs! Sprawdź ten przykład:

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

Nawiasem mówiąc, oczekiwania, zamiast window.setTimeout użyłem na tej przykładów, polecam użyć waitfor.js zamiast.

+0

bardzo dziękuję, trudno jest zagrać z 'getElementsByClassName' po jQuery> sizzle – khex

+2

@khaljava Oh ale możesz użyć jquery pod phantomjs, po prostu nie zrobiłem tego w ten sposób, aby zachować prostotę. Sprawdź zaktualizowaną odpowiedź. –

+1

Niektóre witryny mają sposób na wykrycie PhantomJS nawet po ustawieniu nagłówków, zwracają błąd lub pusty ekran. Jeśli otworzę je w Chrome, wszystko będzie dobrze. Zastanawiam się, czy istnieje sposób, aby sobie z tym poradzić – Toolkit

Powiązane problemy