【问题标题】:Data Scraping Problem数据抓取问题
【发布时间】:2010-08-28 20:54:26
【问题描述】:

我正在从 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 也设置为开启。脚本中是否有任何问题,或者我可能没有以正确的方式进行递归?任何解决方案/替代方案?

【问题讨论】:

  • 不使用fb api有什么原因吗?
  • Facebook 没有 API 吗?

标签: php facebook screen-scraping web-scraping


【解决方案1】:

您应该使用 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。您所要做的就是重新加载它们。

【讨论】:

  • 太好了,不知道如何为图形 api 修改 url。谢谢
  • @Sarfraz 应该是一个后续问题而不是更新
【解决方案2】:

按钮/链接可能会启动一个 XMLHttpRequest,因此请使用 firebug/developer console/无论您使用什么查看浏览器,查看它请求的 url 以及 HTTP 标头等。然后只需使用 cURL 和你明白了吗?

【讨论】:

    【解决方案3】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      • 2020-06-28
      • 2020-07-20
      • 2015-03-27
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多