• php curl多线程抓取网页


    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); 
    ?>

    注:转自http://www.cnblogs.com/jyginger/archive/2010/07/20/1781516.html

    通过curl节省网络传输时间,实现网络爬虫操作。

  • 相关阅读:
    XidianOJ 1073 Nunchakus
    XidianOJ 1024 2的幂次表示
    XidianOJ 1072 National Disaster
    XidianOJ 1093 一元三次方程
    中国剩余定理
    bzoj2818(欧拉函数递推)
    poj2311(博弈论,sg函数)
    contesthunter#46-A(分块)
    Tree,点分治
    poj3580(splay 毒瘤题)
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4919476.html
Copyright © 2020-2023  润新知