php 获取京东交易账号,PHP爬虫爬取京东列表

这里使用到了一个php插件下面是源码simple_html_dom.php

defined('IN_ECS');

define('HDOM_TYPE_ELEMENT', 1);

define('HDOM_TYPE_COMMENT', 2);

define('HDOM_TYPE_TEXT', 3);

define('HDOM_TYPE_ENDTAG', 4);

define('HDOM_TYPE_ROOT', 5);

define('HDOM_TYPE_UNKNOWN', 6);

define('HDOM_QUOTE_DOUBLE', 0);

define('HDOM_QUOTE_SINGLE', 1);

define('HDOM_QUOTE_NO', 3);

define('HDOM_INFO_BEGIN', 0);

define('HDOM_INFO_END', 1);

define('HDOM_INFO_QUOTE', 2);

define('HDOM_INFO_SPACE', 3);

define('HDOM_INFO_TEXT', 4);

define('HDOM_INFO_INNER', 5);

define('HDOM_INFO_OUTER', 6);

define('HDOM_INFO_ENDSPACE',7);

// helper functions

// -----------------------------------------------------------------------------

// get html dom form file

function file_get_html() {

$dom = new simple_html_dom;

$args = func_get_args();

$dom->load(call_user_func_array('file_get_contents', $args), true);

return $dom;

}

// get html dom form string

function str_get_html($str, $lowercase=true) {

$dom = new simple_html_dom;

$dom->load($str, $lowercase);

return $dom;

}

// dump html dom tree

function dump_html_tree($node, $show_attr=true, $deep=0) {

$lead = str_repeat(' ', $deep);

echo $lead.$node->tag;

if ($show_attr && count($node->attr)>0) {

echo '(';

foreach($node->attr as $k=>$v)

echo "[$k]=>\"".$node->$k.'", ';

echo ')';

}

echo "\n";

foreach($node->nodes as $c)

dump_html_tree($c, $show_attr, $deep+1);

}

// get dom form file (deprecated)

function file_get_dom() {

$dom = new simple_html_dom;

$args = func_get_args();

$dom->load(call_user_func_array('file_get_contents', $args), true);

return $dom;

}

// get dom form string (deprecated)

function str_get_dom($str, $lowercase=true) {

$dom = new simple_html_dom;

$dom->load($str, $lowercase);

return $dom;

}

// simple html dom node

// -----------------------------------------------------------------------------

class simple_html_dom_node {

public $nodetype = HDOM_TYPE_TEXT;

public $tag = 'text';

public $attr = array();

public $children = array();

public $nodes = array();

public $parent = null;

public $_ = array();

private $dom = null;

function __construct($dom) {

$this->dom = $dom;

$dom->nodes[] = $this;

}

function __destruct() {

$this->clear();

}

function __toString() {

return $this->outertext();

}

// clean up memory due to php5 circular references memory leak...

function clear() {

$this->dom = null;

$this->nodes = null;

$this->parent = null;

$this->children = null;

}

// dump node's tree

function dump($show_attr=true) {

dump_html_tree($this, $show_attr);

}

// returns the parent of node

function parent() {

return $this->parent;

}

// returns children of node

function children($idx=-1) {

if ($idx===-1) return $this->children;

if (isset($this->children[$idx])) return $this->children[$idx];

return null;

}

// returns the first child of node

function first_child() {

if (count($this->children)>0) return $this->children[0];

return null;

}

// returns the last child of node

function last_child() {

if (($count=count($this->children))>0) return $this->children[$count-1];

return null;

}

// returns the next sibling of node

function next_sibling() {

if ($this->parent===null) return null;

$idx = 0;

$count = count($this->parent->children);

while ($idxparent->children[$idx])

++$idx;

if (++$idx>=$count) return null;

return $this->parent->children[$idx];

}

// returns the previous sibling of node

function prev_sibling() {

if ($this->parent===null) return null;

$idx = 0;

$count = count($this->parent->children);

while ($idxparent->children[$idx])

++$idx;

if (--$idx<0) return null;

return $this->parent->children[$idx];

}

// get dom node's inner html

function innertext() {

if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];

if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

$ret = '';

foreach($this->nodes as $n)

$ret .= $n->outertext();

return $ret;

}

// get dom node's outer text (with tag)

function outertext() {

if ($this->tag==='root') return $this->innertext();

// trigger callback

if ($this->dom->callback!==null)

call_user_func_array($this->dom->callback, array($this));

if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];

if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

// render begin tag

$ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();

// render inner text

if (isset($this->_[HDOM_INFO_INNER]))

$ret .= $this->_[HDOM_INFO_INNER];

else {

foreach($this->nodes as $n)

$ret .= $n->outertext();

}

// render end tag

if(isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)

$ret .= ''.$this->tag.'>';

return $ret;

}

// get dom node's plain text

function text() {

if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];

switch ($this->nodetype) {

case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

case HDOM_TYPE_COMMENT: return '';

case HDOM_TYPE_UNKNOWN: return '';

}

