zoukankan      html  css  js  c++  java
  • php多线程抓取网页

    PHP实现多线程抓取网页

     

    PHP 利用 Curl Functions 可以完成各种传送文件操作,比如模拟浏览器发送GET,POST请求等等,受限于php语言本身不支持多线程,所以开发爬虫程序效率并不高,这时候往往需 要借助Curl Multi Functions 它可以实现并发多线程的访问多个url地址。既然 Curl Multi Function如此强大,能否用 Curl Multi Functions 来写并发多线程下载文件呢,当然可以,下面给出我的代码:

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <?php
    $urls = array(  
    ); // 设置要抓取的页面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:将获得的代码先放入变量,再写入某个文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
    $urls = array(  
    );  
       
    $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); 
    ?>
  • 相关阅读:
    linux学习(三)输入输出重定向和管道功能、cat命令、more命令
    linux基础学习(二)ls命令以及文件访问权限例(-rw-r-r--)
    c语言的全排列
    linux基础学习(一)常用命令:date、pwd、cd、cal、who、wc等等
    用linux编译并运行c文件
    安装linux虚拟机
    安装quickLook插件以及解决如何不能读取offic问题
    java:数据结构(四)二叉查找树以及树的三种遍历
    java:数据结构复习(三)链表队列
    数据结构java学习(三)循环队列
  • 原文地址:https://www.cnblogs.com/qjyking/p/5343794.html
Copyright © 2011-2022 走看看