PHP 使用 CURL 同步抓取多个网页

一般CURL 抓网页的方法, 是一页一页抓, 假设要抓 4页, 所费时间各别是 5,10,7,5 秒, 那全部总合所花的时间就是 5 + 10 + 7 + 5 = 27 秒。若能同时间去抓取多个网页, 所花费的时间 5,10,7,5 秒, 全部总合所花的时间是 10 秒。(花费最多时间的秒数)

于JavaScript 可使用 AJAX 的 async(YAHOO.util.Connect.asyncRequest)来达成, 于 PHP 可以用 CURL 来达成此 Multi-Threading 的效果。

程序(async.php)

以下为引用的内容:
<?php
function async_get_url($url_array, $wait_usec = 0)
{
    if (!is_array($url_array))
        return false;

    $wait_usec = intval($wait_usec);

    $data    = array();
    $handle  = array();
    $running = 0;

    $mh = curl_multi_init(); // multi curl handler

    $i = 0;
    foreach($url_array as $url) {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
        curl_setopt($ch, CURLOPT_MAXREDIRS, 7);

        curl_multi_add_handle($mh, $ch); // 把 curl resource 放进 multi curl handler 里

        $handle[$i++] = $ch;
    }

    /* 执行 */
    do {
        curl_multi_exec($mh, $running);

        if ($wait_usec > 0) /* 每个 connect 要间隔多久 */
            usleep($wait_usec); // 250000 = 0.25 sec
    } while ($running > 0);

    /* 读取资料 */
    foreach($handle as $i => $ch) {
        $content  = curl_multi_getcontent($ch);
        $data[$i] = (curl_errno($ch) == 0) ? $content : false;
    }

    /* 移除 handle*/
    foreach($handle as $ch) {
        curl_multi_remove_handle($mh, $ch);
    }

    curl_multi_close($mh);

    return $data;
}
?>

使用

以下为引用的内容:
<?php
$urls = array('http://example1.com', 'http://example2.com');
print_r(async_get_url($urls)); // [0] => example1, [1] => example2
?>

测试

sleep.php # 看时间延长取得的效果

以下为引用的内容:
<?php
sleep(intval($_GET['time']));
echo intval($_GET['time']);
?>
以下为引用的内容:
<?php
$url_array = array(
        'http://example.com/sleep.php?time=5',
        'http://example.com/sleep.php?time=10',
        'http://example.com/sleep.php?time=7',
        'http://example.com/sleep.php?time=5',
        );
print_r(async_get_url($url_array));
// 总花费时间会是 10 秒, 并印出 [0] => 5, [1] => 10, [2] => 7, [3] => 5
?>
时间: 2024-10-26 01:17:32

PHP 使用 CURL 同步抓取多个网页的相关文章

php使用curl简单抓取远程url的方法

 这篇文章主要介绍了php使用curl简单抓取远程url的方法,涉及php操作curl的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php使用curl抓取远程url的方法.分享给大家供大家参考.具体如下: cURL是一个非常有用的php库,可以用来连接不通类型的服务器和协议,下面是一个最基本的范例用来抓取远程网页 ? 1 2 3 4 5 6 <?php $c = curl_init('http://www.w3mentor.com/robots.txt'); curl

php使用curl简单抓取远程url的方法_php技巧

本文实例讲述了php使用curl抓取远程url的方法.分享给大家供大家参考.具体如下: cURL是一个非常有用的php库,可以用来连接不通类型的服务器和协议,下面是一个最基本的范例用来抓取远程网页 <?php $c = curl_init('http://www.w3mentor.com/robots.txt'); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); $page = curl_exec($c); curl_close($c); ?> 希

php通过curl单独抓取网页可以,抓取多个就会出错

问题描述 php通过curl单独抓取网页可以,抓取多个就会出错 使用curl单独抓取http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722可行,但是如果抓取相同类型的一系列网站就会出错,将他们放在数组 $linkList中,分别是http://jobs.hubu.edu.cn/Detail.aspx?ArticleChannelId=81&ArticleId=5722,http://jobs.hubu.e

php curl大批量抓取 抓几百条后提示 连接被重置

问题描述 php curl大批量抓取 抓几百条后提示 连接被重置 php curl大批量抓取 抓几百条后提示 连接被重置 怎么弄呢 RECV FAILURE CONNECTION WAS RESET

PHP curl实现抓取302跳转后页面的示例_php实例

PHP的CURL正常抓取页面程序如下: $url = 'http://www.baidu.com'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_VERBOSE, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_NOBODY, true); curl_setopt($ch, CURLO

卢松松:搜索引擎如何抓取你的网页

搜索引擎优化(SEO)是搜索引擎有好的收录网页的过程,适当的SEO有利于蜘蛛爬行你的网站,使你的内容符合搜索引擎算法,以便确认它与关键词高度相关. 优化的目的就是使网页的内容便于蜘蛛理解,下面我就以百度新收录的一篇内容来进行说明,我以一个完整标题进行搜索,其目的是能反映出更多关键词在百度自然搜索的结果页面,能更好的说明搜索引擎是如何抓取你的网页的.   (图一:百度最常见的自然搜索结果列表) SEOer通常关注的是网页主体部分的自然搜索结果,百度和Google搜索结果页面大致相同,搜索结果页面通

C#实现抓取和分析网页类实例

  本文实例讲述了C#实现抓取和分析网页类.分享给大家供大家参考.具体分析如下: 这里介绍了抓取和分析网页的类. 其主要功能有: 1.提取网页的纯文本,去所有html标签和javascript代码 2.提取网页的链接,包括href和frame及iframe 3.提取网页的title等(其它的标签可依此类推,正则是一样的) 4.可以实现简单的表单提交及cookie保存 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

c#用httpwebrequest如何模拟抓取这样的网页信息

问题描述 c#用httpwebrequest如何模拟抓取这样的网页信息 c#用httpwebrequest如何模拟抓取这样的网页信息,下面内容是用fiddler抓取的.CONNECT user.cloudcall.hk:8080 HTTP/1.0User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1) AppleWebKitHost: user.cloudcall.hk:8080Content-Length: 0Connectio

解决方案-GET抓取安居客网页数据频繁了被屏蔽怎么绕过他的验证?

问题描述 GET抓取安居客网页数据频繁了被屏蔽怎么绕过他的验证? 用火车头采集安居客,但是一会就会全部跳转到输入验证码页面验证了才能正常访问,除了用代理还有其他的解决方案吗? 解决方案 只能换ip,既然服务器封了就没办法了.不过网上有那种代理服务器api,几块钱一天,可以获取上万的不同ip,可以说基本上也就相当于没限制. 解决方案二: 活该,谁叫你频繁地搞,搞到手的数据就存起来用啊.不如果不用等待答复的,直接构造IP包发送请求就完了. 解决方案三: 用神箭手云爬虫吧,平台自动帮你解决这种ip啊,