PHP 实现页面抓取

我承认有很多很好的实现,但是自己还是使用Curl实现了一个简单的页面抓取类,主要用到了Curl 和 simple_html_dom, 直接上代码:
class HttpClient {

    private $cookiePath = "d:/my.cookie";

    /**
     * HTTP GET
     * @param unknown $url
     * @return mixed
     */
    public function request($url) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookiePath);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $result = curl_exec($ch);
        curl_close($ch);
        return $result;
    }

    /**
     * download file
     * @param unknown $url
     * @param unknown $target
     * @return boolean
     */
    public function download($url, $target) {
        $ch = curl_init ();
        curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, 'GET' );
        curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, false );
        curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
        curl_setopt ( $ch, CURLOPT_URL, $url );
        ob_start ();
        curl_exec ( $ch );
        $return_content = ob_get_contents ();
        ob_end_clean ();

        $return_code = curl_getinfo ( $ch, CURLINFO_HTTP_CODE );
        $filename = $target;
        unlink($filename);
        $fp= @fopen($filename,"a"); //将文件绑定到流 
        fwrite($fp,$return_content); //写入文件
        return true;
    }

    /**
     * post data to remote url
     * @param unknown $url
     * @param unknown $params
     * @return mixed
     */
    public function post($url, $params) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookiePath);
        curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiePath);
        $result=curl_exec($ch);
        curl_close($ch);
        return $result;
    }
}

HttpClient类实现了3个方法,一个用于普通的get请求,一个用于下载文件,一个用于POST数据,比如提交登录表单,因为都保存了Cookie信息,所以基本上可以实现模拟浏览器的一些操作。
simple_html_dom是一个用于解析HTML的简单实现,类似 jquery 或 Css的selector的方式来获取HTML文件中的内容,非常简单:

    $client = new HttpClient();
    $url ='http://www.sample.com/list.do';
    $result = $client->request($url);
    $dom = str_get_html($result);


        $titles = array();
        $records = array();
        foreach($dom->find("table.ti_b th") as $th) {
            //var_dump($th);
            if($th) {
                $titles[] = $th->innertext;
            }
        }
        foreach($dom->find("table.ti_b td") as $td) {
            if($td) {
                $records[] = $td->innertext;
            }
        }

使用str_get_html()可以从HTML字符串中创建dom对象,当然也可以使用simple_html_dom中的file_get_html()从URL或文件中得到dom对象,使用dom对象就可以像jquery那样读取标签数据。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值