if (strcasecmp($this->tag, 'script')===0) return '';

if (strcasecmp($this->tag, 'style')===0) return '';

$ret = '';

foreach($this->nodes as $n)

$ret .= $n->text();

return $ret;

}

function xmltext() {

$ret = $this->innertext();

$ret = str_ireplace('

$ret = str_replace(']]>', '', $ret);

return $ret;

}

// build node's text with tag

function makeup() {

// text, comment, unknown

if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);

$ret = 'tag;

$i = -1;

foreach($this->attr as $key=>$val) {

++$i;

// skip removed attribute

if ($val===null || $val===false)

continue;

$ret .= $this->_[HDOM_INFO_SPACE][$i][0];

//no value attr: nowrap, checked selected...

if ($val===true)

$ret .= $key;

else {

switch($this->_[HDOM_INFO_QUOTE][$i]) {

case HDOM_QUOTE_DOUBLE: $quote = '"'; break;

case HDOM_QUOTE_SINGLE: $quote = '\''; break;

default: $quote = '';

}

$ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;

}

}

$ret = $this->dom->restore_noise($ret);

return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';

}

// find elements by css selector

function find($selector, $idx=null) {

$selectors = $this->parse_selector($selector);

if (($count=count($selectors))===0) return array();

$found_keys = array();

// find each selector

for ($c=0; $c

if (($levle=count($selectors[0]))===0) return array();

if (!isset($this->_[HDOM_INFO_BEGIN])) return array();

$head = array($this->_[HDOM_INFO_BEGIN]=>1);

// handle descendant selectors, no recursive!

for ($l=0; $l

$ret = array();

foreach($head as $k=>$v) {

$n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];

$n->seek($selectors[$c][$l], $ret);

}

$head = $ret;

}

foreach($head as $k=>$v) {

if (!isset($found_keys[$k]))

$found_keys[$k] = 1;

}

}

// sort keys

ksort($found_keys);

$found = array();

foreach($found_keys as $k=>$v)

$found[] = $this->dom->nodes[$k];

// return nth-element or array

if (is_null($idx)) return $found;

else if ($idx<0) $idx = count($found) + $idx;

return (isset($found[$idx])) ? $found[$idx] : null;

}

// seek for given conditions

protected function seek($selector, &$ret) {

list($tag, $key, $val, $exp, $no_key) = $selector;

// xpath index

if ($tag && $key && is_numeric($key)) {

$count = 0;

foreach ($this->children as $c) {

if ($tag==='*' || $tag===$c->tag) {

if (++$count==$key) {

$ret[$c->_[HDOM_INFO_BEGIN]] = 1;

return;

}

}

}

return;

}

$end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;

if ($end==0) {

$parent = $this->parent;

while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {

$end -= 1;

$parent = $parent->parent;

}

$end += $parent->_[HDOM_INFO_END];

}

for($i=$this->_[HDOM_INFO_BEGIN]+1; $i

$node = $this->dom->nodes[$i];

$pass = true;

if ($tag==='*' && !$key) {

if (in_array($node, $this->children, true))

$ret[$i] = 1;

continue;

}

// compare tag

if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}

// compare key

if ($pass && $key) {

if ($no_key) {

if (isset($node->attr[$key])) $pass=false;

}

else if (!isset($node->attr[$key])) $pass=false;

}

// compare value

if ($pass && $key && $val && $val!=='*') {

$check = $this->match($exp, $val, $node->attr[$key]);

// handle multiple class

if (!$check && strcasecmp($key, 'class')===0) {

foreach(explode(' ',$node->attr[$key]) as $k) {

$check = $this->match($exp, $val, $k);

if ($check) break;

}

}

if (!$check) $pass = false;

}

if ($pass) $ret[$i] = 1;

unset($node);

}

}

protected function match($exp, $pattern, $value) {

switch ($exp) {

case '=':

return ($value===$pattern);

case '!=':

return ($value!==$pattern);

case '^=':

return preg_match("/^".preg_quote($pattern,'/')."/", $value);

case '$=':

return preg_match("/".preg_quote($pattern,'/')."$/", $value);

case '*=':

if ($pattern[0]=='/')

return preg_match($pattern, $value);

return preg_match("/".$pattern."/i", $value);

}

return false;

}

protected function parse_selector($selector_string) {

// pattern of CSS selectors, modified from mootools

$pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";

preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);

$selectors = array();

$result = array();

//print_r($matches);

foreach ($matches as $m) {

$m[0] = trim($m[0]);

if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;

// for borwser grnreated xpath

if ($m[1]==='tbody') continue;

list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);

if(!empty($m[2])) {$key='id'; $val=$m[2];}

if(!empty($m[3])) {$key='class'; $val=$m[3];}

if(!empty($m[4])) {$key=$m[4];}

if(!empty($m[5])) {$exp=$m[5];}

if(!empty($m[6])) {$val=$m[6];}

// convert to lowercase

if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}

