ThinkPHP类库-Org类库-QueryList(采集工具)

2026-04-26 07:32:11 211
分类:php

QueryList使用jQuery选择器来做采集,让你告别复杂的正则表达式;QueryList具有jQuery一样的DOM操作能力、Http网络操作能力、乱码解决能力、内容过滤能力以及可扩展能力。

这个版本是基于旧版本修改的,新版本需要php7支持,而且用的静态函数,很多实用方法都变了。我还是习惯用旧版的。

有些无法采集的可以用自定义采集函数采集后将html传给QueryList。

<?php
// +----------------------------------------------------------------------
// | 改编:栉风沐雨 <188150920@qq.com> 最后修改时间:2017-10-19
// +----------------------------------------------------------------------
class QueryList
{
    public $jsonArr = array ();
    private $regArr = array ();
    private $regRange;
    private $html;

    /**
     * Summary of QueryList
     * @param String $pageURL  采集路径
     * @param Array  $regArr   采集规则:"名称"=>array("选择器","类型")
     * @param String $regRange 采集节点范围(提高集效率)
     */
    public function QueryList($pageURL = '', $regArr = array (), $regRange = '')
    {
        if ($pageURL) {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $pageURL);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
            $this->html = curl_exec($ch);
            curl_close($ch);
        }

        if (!empty($regArr)) {
            $this->regArr = $regArr;
            $this->regRange = $regRange;
            $this->getList();
        }
    }

    public function setQuery($regArr, $regRange = '')
    {
        $this->jsonArr = array ();
        $this->regArr = $regArr;
        $this->regRange = $regRange;
        $this->getList();
    }

    public function getHtml()
    {
        return $this->html;
    }

    public function setHtml($html)
    {
        $this->html = $html;
    }

    private function getList()
    {
        import('ORG.phpQuery');
        $hobj = phpQuery::newDocumentHTML($this->html);

        if (!empty($this->regRange)) {
            $robj = pq($hobj)->find($this->regRange);
            $i = 0;
            foreach ($robj as $item) {
                while (list($key, $reg_value) = each($this->regArr)) {
                    $iobj = pq($item)->find($reg_value[0]);
                    switch ($reg_value[1]) {
                        case 'text':
                            $this->jsonArr[$i][$key] = trim(pq($iobj)->text());
                            break;
                        case 'html':
                            $this->jsonArr[$i][$key] = trim(pq($iobj)->html());
                            break;
                        case 'htmlOuter':
                            $this->jsonArr[$i][$key] = trim(pq($iobj)->htmlOuter());
                        default:
                            $this->jsonArr[$i][$key] = pq($iobj)->attr($reg_value[1]);
                            break;
                    }
                }
                //重置数组指针
                reset($this->regArr);
                $i++;

            }
        }
        else {
            while (list($key, $reg_value) = each($this->regArr)) {
                $lobj = pq($hobj)->find($reg_value[0]);
                $i = 0;
                foreach ($lobj as $item) {
                    switch ($reg_value[1]) {
                        case 'text':
                            $this->jsonArr[$i++][$key] = trim(pq($item)->text());
                            break;
                        case 'html':
                            $this->jsonArr[$i++][$key] = trim(pq($item)->html());
                            break;
                        case 'htmlOuter':
                            $this->jsonArr[$i++][$key] = trim(pq($item)->htmlOuter());
                        default:
                            $this->jsonArr[$i++][$key] = pq($item)->attr($reg_value[1]);
                            break;
                    }
                }
            }
        }
    }

    public function getJSON()
    {
        return json_encode($this->jsonArr);
    }
}