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 dns刷新,Windows DNS缓存自动刷新

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

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

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

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…

oom linux 导致ssh,Linux OOM

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;某个机器看到一条日志:Out of Memory: Kill process xxx (xxx) score 707 or sacrifice child并且syslog, ssh等进程都被kill掉了.简单了解了下OOM(Out of Memory)…

c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

深度优先搜索算法(Depth First Search)DFS是搜索算法的一种。它沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所有边都己被探寻过&#xff0c;搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还…

c语言 子进程,子Shell和子进程

Shell 中有很多方法产生子进程&#xff0c;比如以新进程的方式运行 Shell 脚本&#xff0c;使用组命令、管道、命令替换等&#xff0c;但是这些子进程是有区别的。子进程的概念是由父进程的概念引申而来的。在 Linux 系统中&#xff0c;系统运行的应用程序几乎都是从 init(pid为…

学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...

原标题&#xff1a;为什么不建议买游戏本&#xff1f;入手前须知&#xff0c;别只看中游戏作为一名游戏本用户&#xff0c;我自己在用的游戏本已经用了四五年的时间了&#xff0c;从最初的大学生到毕业工作2年时间&#xff0c;这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

Android ui 单元测试 覆盖率,Android单元测试—UI测试(Espresso)

前言我们先回顾一下&#xff0c;在上一篇博客中&#xff0c;主要分享了Android单元测试的逻辑测试部分。接下来&#xff0c;我们重点讲解Android单元测试的UI测试部分&#xff01;何为UI测试呢&#xff1f;就是对用户界面的交互元素进行测试&#xff0c;如TextView、ImageView&…

android shape 圆角百分比,Android shape显示圆角问题

当需要定义一个圆角效果,当在ADT中预览,没有有效果时,只要运行就可以了&#xff01;xmlns:Android"http://schemas.android.com/apk/res/android">android:state_pressed"true">android:startColor"#ff8c00"android:endColor"#FFFFFF…

android 删除垃圾文件夹,别再用手机管家清理垃圾了!删除这些文件夹,内存瞬间释放几个G...

随着手机使用时间的增加&#xff0c;手机中缓存的东西越来越多&#xff0c;这时候手机内存空间就会告急&#xff0c;从而影响手机的流畅性。那么在这种时候不要乱清理&#xff0c;我们只需要删除这几个文件夹&#xff0c;就可以帮手机轻松释放好几个G的内存。下面我们就一起来看…

计算机的应用技术课程的看法,统计教学与计算机应用的几点看法论文

统计教学与计算机应用的几点看法论文一、传统教学方法的局限性和弊端统计学是一门关于搜集、整理、汇总、描述和分析数据资料&#xff0c;并在此基础上进行推断和决策的方法论科学&#xff0c;具有很强的应用性、实践性。统计学课程是中等职业学校、财经类专业的基础核心课程。…

jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...

前面用了很久Notebook来交互式编程了&#xff0c;此次说说几个其余的选项&#xff1a;htmlNotebook Markdown此次选Markdown模式(关于Markdown基础能够看以前写的Markdown Base)python和代码同样&#xff0c;Shift回车就能够预览了&#xff0c;怎么样是否是很酷的感受&#xff…

计算机网络技术基础教学内容,计算机网络技术基础

无计算机网络技术基础》课程教案一 计算机网络技术基础》课题&#xff1a; 课题&#xff1a;计算机网络概述(一) ) 教学顺序&#xff1a; 教学顺序&#xff1a;1 教学时数&#xff1a; 教学时数&#xff1a; 2 学时 教学目的&#xff1a;了解计算机网络产生的背景&#xff0c;掌…

计算机表格收入水平怎么算,怎么用excel计算工资所得税

利用Excel表格计算工资所得税?单位工资发放大多采用计算机管理,对一些小企业没有采用工资软件的,一般用Excel表来计算工资。下面小编就教你怎么用excel计算工资所得税。excel计算工资所得税的步骤&#xff1a;1、假设工资的所得税起征点为3500&#xff0c;具体阶段如下表。2、…

同一网段计算机无法共享打印机,Win7同一个局域网内共享打印机不成功的修复方法...

打印机共享需要在同一个局域网内完成&#xff0c;这样打印机可以共享多台电脑。一位用户说自己的打印机和台式Win7系统电脑的连接已经成功&#xff0c;但就是没办法打印机文件&#xff0c;怎么回事呢&#xff1f;win7系统共享打印机的前提是需要关闭杀毒软件和win7系统的防火墙…

嵌入式计算机的特点和应用,以下描述中,()不是嵌入式操作系统的特点。A.面向应用,可以进行裁剪和移植B.用 - 信管网...

第4题&#xff1a;在分布式数据库中包括分片透明、复制透明、位置透明和逻辑透明等基本概念&#xff0c;其中&#xff1a;()是指局部数据模型透明&#xff0c;即用户或应用程序无需知道局部场地使用的是哪种数据模型。A&#xff0e;分片透明B&#xff0e;复制透明C&#xff0e;…

计算机二维全息图原理,三维信息加密如何使用计算全息进行

全息加密技术作为一种特殊的加密方法被广泛应用于信息加密和防伪等领域。在全息加密过程中&#xff0c;光波的波长、记录距离和入射角度等参数用做加密密钥和解密密钥被人们深入研究&#xff0c;但所加密的信息几乎都是二维信息。为此利用一种基于虚拟光学的对三维信息进行加密…

hashmap为什么是2的倍数_HashMap源码解析(jdk1.8)

HashMap在java中使用的频率很高&#xff0c;同时也是面试时的必问的问题。今天咱们就来学习下jHashMap的源码&#xff0c;版本为jdk1.8。学习之前&#xff0c;先一起了解下HashMap的数据结构&#xff0c;便于理解后面所讲的内容。HashMap的底层数据结构由图可见&#xff0c;Has…

消息队列_消息队列:kafka

概念kafka是一个分布式的基于发布/订阅模式的消息队列&#xff0c;主要用于大数据实时处理领域。要理解kafka首先要有分布式的概念&#xff0c;要有消息队列的概念。分布式系统最大的优势就是解耦和削峰&#xff0c;这种情况下&#xff0c;A系统生成了一个消息&#xff0c;B系统…