php 多线程抓取网页的代码分享

发布时间:2019-11-09编辑:脚本学堂
本文介绍下,用php实现多线程抓取网页的代码,有需要的朋友参考下。

在php中,可以使用Curl完成各种传送文件的操作,比如模拟浏览器发送GET,POST请求等。
php语言本身并不支持多线程,所以开发爬虫程序效率并不高,因此借助Curl Multi Functions 来实现并发多线程的访问多个url地址

有关curl的基础内容,可以参考如下的文章:
php curl应用实例分析
php curl用法的实例代码
php curl 学习总结
 

本节介绍使用 Curl Multi Functions 并发多线程下载文件的例子。

例1,获取内容直接写入文件

<?php
/**
* 多线程抓取网页内容
* edit by www.jb200.com
*/
$urls = array(   
 'http://www.sina.com.cn/',   
 'http://www.sohu.com/',   
 'http://www.jb200.com/' 
); //要抓取的页面URL   
     
$save_to='/test.txt';   //抓取内容的写入文件    
   
$st = fopen($save_to,"a");   
$mh = curl_multi_init();    
   
foreach ($urls as $i => $url) {   
  $conn[$i] = curl_init($url);   
  curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");   
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);   
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);   
  curl_setopt($conn[$i], CURLOPT_FILE,$st); //将爬取的代码写入文件   
  curl_multi_add_handle ($mh,$conn[$i]);   
} // 初始化   
     
do {   
  curl_multi_exec($mh,$active);   
} while ($active);  // 执行   
     
foreach ($urls as $i => $url) {   
  curl_multi_remove_handle($mh,$conn[$i]);   
  curl_close($conn[$i]);   
} // 结束清理   
     
curl_multi_close($mh);   
fclose($st); 
?>

例2,获取内容放入变量中,然后写入某个文件
 

<?php
$urls = array(   
 'http://www.sina.com.cn/',   
 'http://www.sohu.com/',   
 'http://www.jb200.com/' 
);   
   
$save_to='/test.txt';   //写入该文件   
$st = fopen($save_to,"a");   
   
$mh = curl_multi_init();   
foreach ($urls as $i => $url) {   
  $conn[$i] = curl_init($url);   
  curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");   
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);   
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);   
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true);  // 设置将爬取代码转化为字符串,不输出至浏览器   
  curl_multi_add_handle ($mh,$conn[$i]);   
}   
   
do {   
  curl_multi_exec($mh,$active);   
} while ($active);   
     
foreach ($urls as $i => $url) {   
  $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串   
  fwrite($st,$data);  // 将字符串写入文件。存入数据库也是可以的。   
} // 获得数据变量,并写入文件   
   
foreach ($urls as $i => $url) {   
  curl_multi_remove_handle($mh,$conn[$i]);   
  curl_close($conn[$i]);   
}   
   
curl_multi_close($mh);   
fclose($st);  
?>