数据刮擦问题

时间:2010-08-28 20:54:27

标签: php facebook screen-scraping web-scraping

我正在从Facebook页面抓取墙上帖子的数据,这里是网址:

http://www.facebook.com/GMHTheBook?v=wall&ref=ts#!/GMHTheBook?v=wall&ref=ts

我使用CURL成功地刮掉了所有可见的墙柱。

问题:

在可见墙帖的末尾,有较旧帖子链接,一旦您点击该链接,就会显示更多墙帖。现在我如何手动点击该链接以显示更多墙帖并废弃这些帖子?

使用任何方法的任何解决方案?我虽然使用CURL,但我希望有任何解决方案来处理这种情况?

更新

现在我使用此代码获取所有数据,找到下一个链接并获取该URL的数据等等,这是代码:

ini_set('display_errors', true);
error_reporting(E_ALL);

$data = json_decode(file_get_contents(($url)), true);

$names = array();
$stories = array();

foreach($data['data'] as $post)
{
    $names[] = $post['from']['name'];
    $stories[] = $post['message'];
}

$url = $data['paging']['next'];

// this is meant to scrap data recurssively from the next links
while($url !== '')
{
    $url = $data['paging']['next'];
    $data = json_decode(file_get_contents(($url)), true);

    foreach($data['data'] as $post)
    {
        $names[] = $post['from']['name'];
        $stories[] = $post['message'];
    }

    $url = urldecode($data['paging']['next']);
    echo $url . '<br />';
}


for($j = 0; $j < count($names); $j++)
{
  $data .= $names[$j] . '|' . $stories[$j] . "\n";
}

$h = fopen("data.txt", "a+");
fwrite($h, $data);
fclose($h);

但问题是脚本继续运行而根本没有输出,也没有创建文件。我也将脚本时间设置设置为更高的值。 allow_url_fopen也设置为开启。脚本中有什么问题或者我可能没有以正确的方式进行递归吗?任何解决方案/替代方案?

3 个答案:

答案 0 :(得分:4)

您应该使用Graph API。您正在抓取的数据以JSON格式提供

并包含获取上一页/下一页的链接,例如寻呼。

示例:

$data = json_decode(file_get_contents(($url)));
foreach($data->data as $post) {
    echo $post->from->name, ': ',
         $post->message,
         PHP_EOL;
}

以上将输出墙上的所有帖子。对于分页做

echo $data->paging->previous;
echo $data->paging->next;

这将输出两个URL。您所要做的就是再次加载它们。

答案 1 :(得分:2)

按钮/链接可能会启动XMLHttpRequest,因此请在浏览器中查看firebug / developer console /您使用的任何内容,查看它所请求的URL以及HTTP标头等。然后使用cURL执行相同的请求你有它吗?

答案 2 :(得分:0)

http://www.facebook.com/ajax/stream/profile.php?__a=1&profile_id=139878432710216&viewer_id=(your facebook id)&filter=1&max_time=1283023194&_log_clicktype=Filter%20Stories%20or%20Pagination&ajax_log=1

它是通过ajax加载的。您还需要弄清楚这些变量。最长时间可能是从什么时候开始显示帖子。

好的,上面的链接可以更短(相同的输出)......

http://www.facebook.com/ajax/stream/profile.php?__a=1&profile_id=139878432710216&max_time=1283023194