//elements that do NOT have the specified attribute

if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}

$result[] = array($tag, $key, $val, $exp, $no_key);

if (trim($m[7])===',') {

$selectors[] = $result;

$result = array();

}

}

if (count($result)>0)

$selectors[] = $result;

return $selectors;

}

function __get($name) {

if (isset($this->attr[$name])) return $this->attr[$name];

switch($name) {

case 'outertext': return $this->outertext();

case 'innertext': return $this->innertext();

case 'plaintext': return $this->text();

case 'xmltext': return $this->xmltext();

default: return array_key_exists($name, $this->attr);

}

}

function __set($name, $value) {

switch($name) {

case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;

case 'innertext':

if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;

return $this->_[HDOM_INFO_INNER] = $value;

}

if (!isset($this->attr[$name])) {

$this->_[HDOM_INFO_SPACE][] = array(' ', '', '');

$this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;

}

$this->attr[$name] = $value;

}

function __isset($name) {

switch($name) {

case 'outertext': return true;

case 'innertext': return true;

case 'plaintext': return true;

}

//no value attr: nowrap, checked selected...

return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);

}

function __unset($name) {

if (isset($this->attr[$name]))

unset($this->attr[$name]);

}

// camel naming conventions

function getAllAttributes() {return $this->attr;}

function getAttribute($name) {return $this->__get($name);}

function setAttribute($name, $value) {$this->__set($name, $value);}

function hasAttribute($name) {return $this->__isset($name);}

function removeAttribute($name) {$this->__set($name, null);}

function getElementById($id) {return $this->find("#$id", 0);}

function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}

function getElementByTagName($name) {return $this->find($name, 0);}

function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}

function parentNode() {return $this->parent();}

function childNodes($idx=-1) {return $this->children($idx);}

function firstChild() {return $this->first_child();}

function lastChild() {return $this->last_child();}

function nextSibling() {return $this->next_sibling();}

function previousSibling() {return $this->prev_sibling();}

}

// simple html dom parser

// -----------------------------------------------------------------------------

