• 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); 
    ?>
  • 相关阅读:
    AutoFac实现AOP扩展
    Nginx缓存、本地responseCache响应式缓存、ResourceFilter缓存。
    缓存基于http协议的前端缓存
    读取excel表格内容,处理后写输出xt文件上
    缓存memoryCache和redis分布式缓存
    Java 线上诊断工具Arthas
    c语言把16进制文本转16进制数组
    vue中使用tinymce,以及插件 powerpaste 的使用
    Go Concurrency Patterns: Pipelines and cancellation 孙龙
    golang 详解协程——errgroup 孙龙
  • 原文地址:https://www.cnblogs.com/qjyking/p/5343794.html
Copyright © 2020-2023  润新知