• PHP利用Curl实现多线程抓取网页和下载文件


    PHP 利用 Curl  可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,然而因为php语言本身不支持多线程,所以开发爬虫程序效率并不高,一般采集 数据可以利用 PHPquery类来采集数据库,在此之外也可以用 Curl ,借助Curl 这个功能实现并发多线程的访问多个url地址以实现并发多线程抓取网页或者下载文件.

    至于具体实现过程,请参考下面几个例子:

    1、实现抓取多个URL并将内容写入指定的文件

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

    2、利用 PHP 的 Curl  实现抓取网页URL并保存内容

    下面这段代码和上面差不多意思,只不过这个地方是将获得的代码先放入变量,然后再将获取到的内容写入指定的文件

    1. $urls = array( 
    2. '路径地址', 
    3. '路径地址', 
    4. '路径地址' 
    5. ); 
    6. $save_to='/test.txt'; // 把抓取的代码写入该文件 
    7. $st = fopen($save_to,"a"); 
    8. $mh = curl_multi_init(); 
    9. foreach ($urls as $i => $url) { 
    10. $conn[$i] = curl_init($url); 
    11. curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"); 
    12. curl_setopt($conn[$i], CURLOPT_HEADER ,0); 
    13. curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60); 
    14. curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true); // 不将爬取代码写到浏览器,而是转化为字符串 
    15. curl_multi_add_handle ($mh,$conn[$i]); 
    16. } 
    17. do { 
    18. curl_multi_exec($mh,$active); 
    19. } while ($active); 
    20. foreach ($urls as $i => $url) { 
    21. $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串 
    22. fwrite($st,$data); // 将字符串写入文件
    23. } // 获得数据变量,并写入文件 
    24. foreach ($urls as $i => $url) { 
    25. curl_multi_remove_handle($mh,$conn[$i]); 
    26. curl_close($conn[$i]); 
    27. }
    28. curl_multi_close($mh); 
    29. fclose($st);
    复制

    3、利用 PHP 的 Curl  实现并发多线程下载文件

    1. $urls=array(
    2. '路径地址5w.zip',
    3. '路径地址5w.zip',
    4. '路径地址5w.zip'
    5. );
    6. $save_to='./home/';
    7. $mh=curl_multi_init();
    8. foreach($urls as $i=>$url){
    9. $g=$save_to.basename($url);
    10. if(!is_file($g)){
    11. $conn[$i]=curl_init($url);
    12. $fp[$i]=fopen($g,"w");
    13. curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
    14. curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
    15. curl_setopt($conn[$i],CURLOPT_HEADER ,0);
    16. curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
    17. curl_multi_add_handle($mh,$conn[$i]);
    18. }
    19. }
    20. do{
    21. $n=curl_multi_exec($mh,$active);
    22. }while($active);
    23. foreach($urls as $i=>$url){
    24. curl_multi_remove_handle($mh,$conn[$i]);
    25. curl_close($conn[$i]);
    26. fclose($fp[$i]);
    27. }
    28. curl_multi_close($mh);$urls=array(
    29. '路径地址5w.zip',
    30. '路径地址5w.zip',
    31. '路径地址5w.zip'
    32. );
    33. $save_to='./home/';
    34. $mh=curl_multi_init();
    35. foreach($urls as $i=>$url){
    36. $g=$save_to.basename($url);
    37. if(!is_file($g)){
    38. $conn[$i]=curl_init($url);
    39. $fp[$i]=fopen($g,"w");
    40. curl_setopt($conn[$i],CURLOPT_USERAGENT,"Mozilla/4.0(compatible; MSIE 7.0; Windows NT 6.0)");
    41. curl_setopt($conn[$i],CURLOPT_FILE,$fp[$i]);
    42. curl_setopt($conn[$i],CURLOPT_HEADER ,0);
    43. curl_setopt($conn[$i],CURLOPT_CONNECTTIMEOUT,60);
    44. curl_multi_add_handle($mh,$conn[$i]);
    45. }
    46. }
    47. do{
    48. $n=curl_multi_exec($mh,$active);
    49. }while($active);
    50. foreach($urls as $i=>$url){
    51. curl_multi_remove_handle($mh,$conn[$i]);
    52. curl_close($conn[$i]);
    53. fclose($fp[$i]);
    54. }
    55. curl_multi_close($mh);
    复制
  • 相关阅读:
    表单:文本框默认提示信息(小例子)
    代码:jquery小效果—— 吸顶
    Day5:面向对象的定义(中)
    Day5:面向对象的定义(上)
    Day4:数组(扩展知识)
    Day4:数组
    Day3:JAVA方法的定义
    Day2:JAVA判断与运算(循环)
    Eclipse使用技巧
    (HTTP)状态码详解
  • 原文地址:https://www.cnblogs.com/ZDPPU/p/5823857.html
Copyright © 2020-2023  润新知