class simple_html_dom {

public $root = null;

public $nodes = array();

public $callback = null;

public $lowercase = false;

protected $pos;

protected $doc;

protected $char;

protected $size;

protected $cursor;

protected $parent;

protected $noise = array();

protected $token_blank = " \t\r\n";

protected $token_equal = ' =/>';

protected $token_slash = " />\r\n\t";

protected $token_attr = ' >';

// use isset instead of in_array, performance boost about 30%...

protected $self_closing_tags = array('img'=>1, 'br'=>1, 'input'=>1, 'meta'=>1, 'link'=>1, 'hr'=>1, 'base'=>1, 'embed'=>1, 'spacer'=>1);

protected $block_tags = array('root'=>1, 'body'=>1, 'form'=>1, 'div'=>1, 'span'=>1, 'table'=>1);

protected $optional_closing_tags = array(

'tr'=>array('tr'=>1, 'td'=>1, 'th'=>1),

'th'=>array('th'=>1),

'td'=>array('td'=>1),

'li'=>array('li'=>1),

'dt'=>array('dt'=>1, 'dd'=>1),

'dd'=>array('dd'=>1, 'dt'=>1),

'dl'=>array('dd'=>1, 'dt'=>1),

'p'=>array('p'=>1),

'nobr'=>array('nobr'=>1),

);

function __construct($str=null) {

if ($str) {

if (preg_match("/^http:\/\//i",$str) || is_file($str))

$this->load_file($str);

else

$this->load($str);

}

}

function __destruct() {

$this->clear();

}

// load html from string

function load($str, $lowercase=true) {

// prepare

$this->prepare($str, $lowercase);

// strip out comments

$this->remove_noise("''is");

// strip out cdata

$this->remove_noise("''is", true);

// strip out

$this->remove_noise("'<\s*style[^>]*[^/]>(.*?)<\s*/\s*style\s*>'is");

$this->remove_noise("'<\s*style\s*>(.*?)<\s*/\s*style\s*>'is");

// strip out

$this->remove_noise("'<\s*script[^>]*[^/]>(.*?)<\s*/\s*script\s*>'is");

$this->remove_noise("'<\s*script\s*>(.*?)<\s*/\s*script\s*>'is");

// strip out preformatted tags

$this->remove_noise("'<\s*(?:code)[^>]*>(.*?)<\s*/\s*(?:code)\s*>'is");

// strip out server side scripts

$this->remove_noise("'(<\?)(.*?)(\?>)'s", true);

// strip smarty scripts

$this->remove_noise("'(\{\w)(.*?)(\})'s", true);

// parsing

while ($this->parse());

// end

$this->root->_[HDOM_INFO_END] = $this->cursor;

}

// load html from file

function load_file() {

$args = func_get_args();

$this->load(call_user_func_array('file_get_contents', $args), true);

}

// set callback function

function set_callback($function_name) {

$this->callback = $function_name;

}

// remove callback function

function remove_callback() {

$this->callback = null;

}

// save dom as string

function save($filepath='') {

$ret = $this->root->innertext();

if ($filepath!=='') file_put_contents($filepath, $ret);

return $ret;

}

// find dom node by css selector

function find($selector, $idx=null) {

return $this->root->find($selector, $idx);

}

// clean up memory due to php5 circular references memory leak...

function clear() {

foreach($this->nodes as $n) {$n->clear(); $n = null;}

if (isset($this->parent)) {$this->parent->clear(); unset($this->parent);}

if (isset($this->root)) {$this->root->clear(); unset($this->root);}

unset($this->doc);

unset($this->noise);

}

function dump($show_attr=true) {

$this->root->dump($show_attr);

}

// prepare HTML data and init everything

protected function prepare($str, $lowercase=true) {

$this->clear();

$this->doc = $str;

$this->pos = 0;

$this->cursor = 1;

$this->noise = array();

$this->nodes = array();

$this->lowercase = $lowercase;

$this->root = new simple_html_dom_node($this);

$this->root->tag = 'root';

$this->root->_[HDOM_INFO_BEGIN] = -1;

$this->root->nodetype = HDOM_TYPE_ROOT;

$this->parent = $this->root;

// set the length of content

$this->size = strlen($str);

if ($this->size>0) $this->char = $this->doc[0];

}

// parse html content

protected function parse() {

if (($s = $this->copy_until_char('<'))==='')

return $this->read_tag();

// text

$node = new simple_html_dom_node($this);

++$this->cursor;

$node->_[HDOM_INFO_TEXT] = $s;

$this->link_nodes($node, false);

return true;

}

// read tag info

protected function read_tag() {

if ($this->char!=='<') {

$this->root->_[HDOM_INFO_END] = $this->cursor;

return false;

}

$begin_tag_pos = $this->pos;

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

// end tag

if ($this->char==='/') {

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

$this->skip($this->token_blank_t);

$tag = $this->copy_until_char('>');

// skip attributes in end tag

if (($pos = strpos($tag, ' '))!==false)

$tag = substr($tag, 0, $pos);

$parent_lower = strtolower($this->parent->tag);

$tag_lower = strtolower($tag);

if ($parent_lower!==$tag_lower) {

if (isset($this->optional_closing_tags[$parent_lower]) && isset($this->block_tags[$tag_lower])) {

$this->parent->_[HDOM_INFO_END] = 0;

$org_parent = $this->parent;

while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)

$this->parent = $this->parent->parent;

if (strtolower($this->parent->tag)!==$tag_lower) {

$this->parent = $org_parent; // restore origonal parent

if ($this->parent->parent) $this->parent = $this->parent->parent;

$this->parent->_[HDOM_INFO_END] = $this->cursor;

return $this->as_text_node($tag);

}

}

else if (($this->parent->parent) && isset($this->block_tags[$tag_lower])) {

$this->parent->_[HDOM_INFO_END] = 0;

$org_parent = $this->parent;

while (($this->parent->parent) && strtolower($this->parent->tag)!==$tag_lower)

$this->parent = $this->parent->parent;

if (strtolower($this->parent->tag)!==$tag_lower) {

$this->parent = $org_parent; // restore origonal parent

$this->parent->_[HDOM_INFO_END] = $this->cursor;

return $this->as_text_node($tag);

}

}

else if (($this->parent->parent) && strtolower($this->parent->parent->tag)===$tag_lower) {

$this->parent->_[HDOM_INFO_END] = 0;

$this->parent = $this->parent->parent;

}

else

return $this->as_text_node($tag);

}

$this->parent->_[HDOM_INFO_END] = $this->cursor;

if ($this->parent->parent) $this->parent = $this->parent->parent;

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return true;

}

$node = new simple_html_dom_node($this);

$node->_[HDOM_INFO_BEGIN] = $this->cursor;

++$this->cursor;

$tag = $this->copy_until($this->token_slash);

// doctype, cdata & comments...

if (isset($tag[0]) && $tag[0]==='!') {

$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until_char('>');

if (isset($tag[2]) && $tag[1]==='-' && $tag[2]==='-') {

$node->nodetype = HDOM_TYPE_COMMENT;

$node->tag = 'comment';

} else {

$node->nodetype = HDOM_TYPE_UNKNOWN;

$node->tag = 'unknown';

}

if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';

$this->link_nodes($node, true);

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return true;

}

// text

if ($pos=strpos($tag, '<')!==false) {

$tag = '<' . substr($tag, 0, -1);

$node->_[HDOM_INFO_TEXT] = $tag;

$this->link_nodes($node, false);

$this->char = $this->doc[--$this->pos]; // prev

return true;

}

if (!preg_match("/^[\w-:]+$/", $tag)) {

$node->_[HDOM_INFO_TEXT] = '<' . $tag . $this->copy_until('<>');

if ($this->char==='<') {

$this->link_nodes($node, false);

return true;

}

if ($this->char==='>') $node->_[HDOM_INFO_TEXT].='>';

$this->link_nodes($node, false);

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return true;

}

// begin tag

$node->nodetype = HDOM_TYPE_ELEMENT;

$tag_lower = strtolower($tag);

$node->tag = ($this->lowercase) ? $tag_lower : $tag;

// handle optional closing tags

if (isset($this->optional_closing_tags[$tag_lower]) ) {

while (isset($this->optional_closing_tags[$tag_lower][strtolower($this->parent->tag)])) {

$this->parent->_[HDOM_INFO_END] = 0;

$this->parent = $this->parent->parent;

}

$node->parent = $this->parent;

}

$guard = 0; // prevent infinity loop

$space = array($this->copy_skip($this->token_blank), '', '');

// attributes

do {

if ($this->char!==null && $space[0]==='') break;

$name = $this->copy_until($this->token_equal);

if($guard===$this->pos) {

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

continue;

}

$guard = $this->pos;

// handle endless '<'

if($this->pos>=$this->size-1 && $this->char!=='>') {

$node->nodetype = HDOM_TYPE_TEXT;

$node->_[HDOM_INFO_END] = 0;

$node->_[HDOM_INFO_TEXT] = '<'.$tag . $space[0] . $name;

$node->tag = 'text';

$this->link_nodes($node, false);

return true;

}

// handle mismatch '<'

if($this->doc[$this->pos-1]=='<') {

$node->nodetype = HDOM_TYPE_TEXT;

$node->tag = 'text';

$node->attr = array();

$node->_[HDOM_INFO_END] = 0;

$node->_[HDOM_INFO_TEXT] = substr($this->doc, $begin_tag_pos, $this->pos-$begin_tag_pos-1);

$this->pos -= 2;

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

$this->link_nodes($node, false);

return true;

}

if ($name!=='/' && $name!=='') {

$space[1] = $this->copy_skip($this->token_blank);

$name = $this->restore_noise($name);

if ($this->lowercase) $name = strtolower($name);

if ($this->char==='=') {

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

$this->parse_attr($node, $name, $space);

}

else {

//no value attr: nowrap, checked selected...

$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;

$node->attr[$name] = true;

if ($this->char!='>') $this->char = $this->doc[--$this->pos]; // prev

}

$node->_[HDOM_INFO_SPACE][] = $space;

$space = array($this->copy_skip($this->token_blank), '', '');

}

else

break;

} while($this->char!=='>' && $this->char!=='/');

$this->link_nodes($node, true);

$node->_[HDOM_INFO_ENDSPACE] = $space[0];

// check self closing

if ($this->copy_until_char_escape('>')==='/') {

$node->_[HDOM_INFO_ENDSPACE] .= '/';

$node->_[HDOM_INFO_END] = 0;

}

else {

// reset parent

if (!isset($this->self_closing_tags[strtolower($node->tag)])) $this->parent = $node;

}

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return true;

}

