Парсинг страниц Facebook с помощью Goutte

Я пытаюсь очистить страницы Facebook с помощью Goutte, чтобы собрать «дату создания» страницы. Это недоступно через Graph API.

При тестировании я могу получить все ссылки со страниц, таких как tutsplus и symfony-project, однако, когда я пытаюсь получить доступ к странице типа 'https://www.facebook.com/151116474914629» возвращает 2 ссылки, что неверно.

Код:

use Symfony\Component\DomCrawler\Crawler;
use Goutte\Client as Goutte;

public function goutte()
{
    $url_to_traverse = 'https://www.facebook.com/151116474914629';

    $client = new Goutte();
    $crawler = $client->request('GET', $url_to_traverse);
    $status_code = $client->getResponse()->getStatus();
    if($status_code==200){
        $a_count = $crawler->filter('a')->count();     
    }
    return $a_count;
}

Любые идеи по получению полного содержимого страниц?


person ProblyPicasso    schedule 31.07.2014    source источник


Ответы (1)


В Facebook подавляющее большинство содержимого страницы генерируется динамически — множественные вызовы Ajax и так далее. Это делает его очень, очень трудным для очистки. И, конечно же, для любой страницы, которая генерируется динамически, «дата создания» — это действительно дата, когда вы запрашиваете страницу каждый раз.

В контексте веб-страниц я не знаю очевидного способа получить дату создания, но дата модификации включена как необязательная часть спецификации HTTP 1.1. Таким образом, многие (но не все) веб-сайты будут отправлять заголовок Last-Modified вместе с веб-страницей. Этот заголовок можно изменить программно, и он совершенно бессмысленен на динамических веб-страницах, поэтому я бы не стал на него полагаться.

Вам не повезло с Facebook в любом случае. Нет заголовка Last-Modified (я проверял, в том числе после перенаправления этой конкретной страницы). И я не уверен, что еще вы могли бы искать на этой странице, чтобы найти дату создания.

Что касается других операций Goutte на этой странице и с учетом того, что я сказал о создании динамической страницы, вы все равно можете получить некоторое содержимое. Просто следите за перенаправлениями. Используя cURL в командной строке, вы можете увидеть, что веб-страница перенаправляется с https://www.facebook.com/151116474914629 на https://www.facebook.com/PhilzCoffeeCastro:

me@here:~$ curl --head https://www.facebook.com/151116474914629
HTTP/1.1 301 Moved Permanently
Location: https://www.facebook.com/PhilzCoffeeCastro
[snip]
Date: Tue, 16 Sep 2014 12:54:01 GMT
Connection: keep-alive
Content-Length: 0

Примечание «Перемещено навсегда».

Поэтому вам нужно проверить перенаправление и убедиться, что вы очищаете правильную страницу.

В итоге:

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

Если вы хотите найти дату, когда страница впервые появилась в Интернете, я бы посоветовал попробовать совершенно другую стратегию: http://www.labnol.org/internet/search/find-publishing-date-веб-страниц/8410/

Отказ от ответственности: я не знаю, что такое «Graph API», поэтому я допускаю, что не могу полностью понять контекст вашего вопроса. Я надеюсь, что что-то из вышеперечисленного будет полезным.

person Rob Pomeroy    schedule 16.09.2014