123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- <?php
- namespace Spider\Lib;
- use Dever;
- class Parse
- {
- private $url = '';
- private $host = '';
- private $log;
- private $doc = array();
- private $data = array();
- public function __construct($url, $project, $rule, $col)
- {
- $doc = Doc::getInstance($url, $rule);
- $doc->log(new Log($project));
- $data = $doc->get();
- if ($data) {
- if (!is_array($data) && !is_object($data)) {
- $state = Dever::json_decode($data);
- if ($state) {
- $data = $state;
- }
- }
- if ($data) {
- if (is_array($data)) {
- $domain = parse_url($url);
- $host = $domain['scheme'] . '://' . $domain['host'];
- foreach ($data as $k => $v) {
- if (!strstr($v, 'http')) {
- $v = $host . $v;
- }
- $this->data[$k] = $this->load($doc, $v, $col, $project);
- }
- } else {
- $this->data = $this->load($doc, $data, $col, $project);
- }
- }
- }
- $doc->saveLog();
- }
- public function get()
- {
- return $this->data;
- }
- private function load($doc, $data, $col, $project)
- {
- $result = $table = array();
- $data = $doc->init($data);
- if (!$col) {
- if (Dever::input('test') == 1) {
- $doc->outLog();
- echo 'error';die;
- }
- return false;
- }
- foreach ($col as $v) {
- $callback = false;
- if (strpos($v['key'], '.') !== false) {
- $temp = explode('.', $v['key']);
- $v['key'] = $temp[1];
- $callback = $temp[0];
- }
- $value = $doc->rule($data, $col, $v);
- if ($value == 'error') {
- break;
- }
- if ($callback) {
- if (function_exists($callback)) {
- $value = $callback($value);
- } else {
- $value = Dever::{$callback}($value);
- }
- }
- $result[$v['key']] = $value;
- if (Dever::input('test') == 1) {
- $table[$v['name']] = $value;
- }
- }
- if (Dever::input('test') == 1) {
- $doc->outLog();
- print_r(Dever::table($table));die;
- }
- $this->update($result, $project);
- return $result;
- }
- private function update($data, $project)
- {
- $param['option_pid'] = $project;
- $param['option_value'] = json_encode($data, JSON_UNESCAPED_UNICODE);
- $info = Dever::db('spider/data')->one($param);
- if ($info) {
- $update = array();
- foreach ($param as $i => $j) {
- $i = str_replace('option_', 'set_', $i);
- $update[$i] = $j;
- }
- $id = $update['where_id'] = $info['id'];
- Dever::db('spider/data')->update($update);
- } else {
- $update = array();
- foreach ($param as $i => $j) {
- $i = str_replace('option_', 'add_', $i);
- $update[$i] = $j;
- }
- $id = Dever::db('spider/data')->insert($update);
- }
- }
- }
|