// parse attributes

protected function parse_attr($node, $name, &$space) {

$space[2] = $this->copy_skip($this->token_blank);

switch($this->char) {

case '"':

$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

$node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('"'));

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

break;

case '\'':

$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_SINGLE;

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

$node->attr[$name] = $this->restore_noise($this->copy_until_char_escape('\''));

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

break;

default:

$node->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_NO;

$node->attr[$name] = $this->restore_noise($this->copy_until($this->token_attr));

}

}

// link node's parent

protected function link_nodes(&$node, $is_child) {

$node->parent = $this->parent;

$this->parent->nodes[] = $node;

if ($is_child)

$this->parent->children[] = $node;

}

// as a text node

protected function as_text_node($tag) {

$node = new simple_html_dom_node($this);

++$this->cursor;

$node->_[HDOM_INFO_TEXT] = '' . $tag . '>';

$this->link_nodes($node, false);

$this->char = (++$this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return true;

}

protected function skip($chars) {

$this->pos += strspn($this->doc, $chars, $this->pos);

$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

}

protected function copy_skip($chars) {

$pos = $this->pos;

$len = strspn($this->doc, $chars, $pos);

$this->pos += $len;

$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

if ($len===0) return '';

return substr($this->doc, $pos, $len);

}

protected function copy_until($chars) {

$pos = $this->pos;

$len = strcspn($this->doc, $chars, $pos);

$this->pos += $len;

$this->char = ($this->pos<$this->size) ? $this->doc[$this->pos] : null; // next

return substr($this->doc, $pos, $len);

}

protected function copy_until_char($char) {

if ($this->char===null) return '';

if (($pos = strpos($this->doc, $char, $this->pos))===false) {

$ret = substr($this->doc, $this->pos, $this->size-$this->pos);

$this->char = null;

$this->pos = $this->size;

return $ret;

}

if ($pos===$this->pos) return '';

$pos_old = $this->pos;

$this->char = $this->doc[$pos];

$this->pos = $pos;

return substr($this->doc, $pos_old, $pos-$pos_old);

}

protected function copy_until_char_escape($char) {

if ($this->char===null) return '';

$start = $this->pos;

while(1) {

if (($pos = strpos($this->doc, $char, $start))===false) {

$ret = substr($this->doc, $this->pos, $this->size-$this->pos);

$this->char = null;

$this->pos = $this->size;

return $ret;

}

if ($pos===$this->pos) return '';

if ($this->doc[$pos-1]==='\\') {

$start = $pos+1;

continue;

}

$pos_old = $this->pos;

$this->char = $this->doc[$pos];

$this->pos = $pos;

return substr($this->doc, $pos_old, $pos-$pos_old);

}

}

// remove noise from html content

protected function remove_noise($pattern, $remove_tag=false) {

$count = preg_match_all($pattern, $this->doc, $matches, PREG_SET_ORDER|PREG_OFFSET_CAPTURE);

for ($i=$count-1; $i>-1; --$i) {

$key = '___noise___'.sprintf('% 3d', count($this->noise)+100);

$idx = ($remove_tag) ? 0 : 1;

$this->noise[$key] = $matches[$i][$idx][0];

$this->doc = substr_replace($this->doc, $key, $matches[$i][$idx][1], strlen($matches[$i][$idx][0]));

}

// reset the length of content

$this->size = strlen($this->doc);

if ($this->size>0) $this->char = $this->doc[0];

}

// restore noise to html content

function restore_noise($text) {

while(($pos=strpos($text, '___noise___'))!==false) {

$key = '___noise___'.$text[$pos+11].$text[$pos+12].$text[$pos+13];

if (isset($this->noise[$key]))

$text = substr($text, 0, $pos).$this->noise[$key].substr($text, $pos+14);

}

return $text;

}

function __toString() {

return $this->root->innertext();

}

function __get($name) {

switch($name) {

case 'outertext': return $this->root->innertext();

case 'innertext': return $this->root->innertext();

case 'plaintext': return $this->root->text();

}

}

// camel naming conventions

function childNodes($idx=-1) {return $this->root->childNodes($idx);}

function firstChild() {return $this->root->first_child();}

function lastChild() {return $this->root->last_child();}

function getElementById($id) {return $this->find("#$id", 0);}

function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}

