0

我正在尝试用 Goutte 抓取 Facebook 页面,以收集页面的“创建日期”。这不能通过 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;
}

关于检索整页内容的任何想法?

4

1 回答 1

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 是更好的选择。
  • 动态页面没有有意义的“创建日期”,无论如何都很难抓取
  • 始终检查页面重定向

如果您想查找页面首次出现在 Internet 上的日期,我建议您尝试完全不同的策略:http ://www.labnol.org/internet/search/find-publishing-date-of-web-pages /8410/

免责声明:我不知道“Graph API”是什么,所以我承认我可能不完全理解您的问题的上下文。我希望上面的一些内容是有帮助的。

于 2014-09-16T13:08:57.760 回答