PHP - 获取另一个网站内容并解析的最快方法

3

我需要从网站获取一些用户参数。由于每个用户都有唯一的ID,我可以通过URL搜索用户:

http://page.com/search_user.php?uid=X

因此,我将此URL添加到for()循环中,并尝试获取500个结果:

<?php

$start = time();
$results = array();

for($i=0; $i<= 500; $i++)
{
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, 'http://page.com/search_user.php?uid='.$i);
    curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; pl; rv:1.9.1.2) Gecko/20090729 desktopsmiley_2_2_5643778701369665_44_71 DS_gamingharbor Firefox/3.5.2 (.NET CLR 3.5.30729)');
    curl_setopt($c, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    $p = curl_exec($c);
    curl_close($c);

    if ( preg_match('"<span class=\"uname\">(.*?)</span>"si', $p, $matches) )
    {
        $username = $matches[1];
    }
    else
    {
        continue;
    }

    preg_match('"<table cellspacing=\"0\">(.*?)</table>"si', $p, $matches);
    $comments = $matches[1];

    preg_match('"<tr class=\"pos\">(.*?)</tr>"si', $comments, $matches_pos);
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_pos[1], $matches);
    $comments_pos = $matches[1][2];

    preg_match('"<tr class=\"neu\">(.*?)</tr>"si', $comments, $matches_neu);
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_neu[1], $matches);
    $comments_neu = $matches[1][2];

    preg_match('"<tr class=\"neg\">(.*?)</tr>"si', $comments, $matches_neg);
    preg_match_all('"<td>([0-9]+)</td>"si', $matches_neg[1], $matches);
    $comments_neg = $matches[1][2];

    $comments_all = $comments_pos+$comments_neu+$comments_neg;

    $about_me = 0;
    if ( preg_match('"<span>O mnie</span>"si', $p) )
    {
        $about_me = 1;
    }

    $results[] = array('comments' => $comments_all, 'about_me' => $about_me, 'username' => $username);
}

echo 'Generated in: <b>'.(time()-$start).'</b> seconds.<br><br>';
var_dump($results);
?>

最终我得到了结果: - 所有内容生成耗时 135 秒。

然后我用 file_get_contents() 替换了 curl,结果是:155 秒。

有比 curl 更快的方式获取这个结果吗?我需要从另一个页面获取 20,000,000 个结果,而 135 秒对我来说太长了。

谢谢。


这是每天都发生的事情还是只有一次性的? - Cups
一次性的。最后,我想使用CRON启动此脚本,并在时间段内获取所有结果(20,000,000),每500个结果休息1秒钟。 - NewbieUser
2个回答

2
如果你确实需要查询500个不同的URL,也许你应该考虑使用异步方法。上述问题的瓶颈在于curl请求本身是最慢的部分。当等待响应时,你的代码什么都不做。
可以试着看看“PHP异步cURL回调”(即你会“几乎同时”发出500个请求,并在它们到来时异步处理响应)。请参考此链接

那么我应该创建一个包含500个URL的数组,然后在回调函数中根据来自此回调的响应创建preg_match吗? - NewbieUser
@NewbieUser 抱歉,我没有时间为您编写完整的解决方案,我只是想指出最有前途的方法似乎是异步地在某个回调中解析/处理获取的URL,这样执行就不会像这样:获取、等待、响应、解析/处理、获取另一个、等待...而是像获取1、获取2、获取3、响应1、解析1、获取4、响应2等。 - LihO

0

看一下我以前的一个答案,关于如何分而治之这种工作。

调试长时间运行的PHP脚本

在你的情况下,我会建议你遵循同样的思路,但你需要将请求进一步划分为500个一组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接