function getElementByTagName($name) {return $this->find($name, 0);}

function getElementsByTagName($name, $idx=-1) {return $this->find($name, $idx);}

function loadFile() {$args = func_get_args();$this->load(call_user_func_array('file_get_contents', $args), true);}

}

?>

采集的时候需要设置超时时间

set_time_limit(0);

然后引入文件

require_once 'simple_html_dom.php';

require_once 'common.php';

$dom =new simple_html_dom();

$url = isset($_POST['jdurl']) ? $_POST['jdurl'] : '';

$html = str_get_html($url);//获取html

$dom->load_file($html);

$plist=$dom->find('div[id=plist] li');//获取所有的li

foreach ($plist as $key => $value) {

$goods_id_node=$value->find('div[class=gl-i-wrap j-sku-item]',0);

$goods_id= $goods_id_node->getAttribute('data-sku');//获取data-sku 就是商品id

$name_node=$value->find('div[class=p-name] em',0);//获取商品名称节点

$name=trim($name_node->plaintext);//获取商品名称

$href_node=$value->find('div[class=p-name] a',0);//获取路径节点

$href=$href_node->getAttribute('href');//获取路径

$data['market_price']=getPrice($goods_id);//获取价格

使用common中的获取价格函数

/**

* @method 获取商品价格

* @param $id 商品id

*/

function getPrice($id){

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,'http://p.3.cn/prices/mgets?skuIds=J_'.$id);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$data = curl_exec($ch);

curl_close($ch);

$data=json_decode($data,true);

return $data[0]['p'];

}

获取库存

$kuncunstr=getkucun("https://c0.3.cn/stocks?type=getstocks&skuIds=".$goods_id."&area=1_72_2799_0");

使用了获取库存函数

function getkucun($url){

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$data = curl_exec($ch);

curl_close($ch);

if (strpos($data, 'charset="utf8') === false) {

$data = mb_convert_encoding($data, "UTF-8", "gbk");

}

preg_match('/无货/', $data, $kucun);

if($kucun){

return 0;//无货

}else{

return 10;//有货 默认给个10个

}

}

大概就这么个意思。。。

补充个下载图片本地化的方法

/**

* 下载远程图片保存到本地

* @access public

* @since 1.0

* @return string

* @params string $url 远程图片地址

* @params string $filename 保存文件名

*/

function download($url,$head='thumb_')

{

$save_dir='../../images/spider/'.date('Ymd',time())."/";

$returnstr='images/spider/'.date('Ymd',time()).'/';

//创建保存目录

if(!file_exists($save_dir)&&!mkdir($save_dir,0777,true))

return array('file_name'=>'','save_path'=>'','error'=>5);

$ch = curl_init();

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 信任任何证书

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);

$file = curl_exec($ch);

curl_close($ch);

