curl 抓取网页(PHP的调用测试(get(get)函数(图) )

优采云 发布时间: 2022-03-30 22:18

  curl 抓取网页(PHP的调用测试(get(get)函数(图)

)

  PHP 的 curl 功能真的很强大。有一个 curl_multi_init 函数,它是批处理任务。可以利用这一点实现多进程同步抓取多条记录,优化常见的网页爬取程序。

  一个简单的抓取功能:

  function http_get_multi($urls){

$count = count($urls);

$data = [];

$chs = [];

// 创建批处理cURL句柄

$mh = curl_multi_init();

// 创建cURL资源

for($i = 0; $i < $count; $i ++){

$chs[ $i ] = curl_init();

// 设置URL和相应的选项

curl_setopt($chs[ $i ], CURLOPT_RETURNTRANSFER, 1); // return don&#39;t print

curl_setopt($chs[ $i ], CURLOPT_URL, $urls[$i]);

curl_setopt($chs[ $i ], CURLOPT_HEADER, 0);

curl_multi_add_handle($mh, $chs[ $i ]);

}

// 增加句柄

// for($i = 0; $i < $count; $i ++){

// curl_multi_add_handle($mh, $chs[ $i ]);

// }

// 执行批处理句柄

do {

$mrc = curl_multi_exec($mh, $active);

} while ($active > 0);

while ($active and $mrc == CURLM_OK) {

if (curl_multi_select($mh) != -1) {

do {

$mrc = curl_multi_exec($mh, $active);

} while ($mrc == CURLM_CALL_MULTI_PERFORM);

}

}

for($i = 0; $i < $count; $i ++){

$content = curl_multi_getcontent($chs[ $i ]);

$data[ $i ] = ( curl_errno($chs[ $i ]) == 0 ) ? $content : false;

}

// 关闭全部句柄

for($i = 0; $i < $count; $i ++){

curl_multi_remove_handle($mh, $chs[ $i ]);

}

curl_multi_close($mh);

return $data;

}

  以下调用测试(get() 函数在这里:):

  //弄很多个网页的url<br />$url = [

&#39;http://www.baidu.com&#39;,

&#39;http://www.163.com&#39;,

&#39;http://www.sina.com.cn&#39;,

&#39;http://www.qq.com&#39;,

&#39;http://www.sohu.com&#39;,

&#39;http://www.douban.com&#39;,

&#39;http://www.cnblogs.com&#39;,

&#39;http://www.taobao.com&#39;,

&#39;http://www.php.net&#39;,

];

$urls = [];

for($i = 0; $i < 10; $i ++){

foreach($url as $r)

$urls[] = $r . &#39;/?v=&#39; . rand();

} <br /><br />//并发请求

$datas = http_get_multi($urls);

foreach($datas as $key => $data){

file_put_contents(&#39;log/multi_&#39; . $key . &#39;.txt&#39;, $data); // 记录一下请求结果。记得创建一个log文件夹

}

$t2 = microtime(true);

echo $t2 - $t1;

echo &#39;<br />&#39;;<br /><br />//同步请求, get()函数如这里: http://www.cnblogs.com/whatmiss/p/7114954.html

$t1 = microtime(true);

foreach($urls as $key => $url){

file_put_contents(&#39;log/get_&#39; . $key . &#39;.txt&#39;, get($url)); // 记录一下请求结果。记得创建一个log文件夹

}

$t2 = microtime(true);

echo $t2 - $t1;

  在测试结果中,存在明显的差距,并且随着数据量的增加,差距会呈指数级增长:

  2.4481401443481

21.68923997879

8.925509929657

24.73141503334

3.243185043335

23.384337902069

3.2841880321503

24.754415035248

3.2091829776764

29.068662881851

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线