|
|
@@ -0,0 +1,104 @@
|
|
|
+<?php
|
|
|
+/**
|
|
|
+ * Created by PhpStorm.
|
|
|
+ * User: Jaeger <JaegerCode@gmail.com>
|
|
|
+ * Date: 2017/10/1
|
|
|
+ * Baidu searcher
|
|
|
+ */
|
|
|
+
|
|
|
+namespace QL\Ext;
|
|
|
+
|
|
|
+use QL\Contracts\PluginContract;
|
|
|
+use QL\QueryList;
|
|
|
+
|
|
|
+class Baidu implements PluginContract
|
|
|
+{
|
|
|
+ protected $ql;
|
|
|
+ protected $keyword;
|
|
|
+ protected $pageNumber = 10;
|
|
|
+ const API = 'https://www.baidu.com/s';
|
|
|
+ const RULES = [
|
|
|
+ 'title' => ['h3','text'],
|
|
|
+ 'link' => ['h3>a','href']
|
|
|
+ ];
|
|
|
+ const RANGE = '.result';
|
|
|
+
|
|
|
+ public function __construct(QueryList $ql, $pageNumber)
|
|
|
+ {
|
|
|
+ $this->ql = $ql->rules(self::RULES)->range(self::RANGE);
|
|
|
+ $this->pageNumber = $pageNumber;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static function install(QueryList $queryList, ...$opt)
|
|
|
+ {
|
|
|
+ $name = $opt[0] ?? 'baidu';
|
|
|
+ $queryList->bind($name,function ($pageNumber = 10){
|
|
|
+ return new Baidu($this,$pageNumber);
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public function search($keyword)
|
|
|
+ {
|
|
|
+ $this->keyword = $keyword;
|
|
|
+ return $this;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function page($page = 1,$realURL = false)
|
|
|
+ {
|
|
|
+ return $this->query($page)->query()->getData(function ($item) use($realURL){
|
|
|
+ $realURL && $item['link'] = $this->getRealURL($item['link']);
|
|
|
+ return $item;
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getCount()
|
|
|
+ {
|
|
|
+ $count = 0;
|
|
|
+ $text = $this->query(1)->find('.nums')->text();
|
|
|
+ if(preg_match('/[\d,]+/',$text,$arr))
|
|
|
+ {
|
|
|
+ $count = str_replace(',','',$arr[0]);
|
|
|
+ }
|
|
|
+ return (int)$count;
|
|
|
+ }
|
|
|
+
|
|
|
+ public function getCountPage()
|
|
|
+ {
|
|
|
+ $count = $this->getCount();
|
|
|
+ $countPage = ceil($count / $this->pageNumber);
|
|
|
+ return $countPage;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function query($page = 1)
|
|
|
+ {
|
|
|
+ $this->ql->get(self::API,[
|
|
|
+ 'wd' => $this->keyword,
|
|
|
+ 'rn' => $this->pageNumber,
|
|
|
+ 'pn' => $this->pageNumber * ($page-1)
|
|
|
+ ]);
|
|
|
+ return $this->ql;
|
|
|
+ }
|
|
|
+
|
|
|
+ protected function getRealURL($url)
|
|
|
+ {
|
|
|
+ //得到百度跳转的真正地址
|
|
|
+ $header = get_headers($url,1);
|
|
|
+ if (strpos($header[0],'301') || strpos($header[0],'302'))
|
|
|
+ {
|
|
|
+ if(is_array($header['Location']))
|
|
|
+ {
|
|
|
+ //return $header['Location'][count($header['Location'])-1];
|
|
|
+ return $header['Location'][0];
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return $header['Location'];
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ return $url;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|