$filename =pathinfo($url, PATHINFO_BASENAME);

$filename=$head. $filename;

@$resource = fopen($save_dir . $filename, 'a');

if (!$resource){

return 0;

}

@fwrite($resource, $file);

@fclose($resource);

unset($file,$url);

return $returnstr.$filename;

}

获取商品详情的方法

/**

* 获取商品详情信息

* @param $url

* @return mixed

*/

function getdetail($url){

$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);

$data = curl_exec($ch);

curl_close($ch);

if(strpos($data,'charset="utf8') === false){

$data = mb_convert_encoding($data,"UTF-8","gbk");

}

$data=json_decode($data,true);

$returnstr=$data['content'];

$content=get_content_img($data['content']);

$content1=get_content_css_img($data['content']);

for ($i=0;$i

$preg = "/^http(s)?:\\/\\/.+/";

if(preg_match($preg,$content[$i])){

$url=download($content[$i],'content');

}else{

$url=download('http:'.$content[$i],'content');

}

$returnstr=str_replace($content[$i],'/'.$url, $returnstr);

}

for ($i=0;$i

$preg = "/^http(s)?:\\/\\/.+/";

if(preg_match($preg,$content[$i])){

$url=download($content1[$i],'content');

}else{

$url=download('http:'.$content1[$i],'content');

}

$returnstr.=''.$url.'';

}

$returnstr=str_replace('data-lazyload','src', $returnstr);

$returnstr=str_replace('\'','\"', $returnstr);

return $returnstr;

}

function get_content_css_img($str){

preg_match_all("/.*background[^;\"]+url\(([^\)]+)\).*/im", $str, $matches);

return $matches[1];

}

function get_content_img($str)

{

preg_match_all("/]*data-lazyload=[\"]([^\"]+)[\"][^<>]*>/im", $str, $matches); //这个规则也可以

return $matches[1];

}

自己练习使用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/442396.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

星模php格,extend/base/TencentSms.php · 纵之格/ShopXO - Gitee.com

// ----------------------------------------------------------------------// | ShopXO 国内领先企业级B2C免费开源电商系统// ----------------------------------------------------------------------// | Copyright (c) 2011~2019 http://shopxo.net All rights reserve…

matlab中云模型,云模型简介与个人理解matlab程序.doc

.........................专业资料分享随着不确定性研究的深入&#xff0c;越来越多的科学家相信&#xff0c;不确定性是这个世界的魅力所在&#xff0c;只有不确定性本身才是确定的。在众多的不确定性中&#xff0c; HYPERLINK "/view/606111.htm" \t "_blank…

php dns刷新,Windows DNS缓存自动刷新

Windows DNS缓存自动刷新admin • 2018 年 09 月 04 日DNS(域名服务器)DNS(Domain Name Server)是进行域名和与之相对应的ip地址转换的服务器。DNS中保存了一张域名和与之相应的ip地址的表&#xff0c;以解析消息的域名。DNS轮训在统一主机添加多条A记录&#xff0c;这就是DNS轮…

php日期相减函数,倒计时函数_计算两个时间相差值_PHP函数

