PHP - php抓取页面方法汇总

    //网页抓取方法总结
    //一、使用file_get_contents()
    $timeout = array(
        ‘http‘=> array(
            ‘timeout‘=>5, //设置一个超时时间,单位为秒
        )
    );
    $ctx = stream_context_create($timeout);
    $text = file_get_contents("http://www.baidu.com",0, $ctx);
    // var_dump($text); 

    //二、使用fopen()
    function request($url) {
        $timeout = array(
           ‘http‘ => array(
               ‘method‘=>‘GET‘,
               ‘timeout‘ => 5 //设置一个超时时间,单位为秒
           )
        );

        $ctx = stream_context_create($timeout);
        $response = ‘‘;
        if ($fp = fopen($url, "r", false, $ctx)) {
            while( $c = fread($fp, 8192)) {
                $response .= $c;
            }
            fclose($fp);
        }
        return $response;
    }
    $data = request(‘http://www.baidu.com‘);
    //var_dump($data);

    //使用file_get_contents和fopen必须空间开启allow_url_fopen。方
    //法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时
    //fopen和file_get_contents都不能打开远程文件。

    //三、使用CURL
    function request2($url, $method=‘GET‘, $data=‘‘) {
        $ch = curl_init();        

        if($method == ‘POST‘) {
            curl_setopt($ch, CURLOPT_POST, 1);
            $data ? curl_setopt($ch, CURLOPT_POSTFIELDS, $data) : ‘‘;
        }elseif($method == ‘GET‘) {
            $url = $data ? $url.‘?‘.http_build_query($data) : $url;
        }
        //curl_setopt($ch, CURLOPT_HEADER, 1);  //是否获取http响应头
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)‘);
        curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);   //默认为0,直接输出curl_exec获取到的信息
        curl_setopt($ch,CURLOPT_TIMEOUT,30);
        $res = curl_exec($ch);
        $info = curl_getinfo($ch);
        curl_close($ch);
        return array(‘content‘=>$res,‘headers‘=>$info);
    }
    $data = request2(‘http://www.baidu.com‘);
    //var_dump($data);

    //fopen / file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。
    //但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。
    //这大大减少了DNS查询的次数。
    //所以CURL的性能比fopen / file_get_contents 好很多。

    //四、使用socket
    //1、使用socket_create()
    function request3($url, $rettype=1, $method=‘GET‘, $postdata=‘‘) {
        //分析URL
        $pattern = ‘ /^(http|https):\/\/([a-zA-Z0-9_.]+)(:(\d+)){0,1}(.*)/i‘;
        if(!preg_match($pattern, $url, $mathes)) {
            die(‘URL格式错误!‘);
        }
        $host = gethostbyname($mathes[2]);
        $port = empty($mathes[4]) ? 80 : $mathes[4];
        $suri = empty($mathes[5]) ? ‘/‘ : $mathes[5]; //查询字符串

        //1、创建一个scoket
        $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if(!$socket) {
            die(‘创建scoket失败!‘.socket_strerror(socket_last_error()));
        }
        //2.创建一个socket连接
        $sconn = socket_connect($socket, $host, $port);
        if(!$sconn) {
            die(‘初始化scoket连接失败!‘.socket_strerror(socket_last_error()));
        }
        //3.写入scoket
        if($method == ‘GET‘) {
            $header = "GET $suri HTTP/1.1\r\n";
        }elseif($method == ‘POST‘) {
              $header = "Content-Type: application/x-www-form-urlencoded\r\n";
              $header .= "Content-Length: ".strlen($postdata)."\r\n";
              $header .= "\r\n";
              $header .= $postdata."\r\n";
        }
        $header .= "Host: $host\r\n";
        $header .= "Connection: Close\r\n";
        // $header .= "User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:29.0) Gecko/20100101 Firefox/29.0";
        $header .= "\r\n";
        $bytes = socket_write($socket, $header, strlen($header));
        if($bytes === false) {
            die(‘写入scoket失败!‘.socket_strerror(socket_last_error()));
        }
        //4.读取socket
        $response = ‘‘;
        while($v = socket_read($socket, 4096)) {
            $response.= $v;
        }
        //5.关闭scoket
        socket_close($socket);

        $data = preg_split(‘/\r\n\r\n/‘, $response, 2);
        if($rettype == 1) {   //获取响应正文
            return $data[1];
        }elseif($rettype == 2) {  //获取响应头
            return $data[0];
        }else {  //获取响应
            return $data[1];
        }
    }
    $response = request3(‘http://www.baidu.com‘, 1);
    // var_dump($response);

    //2、使用fsockopen()
    function request4($url, $rettype=1, $method=‘GET‘, $postdata=‘‘) {
        //分析URL
        $pattern = ‘ /^(http|https):\/\/([a-zA-Z0-9_.]+)(:(\d+)){0,1}(.*)/i‘;
        if(!preg_match($pattern, $url, $mathes)) {
            die(‘URL格式错误!‘);
        }
        $host = gethostbyname($mathes[2]);
        $port = empty($mathes[4]) ? 80 : $mathes[4];
        $suri = empty($mathes[5]) ? ‘/‘ : $mathes[5]; //查询字符串

        //1、打开一个scoket连接
        $fp = fsockopen($host, $port, $errno, $errstr);
        if(!$fp) {
            die(‘打开scoket连接失败!‘.$errstr);
        }

        //2.往文件句柄写入内容
        if($method == ‘GET‘) {
            $header = "GET $suri HTTP/1.1\r\n";
        }elseif($method == ‘POST‘) {
              $header = "Content-Type: application/x-www-form-urlencoded\r\n";
              $header .= "Content-Length: ".strlen($postdata)."\r\n";
              $header .= "\r\n";
              $header .= $postdata."\r\n";
        }
        $header .= "Host: $host\r\n";
        $header .= "Connection: Close\r\n";
        $header .= "\r\n";
        fwrite($fp, $header);

        //3.读取内容
        $response = ‘‘;
        while (!feof($fp)) {
            $response .= fgets($fp, 128);
        }

        //4.关闭文件句柄
        fclose($fp);

        $data = preg_split(‘/\r\n\r\n/‘, $response, 2);
        if($rettype == 1) {   //获取响应正文
            return $data[1];
        }elseif($rettype == 2) {  //获取响应头
            return $data[0];
        }else {  //获取响应
            return $data[1];
        }
    }

    $response = request4(‘http://www.163.com‘);
    // var_dump($response);

    //四、使用snoopy
    function request5($url) {
        include_once ‘interview_lib/snoopy.php‘;
        $snoopy = new snoopy();
        $snoopy->referer = ‘http://www.sina.com‘;
        $snoopy->fetch($url);
        return $snoopy->results;
    }
    $data = request5(‘http://www.163.com‘);
    var_dump($data);

    //snoopy很好用,封装好了,测试的都能抓取

?>

参考:http://blog.csdn.net/lxzo123/article/details/6718771

http://www.nowamagic.net/librarys/veda/detail/2585

http://www1.phpchina.com/archives/view-42979-1.html

http://blog.csdn.net/lxzo123/article/details/6718771

时间: 2024-08-10 04:47:54

PHP - php抓取页面方法汇总的相关文章

curl抓取页面时遇到重定向的解决方法

用php的curl抓取网页遇到了问题,为阐述方便,将代码简化如下: [php] view plaincopy <?php function curlGet($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, true); return curl_exec($ch);

好用的 curl 抓取 页面的封装函数

由于经常使用php curl 抓取页面的内容,在此mark 平时自己封装的 curl函数,(其实 现在也开始用 Python 来爬了~ ^-^) /** * 封装curl方法 * @author FredGui * @param string $url 必选 接口地址 * @param string $post 可选 如果是post访问填写post参数数组 * @param int $timeout 可选 超时时间 * @param string $cookie * @param int $de

PHP抓取网页方法总结

From:http://www.jb51.net/article/24343.htm 在做一些天气预报或者RSS订阅的程序时,往往需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址,然后得到html源代码或者xml数据. 得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来.下面先简单说一下本文的主要内容: 一. PHP抓取页面的主要方法: 1. file()函数 2. file_get_contents()函数

curl只能抓取页面的部分内容的原因

核心提示:先列出 HessianPHP 的错误提示: CURL transport error: transfer closed with outstanding read data remaining 基础知识背景: 1)"Expect: 100-continue"的来龙去脉: HTTP/1.1 协议里设计100 (Continue) HTTP 状态码的的目的是,在客 ... 先列出 HessianPHP 的错误提示: CURL transport error: transfer c

使用jsoup爬虫抓取页面

httpclient 和jsoup都可以实现模拟浏览器抓取页面,前者发送请求,后者解析htm标签比较强大.本例直接使用jsoup实现请求和解析. package com.chongdong.log.test; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.jsoup.Connection; import org.jsoup.Connection.Method; impo

php抓取页面的几种方式

在做一些天气预报或者RSS订阅的程序时,往往 需要抓取非本地文件,一般情况下都是利用php模拟浏览器的访问,通过http请求访问url地址, 然后得到html源代码或者xml数据,得到数据我们不能直接输出,往往需要对内容进行提取,然后再进行格式化,以更加友好的方式显现出来. 下面简单说一下php抓取页面的几种方法及原理: 一. PHP抓取页面的主要方法: 1. file()函数 2. file_get_contents()函数 3. fopen()->fread()->fclose()模式 4

用PHP抓取页面并分析

在做抓取前,记得把php.ini中的max_execution_time设置的大点,不然会报错的. 一.用Snoopy.class.php抓取页面 一个挺萌的类名.功能也很强大,用来模拟浏览器的功能,可以获取网页内容,发送表单等. 1)我现在要抓取一个网站的列表页的内容,我要抓取的是全国的医院信息内容,如下图: 2)我很自然的将URL地址复制下来,用Snoopy类来抓取前10页的页面内容,而且将内容放到本地来,在本地建立html文件,等下用于分析. $snoopy=new Snoopy(); /

蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 【原创,多图】

蓝牙4.0BLE cc2540 usb-dongle的 SmartRF Packet Sniffer 抓取数据方法 [原创,多图] (只发布于csdn博客, 如需转载,请注明出处,谢谢! ) 蓝牙4.0的开发, 现在真热火的很, 但是很多朋友买了我们出品的cc2540 usb-dongle后, 都反馈说不知道如何抓包, 并且, 即使很多朋友到TI官网论坛去找信息,不少朋友依然是无功而返,实际上, 用cc2540 usb-dongle来进行ble数据的抓包,并不像用电脑的wireshark等软件来

Python抓取页面乱码问题的解决

import urllib2 response=urllib2.urlopen('http://house.focus.cn/') html=response.read() print html.decode('gbk') Python抓取页面乱码问题的解决,布布扣,bubuko.com