2010-03-30 27 views
5

Próbuję pobrać zawartość strony internetowej przy użyciu PHP. Kiedy wydać polecenie:PHP file_get_contents() zachowuje się inaczej niż przeglądarka

$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.php?searchMode=2"); 

zwraca stronę, która informuje, że serwer jest wyłączony. Jednak po wklejeniu tego samego adresu URL do przeglądarki uzyskuję oczekiwaną stronę.

Czy ktoś ma pojęcie, co to powoduje? Czy file_get_contents przesyła jakieś nagłówki, które odróżniają go od żądania przeglądarki?

Odpowiedz

16

Tak, są pewne różnice - przeglądarka wysyła dużo informacji o dodatkach: HTTP headers, Powiedziałbym; a te, które są wysyłane przez oba, prawdopodobnie nie mają tej samej wartości.

Tutaj, po wykonaniu kilku testów, wydaje się, że konieczne jest przekazanie nagłówka HTTP o nazwie Accept.

Można to zrobić za pomocą trzeciego parametru file_get_contents, aby określić źródło dodatkowego informacje kontekstowe:

$opts = array('http' => 
    array(
     'method' => 'GET', 
     //'user_agent ' => "Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2) Gecko/20100301 Ubuntu/9.10 (karmic) Firefox/3.6", 
     'header' => array(
      'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*\/*;q=0.8 
' 
     ), 
    ) 
); 
$context = stream_context_create($opts); 

$f = file_get_contents("http://mobile.mybustracker.co.uk/mobile.php?searchMode=2", false, $context); 
echo $f; 

Dzięki temu jestem w stanie uzyskać kod HTML strony.


Uwagi:

  • raz pierwszy przetestowany minięciu User-Agent, ale nie wydaje się być konieczne - dlatego odpowiednia linia jest tutaj jako komentarz
  • Wartość jest używany dla nagłówka Accept jest tym, którego używa Firefox, gdy poprosiłem o tę stronę w przeglądarce Firefox przed próbą z file_get_contents.
    • Niektóre inne wartości mogą być OK, ale nie wykonałem żadnego testu w celu ustalenia, która wartość jest wymagana.


Aby uzyskać więcej informacji, można spojrzeć na:

-3

zamienić wszystkie spacje z% 20

Powiązane problemy