**PHP倒计时函数、求两个日期时间之间相差的时间函数、计算时差函数_PHP函数笔记**php/*** 求两个日期时间之间相差的时间* (针对1970年1月1日之后&#xff0c;求之前可以采用泰勒公式)* param string $day1 2016-10-01 10:01:08* param string $day2 2020-10-01 10:01:08* ret…

jq上传file到php,jQuery文件上传

插件描述&#xff1a;这是一个文件上传的展示&#xff0c;看很多插件&#xff0c;并不满意就自己写了一个&#xff0c;可能兼容性不是很好&#xff0c;没有准确进行测试过&#xff0c;还请各位不吝赐教更新时间&#xff1a;2019/3/25 下午8:53:17更新说明&#xff1a;修复上传成…

oracle导出建表主键,oracle主键自动生成 配合hibernate的生成策略详解

hibernate配合oracle自动生成主键策略有两种方法&#xff1a;A)设置ID的增长策略是sequence&#xff0c;同时指定sequence的名字&#xff0c;最好每个表建一个sequence&#xff0c;此种做法就如同MS-SQL,MY-SQL中的自动增长一样&#xff0c;不需要创建触发器&#xff0c;具体的…

oracle找到表的位置,查看Oracle表中的指定记录在数据文件中的位置

查看Oracle表中的指定记录位置select rowid,user_id from sshr.xx_user where user_id3010586select rowid,dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_num…

oracle异常抛出,ORACLE 存储过程异常捕获并抛出

for tab_name in tables loopexecute immediate drop table ||tab_name; --此处可能会报错end loop;当前情况是&#xff0c;循环表&#xff0c;进行删除&#xff0c;如果出现表不存在&#xff0c;则会异常中断&#xff0c;导致整个存储过程挂掉&#xff0c;需求是要能跳过错误的…

oracle的主目录怎么删除,删除oracle数据库卸载

oracle 10g在win上卸载软件环境1 、Windows XPOracle 10g2、 Oracle安装路径为 d:\Oracle实现方法1 、开始—设置—控制面板—管理工具—服务停止所有 Oracle服务;Or acleUfiCQiisoXeorcl 名称 I细I好I启动类型I aat为ffetwork Frov-isi. 「, 巴SOrae le StrTice…

oracle数据库相关知识,Oracle数据库相关知识点复习

一.Oracle数据库中常用的数据类型varchar2(长度)可变长字符串char(长度)定长number()表示整数或者浮点数number(8) number(8,2)clog字符的大对象blog二进制的大对象二.数据库查询1)SELECT语句从表中提取查询数据.语法为SELECT [DISTINCT] {column1,column2,…} FROM tablename …

Linux中批量创建空白文件,在Linux中批量创建和修改文件或目录

1. 用一条命令直接创建[fredRoyalmile Auto_Ops]$ touch seq 10[fredRoyalmile Auto_Ops]$ ls1 10 2 3 4 5 6 7 8 9[fredRoyalmile Auto_Ops]$ touch linux-{A..G}[fredRoyalmile Auto_Ops]$ lslinux-A linux-B linux-C linux-D linux-E linux-F linux-G[fredRo…

linux查看cpu占用最多的进程,Linux下查看占用CPU资源最多的几个进程

BPM SharePoint解决方案分享一.需求分析 SharePoint作为微软推出的协同类平台产品,为客户提供了门户.内容.文档.流程.社区.搜索.BI等一系列的解决方案,然而其流程功能由于设计理念差异,不能完全满足客户的需求,主要原因 ...nodejs字符与字节之间的转换new Buffer("Hello W…

linux内核 sin头文件,Linux内核中中断request_irq详解--中断共享问题解决

。函数原型如下&#xff1a;2.4 内核int request_irq (unsignedintirq,void (*handler)(int,void*,structpt_regs*),unsignedlongfrags,constchar*device,void*dev_id);2.6 内核request_irq(unsignedintirq,irq_handler_thandler,unsignedlongflags,constchar*name,void*dev);参…

linux缓存文件用户权限错误,Laravel运行缓存权限问题

Laravel 开发中遇到权限问题 failed to open stream: Permission denied错误现象&#xff1a;messg:"file_put_contents(.../storage/framework/cache/data/03/8c/03xxxxxx):failed to open stream: Permission denied"status: 500经过搜索发现网络上大量的解决方案是…

linux误删表空间文件,UNDO表空间下的数据文件被误删除后的处理方法

UNDO表空间下的数据文件被误删除后的处理方法&#xff1a;操作前备份数据库&#xff0c;以避免更大的损失。思路&#xff1a;1、把误删除的数据文件offline2、正常打开数据库后创建新的UNDO表空间及数据文件3、修改相应参数指向新的UNDO表空间4、重新启动数据库验证5、删除旧的…

linux内核有ebpf吗,聊聊很重要的内核技术eBPF

在2018年的 Linux Plumber 大会上&#xff0c;eBPF成了亮点&#xff0c;有24个议题提到了 eBPF&#xff0c;可以预计eBPF会成为一大技术热点。eBPF(Extended Berkeley Packet Filter) 的核心是驻留在 kernel 的高效虚拟机。最初的目的是高效网络过滤框架&#xff0c;前身是 BPF…

linux 访问日志ip排序,Linux通过日志文件统计IP访问次数排序

假设我的日志文件内容如下&#xff1a;218.92.217.53 - - [22/Nov/2017:17:26:27 0800] "GET /images/rand HTTP/1.0" 200 1785 "https://www.baidu.com/index.shtml" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC…

Linux系统自动备份脚本,供参考的Linux系统中自动执行分段备份脚本

供参考的Linux系统中自动执行分段备份脚本发布时间:2014-04-21 15:49:00来源:红联作者:tioced以下脚本仅做学习参考&#xff0c;需加到/etc/crontab文件&#xff0c;每天执行一次的脚本自动执行分段备份/www/users下的网页文件夹。[code]#!/usr/bin/perl$all_day date;chdir &…

linux+last命令菜鸟,Linux基本命令。。。菜鸟保留

以下命令都是以root身份输入的1.从图形界面进入问文本界面&#xff1a;init 32.从文本界面进入图形界面&#xff1a;startx3.从普通用户进入root用户&#xff1a;su4.进入文件夹&#xff1a;cd /文件路径5.返回上一个文件夹&#xff1a;cd ..6.查看当前位置的文件以及文件夹&am…

嵌入式linux tftp rpm,嵌入式linux的tftp配置

tftp是用来下载远程文件的最简单网络协议&#xff0c;它其于UDP协议而实现。嵌入式linux的 tftp开发环境包括两个方面&#xff1a;一是linux服务器端的tftp-server支持&#xff0c;二是嵌入式目标系统的tftp-client支持。因为u- boot本身内置支持tftp-client&#xff0c;所以嵌…