php curl multi多线程抓取下载网页/图片等在线文件的方法

2015年07月02日 03:26 by:佚名

转载一个php curl multi多线程方法:

php语言本身不支持多线程,所以开发爬虫程序效率并不高,借助Curl Multi 它可以实现并发多线程的访问多个url地址。用 Curl Multi 多线程下载文件代码:

代码1:将获得的代码直接写入某个文件

  1. <?php
  2. $urls =array(  
  3.  'http://wwwl.lao8.org/',  
  4.  'http://www.baidu.com/',  
  5. );// 设置要抓取的页面URL  
  6.      
  7. $save_to='test.txt';  // 把抓取的代码写入该文件   
  8.    
  9. $st =fopen($save_to,"a");  
  10. $mh = curl_multi_init();   
  11.    
  12. foreach ($urls as $i =>$url) {  
  13.   $conn[$i] = curl_init($url);  
  14.   curl_setopt($conn[$i], CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
  15.   curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
  16.   curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
  17.   curl_setopt($conn[$i], CURLOPT_FILE,$st);// 设置将爬取的代码写入文件  
  18.   curl_multi_add_handle ($mh,$conn[$i]);  
  19. }// 初始化  
  20.      
  21. do {  
  22.   curl_multi_exec($mh,$active);  
  23. }while ($active); // 执行  
  24.      
  25. foreach ($urls as $i =>$url) {  
  26.   curl_multi_remove_handle($mh,$conn[$i]);  
  27.   curl_close($conn[$i]);  
  28. }// 结束清理  
  29.      
  30. curl_multi_close($mh);  
  31. fclose($st);
  32. ?>

代码2:将获得的代码先放入变量,再写入某个文件

  1. <?php
  2. $urls =array(  
  3.  'http://m.lao8.org/',  
  4.  'http://www.baidu.com/',  
  5.  'http://www.163.com/
  6. );  
  7.    
  8. $save_to='/test.txt';  // 把抓取的代码写入该文件  
  9. $st =fopen($save_to,"a");  
  10.    
  11. $mh = curl_multi_init();  
  12. foreach ($urls as $i =>$url) {  
  13.   $conn[$i] = curl_init($url);  
  14.   curl_setopt($conn[$i], CURLOPT_USERAGENT,"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");  
  15.   curl_setopt($conn[$i], CURLOPT_HEADER ,0);  
  16.   curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);  
  17.   curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 设置不将爬取代码写到浏览器,而是转化为字符串  
  18.   curl_multi_add_handle ($mh,$conn[$i]);  
  19. }  
  20.    
  21. do {  
  22.   curl_multi_exec($mh,$active);  
  23. }while ($active);  
  24.      
  25. foreach ($urls as $i =>$url) {  
  26.   $data = curl_multi_getcontent($conn[$i]);// 获得爬取的代码字符串  
  27.   fwrite($st,$data); // 将字符串写入文件。当然,也可以不写入文件,比如存入数据库  
  28. }// 获得数据变量,并写入文件  
  29.    
  30. foreach ($urls as $i =>$url) {  
  31.   curl_multi_remove_handle($mh,$conn[$i]);  
  32.   curl_close($conn[$i]);  
  33. }  
  34.    
  35. curl_multi_close($mh);  
  36. fclose($st); 
  37. ?>

标签:php curl multi