• php抓取网页内容方法分析


    抓取数据就像是同网页做斗争,自己在这里记录下自己做斗争的这个过程,一步一步来。

    前两个网页抓取的都很顺利,但是到了果壳网发现以前用的方法不行了,于是换用curl:

    $ch = curl_init();
    $timeout = 5;
    curl_setopt ($ch, CURLOPT_URL,"http://mooc.guokr.com/search/course/?wd=qq");
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $contents3 = curl_exec($ch);
    curl_close($ch);
    
    $regex6="/<ul class="course_list".*?>.*?</ul>/ism";
    if(preg_match_all($regex6, $contents3, $matchs3)){
      //  echo($matchs3[0][0]);
    }else{
        echo '0';
    }
    echo "<hr/>";

    然后自己发现到了极客学院,自己上面的方法又不行了,抓取到的不是有用的数据反而是没什么用处的 网页说浏览器错误,原因是自己没有声明浏览器类型:

    
    $UserAgent = 'Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1';
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://www.jikexueyuan.com/search/s/q_%E5%BE%AE%E4%BF%A1');
    curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);
    $data = curl_exec($curl);

    然后接下来是网易云课堂,于是乎自己的上面的方法又不行了。一会再说网易云课堂这个鬼,因为它是用js的ajax动态加载的内容,所以就比较蛋疼。
    于是乎自己先抓了淘宝,但是发现抓淘宝的时候又有一个问题就是淘宝教育的编码并不是utf-8,于是自己在淘宝的抓取上用了这样一个函数:

    function safeEncoding($str){
        $code=mb_detect_encoding($str,array('ASCII','GB2312','GBK','UTF-8'));//检测字符串编码
        if($code=="CP936"){
            $result=$str;
        }
        else{
            //$result=mb_convert_encoding($str,'UTF-8',$code);//将编码$code转换为utf-8编码
            $result=iconv($code,"UTF-8",$str);
        }
        return $result;
    }

    只要对结果使用这个函数就没有什么问题了。

    然后自己在抓取开课吧的时候,又发现了一个新的问题: 开课吧的网址链接是相对链接的,自己需要替换成绝对链接,用正则替换或者一般的字符串替换替换成一般的绝对链接就可以:

    下面自己给了两个方法:

    $body=fcontents($url10,$cookie);
    $body=preg_replace("/href="/courses//u","href="http://www.kaikeba.com/courses/",$body);
    
    
    $regex9="/<ul class="list-unstyled course-row".*?</ul>/ism";
    if(preg_match_all($regex9, $body, $matchs5)){
        $temp=$matchs5[0][0];
    //    echo gettype($temp);
    //    $temp=str_replace("href="/courses","href="http://www.kaikeba.com/courses",$temp);
        echo($temp);
    
    }else{
        echo '0';
    }
  • 相关阅读:
    ORACLE【0】:基本操作
    ORACLE【3】:分区表以及分区索引
    ORACLE【2】:锁机制及解锁
    log4j学习一:解决系统日志错位问题
    使用一个非堵塞的socket用于接收http请求
    Python中文转换报错 'ascii' codec can't decode byte 0xe8 in position
    首次使用Redis记录【3】
    xsi:schemaLocation有何作用
    【转】【redis】3.Spring 集成注解 redis 项目配置使用
    maven仓库地址
  • 原文地址:https://www.cnblogs.com/zjunet/p/4559879.html
Copyright © 2020-2023  润新知