用Goutte抓取Facebook页面


Scraping Facebook pages with Goutte

我试图用Goutte抓取facebook页面,以收集页面的"创建日期"。这是不能通过图形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;
}

关于检索整页内容有什么想法吗?

对于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

注释"Moved permanent ".

所以你需要测试重定向,并确保你正在抓取正确的页面。

在简介:

  • 不要使用Goutte查找最后修改时间。你需要解析HTTP头,所以cURL是一个更好的选择。
  • 动态页面没有有意义的"创建日期",无论如何都很难抓取
  • 始终检查页面重定向

如果你想找到一个页面第一次出现在互联网上的日期,我建议你尝试一个完全不同的策略:http://www.labnol.org/internet/search/find-publishing-date-of-web-pages/8410/

免责声明:我不知道什么是"图形API",所以我承认我可能不完全理解你的问题的背景。我希望上面的一些对你有帮助。