file_get_contents ( 'http://en.wikipedia.org/wiki/Category:Upcoming_singles'); - PullRequest
4 голосов
/ 07 октября 2011
file_get_contents('http://en.wikipedia.org/wiki/Category:Upcoming_singles');  

возвращает другой результат (2 продукта)

, тогда как посещение того же адреса с помощью Chrome возвращает 4 продукта.

При проверке, я подозреваю, это может быть связано с

Сохранено в ключе кэша синтаксического анализатора с ... timestamp ...

в возвращенном html.Временная метка старше, когда я использую file_get_contents()

Есть какие-нибудь идеи о том, как получить последнюю информацию, используя file_get_contents()?

Спасибо!

Ответы [ 4 ]

5 голосов
/ 07 октября 2011

Предполагая, что file_get_contents делает http-запрос, было бы хорошо проверить указанный пользовательский агент.

Я слышал о проблемах при получении данных с некоторыми пользовательскими агентами.Взгляните на этот вопрос .

Вы можете указать другие параметры (включая пользовательский агент), используя контекст потока:

<?php
$opts = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n"
  )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

Взгляните на file_get_contents документы .

Также, как сказал Джек, cURL - лучший вариант.

РЕДАКТИРОВАТЬ:

Вы меня не так поняли,То, что вы должны добавить, это другой пользовательский агент.Например, используя пользовательский агент из Mozilla Firefox, вы получите 4 результата:

<?php

    $opts = array(
      'http'=>array(
        'method'=>"GET",
        'header'=>"Accept-language: en\r\n" .
                  "User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; es-AR; rv:1.9.2.23) Gecko/20110921 Ubuntu/10.10 (maverick) Firefox/3.6.23"
      )
    );

    $context = stream_context_create($opts);

    // Open the file using the HTTP headers set above
    $file = file_get_contents('http://en.wikipedia.org/wiki/Category:Upcoming_singles', false, $context);
    print $file;

Но, я думаю, это не «законно», не стоит обманывать это.Я думаю, что должен быть любой другой пользовательский агент, который Википедия предоставляет для извлечения своих данных из внешних приложений.

2 голосов
/ 09 ноября 2011

В любом случае, вам действительно следует использовать MediaWiki API вместо того, чтобы пытаться отсканировать информацию со страницы категории, понятной человеку. Например, попробуйте этот запрос , используя list=categorymembers.

Некоторые заметки:

  • Выберите подходящий формат результатов (для PHP это, вероятно, format=php).
  • Предел по умолчанию составляет 10 результатов на запрос, но вы можете увеличить его до 500 с помощью cmlimit=max. После этого вам нужно будет использовать механизм продолжения запроса .

Вы также можете использовать одну из существующих клиентских библиотек MediaWiki API , чтобы позаботиться об этих и других мелких деталях.

И, наконец, пожалуйста, поиграйте с серверами Викимедиа: не отправляйте несколько одновременных запросов и сохраняйте результаты локально, если они понадобятся вам снова в ближайшее время. Рекомендуется включить вашу контактную информацию (URL-адрес или адрес электронной почты) в заголовок User-Agent, чтобы системные администраторы Wikimedia могли легко связаться с вами, если ваш код вызывает чрезмерную нагрузку на сервер.

2 голосов
/ 09 ноября 2011

В соответствии с политикой Wikimedia User-Agent требуется, чтобы все запросы идентифицировали себя. Я настоятельно рекомендую против фальсификации пользовательский агент браузера. В этом нет необходимости.

Миллионы машин постоянно имеют доступ к Википедии и другим проектам Фонда Викимедиа. Просто идентифицируйте себя, свой сценарий, это не сложно!

// Identify yourself by your bot, script, company, whatever
ini_set( 'user_agent', 'MyBot/1.0; John Doe (contact: info@example.og)' );

// Open the file using the HTTP headers set above
$contents = file_get_contents( 'http://en.wikipedia.org/wiki/Sandbox' );
echo $contents;
1 голос
/ 07 октября 2011

Попробуйте использовать cURL и установить заголовок для получения последней информации, а не кешей (извините, я не могу вспомнить точный заголовок для установки)

...