рдкрд░рд┐рдЪрдп
рдХрднреА-рдХрднреА рдРрд╕реЗ рдХрд╛рд░реНрдп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдЖрдкрдХреЛ рдЧреНрд░рд╛рд╣рдХ рдХреА рдЬрд░реВрд░рддреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реЗрд╡рд╛ рдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реИрдкрд░ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ рд╕рдорд╛рди рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реЗрд╡рд╛ рдореЗрдВ рд╣рдореЗрд╢рд╛ рдпрд╣ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдпрд╛ рд╡рд┐рдЪрд╛рд░ рдпрд╣ рдЙрдарддрд╛ рд╣реИ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдкреГрд╖реНрда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ ред
рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо XenForo рдлреЛрд░рдо
рдбреЗрдореЛ рдФрд░ рдПрдХ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рд╡рд┐рд╖рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЬрд╣рд╛рдВ рд╕реЗ рд╣рдо рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВрдЧреЗ: рд╢реАрд░реНрд╖рдХ, рдирд┐рд░реНрдорд╛рдг рд╕рдордп рдФрд░ рд╡рд┐рд╖рдп рдкрд╛рда рд╕реНрд╡рдпрдВ, рдЬрдмрдХрд┐ рдПрдХ рдЕрдзрд┐рдХреГрдд рдлреЛрд░рдо рдЦрд╛рддреЗ рдореЗрдВ рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
Parser рдЦреБрдж Yii2 рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП?
- рдкреГрд╖реНрда рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП cURL рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдЪреВрдБрдХрд┐ Yii рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд▓реЙрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рд╕реНрд╡рдпрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛), рдХреЗрд╡рд▓ рдкрд╛рд░реНрд╕рд░ рдХреЗ рд╕реНрд╡рд╛рд╕реНрдереНрдп рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдРрд╕реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, Yii2 рдиреНрдпреВрдирддрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╣реИред
рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ
ParserXenforo рдШрдЯрдХ рдмрдирд╛рдПрдБред рдЪреВрдВрдХрд┐ рд╣рдореЗрдВ рдШрдЯрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛ред
<?php namespace app\components; use Yii; use \yii\base\Object; class ParserXenforo extends Object { }
рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЧреБрдг рдФрд░ рд╕реНрдерд┐рд░рд╛рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣реЛрд╕реНрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдкрд╛рд╕рд╡рд░реНрдб, рдХрд░реНрд▓рдСрдкреНрдЯ рдЧреБрдг рд╕реНрд╡рдпрдВ рдШрдЯрдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
<?php namespace app\components; use Yii; use \yii\base\Object; class ParserXenforo extends Object { const REQUEST_URI_LOGIN = 'login/login'; const COOKIES_FILE_NAME = 'cookies.txt'; private $_data; public $host; public $username; public $password; public $curlOpt; }
рдкреЗрдЬ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдЬреЛрдбрд╝реЗрдВред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рд╣реЗрдбрд░ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдХреЗ рд╕реЗрдЯ рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдХрд░реНрд▓рдУрдкреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ cURL рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
protected function getCurlOpt($nameOpt) { if ($nameOpt !== 'userAgent' && $nameOpt !== 'header') { return false; } return $this->curlOpt[$nameOpt]; }
рдлреЛрд░рдо рдкрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧрд┐рди рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ POST рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг url (рд╣реЛрд╕реНрдЯ + рдкреНрд░рд╛рдзрд┐рдХрд░рдг url) рдмрдирд╛рдПрдВ
protected function getLoginUrl() { return $this->host . self::REQUEST_URI_LOGIN; }
рдФрд░ рдЕрдиреБрд░реЛрдз рдХреА рдкреЛрд╕реНрдЯ рд▓рд╛рдЗрди
protected function createPostRequestForCurl() { return 'login=' . $this->username . '&password=' . $this->password . '&remember=1'; }
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдХреБрдХреА рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдкреВрд░реНрдг рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕рд╛ рддрд░реАрдХрд╛ рдмрдирд╛рдПрдВ рдЬреЛ рдЙрдкрдирд╛рдо рдкрде рд╕реЗ рдкреВрд░реНрдг рдкрде рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдирд╛рдо рдЬреЛрдбрд╝рддрд╛ рд╣реИред
protected function getPathToCookieFile($cookieFileName = self::COOKIES_FILE_NAME) { return Yii::getAlias('@app/runtime') . DIRECTORY_SEPARATOR . $cookieFileName; }
рд╣рдо рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрда рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХрд╛рд░реНрд░рд╡рд╛рдИ рдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рд╣рдо POST рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкрд╛рд░рд┐рдд url рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХреГрдд рдЦрд╛рддреЗ рдореЗрдВред рдмрд╕ рдорд╛рдорд▓реЗ рдореЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдХреНрд╕рд░ рджреЗрдЦрд╛ рдХрд┐ рдЗрд╕ рдордВрдЪ рдкрд░ рд╡реЗ рдЕрдирдзрд┐рдХреГрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЫрд┐рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореЙрдбреНрдпреВрд▓ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
_Data рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо Yii :: рдЬрд╛рдирдХрд╛рд░реА () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред
public function loadUsingCurl($url) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $this->loginUrl); curl_setopt($ch, CURLOPT_FAILONERROR, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_REFERER, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $this->getCurlOpt('header')); curl_setopt($ch, CURLOPT_COOKIEFILE, $this->pathToCookieFile); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->pathToCookieFile); curl_setopt($ch, CURLOPT_FRESH_CONNECT, 1); curl_setopt($ch, CURLOPT_USERAGENT, $this->getCurlOpt('userAgent')); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $this->createPostRequestForCurl()); $this->_data = curl_exec($ch); if (curl_exec($ch) === false) { throw new \Exception(curl_errno($ch) . ': ' . curl_error($ch)); } curl_close($ch); Yii::info(Yii::t('app', 'Loading data page')); return $this; }
рдШрдЯрдХ рдХрд╛ рдЖрдзрд╛рд░ рднрд╛рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрд╕реЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдореЗрдВ рдЖрдкрдХреЗ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдШрдЯрдХ рд╕реНрдерд┐рдд рд╣реИ, рдмреЗрд╕ рдпреВрдЖрд░рдПрд▓, рдФрд░ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдбреЗрдЯрд╛ред
рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рд▓рд┐рдП рдкреИрд░рд╛рдореАрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдореЗрдВ рджрд┐рдП рдЧрдП рдереЗ: рд╡реНрдпрд╡рд╕реНрдерд╛рдкрдХ рдбреЗрдореЛред рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдХреЗрд╡рд▓ рдХреБрдЫ рджрд┐рдиреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛, рдпрд╛ рдпреВрдБ рдХрд╣реЗрдВ, 24 рдорд╛рд░реНрдЪ 2014 рдХреЛ рд╕реБрдмрд╣ 7:26 рдмрдЬреЗ рддрдХ
.... 'components' => [ ... 'parser' => [ 'class' => 'app\components\ParserXenforo', 'host' => 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?', 'username' => 'admin', 'password' => 'admin', 'curlOpt' => [ 'userAgent' => 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36', 'header' => [ 'Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1', 'Accept-Language: en-US,en;q=0.8,ru;q=0.6,uk;q=0.4', 'Accept-Charset: Windows-1251, utf-8, *;q=0.1', 'Accept-Encoding: deflate, identity, *;q=0', ] ] ], ... ], ....
рдХрдВрдЯреНрд░реЛрд▓рд░ рдореЗрдВ, рд╣рдо рдПрдХреНрд╢рди рдореЗрдВ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдБрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд▓реЙрдЧреНрд╕ рдРрдк рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛ рдЧрдпрд╛ рдерд╛
$urlThread = 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?threads/some-thread.1/'; $dataParse = Yii::$app->parser->loadUsingCurl($urlThread);
рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕ рдХрд░рдирд╛
рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдХреЗ DOMDocument рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдкрддреНрддрд┐ рдЬреЛрдбрд╝реЗрдВред Libxml рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдФрд░ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд┐рдкрд░реАрдд рдХрд░реЗрдВред рдкреГрд╖реНрда рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдПред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдкреГрд╖реНрда рдХрд╛ DOM рдорд┐рд▓рддрд╛ рд╣реИред рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ DOM рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
public function createDomDocument() { $this->_dom = new \DOMDocument(); libxml_use_internal_errors(true); if ($this->_dom->loadHTML($this->_data)) { Yii::info(Yii::t('app', 'Create DomDocument')); } else { Yii::info(Yii::t('app', 'An error occurred when creating an object of class DOMDocument')); } libxml_use_internal_errors(false); return $this; }
рд╣рдо DOMXPath рд╡рд░реНрдЧ рдХреА рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XPath рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛред
public function createDomXpath() { $this->_xpath = new \DOMXPath($this->_dom); Yii::info(Yii::t('app', 'Create DomXpath')); return $this; }
рдЦреИрд░, рдЕрдм рдЖрдк рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛: рд╢реАрд░реНрд╖рдХ, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП XPath рдкреНрд░рд╢реНрдиреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд╣рд▓реЗ рд╣рдо рд╣реЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ _title рдЧреБрдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
public function parseTitle() { $xpathQuery = '*//h1'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse title')); } $this->_title = $nodes->item(0)->nodeValue; Yii::info(Yii::t('app', 'Parse title')); return $this; }
рдЖрдЧреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдп рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк
public function parseTimestamp() { $xpathQuery = '*//p[@id="pageDescription"]/a/abbr'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse timestamp')); return $this; }
рдЕрдВрддрд┐рдо рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
public function parseContent() { $xpathQuery = '*//blockquote[@class="messageText ugc baseHtml"]'; $nodes = $this->_xpath->query($xpathQuery, $this->_dom); if ($nodes->length === 0) { Yii::info(Yii::t('app', 'Error parse content')); return $this; } $this->_content = $nodes->item(0)->nodeValue; Yii::info(Yii::t('app', 'Parse content')); return $this; }
рдЪрд▓реЛ рдереЛрдбрд╝рд╛ рдкреАрдЫреЗ рдЪрд▓рддреЗ рд╣реИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ XPath рд╕реЗ рдХреНрдпрд╛ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдерд╛
- '* // h1' рд╣рдо DOM h1 рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред * = рдХрд╛ рдЕрд░реНрде рд╣реИ рдкреВрд░реЗ DOM рдореЗрдВ рд╕рд░реНрдЪ
- * // p [@ id = "рдкреЗрдЬрдбреЗрд╕рдХреНрд░рд┐рдкреНрд╢рди"] / a / abbr рд╣рдо рдкреАрд╕реА рдЖрдИрдбреА рдкреЗрдЬ рдбреАрд╕реНрдХреНрд░рд┐рдкреНрд╢рди рдПрд▓рд┐рдореЗрдВрдЯ рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдПрдмреНрд░реА рдПрд▓рд┐рдореЗрдВрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд▓рд┐рдВрдХ рд╣реЛред
- * // blockquote [@ class = "messageText ugc baseHtml"] рд╣рдо рд╡рд░реНрдЧ рд╕рдВрджреЗрд╢ рдХреЗ рд╕рд╛рде рдПрдХ рдЙрджреНрдзрд░рдг рдХреА рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдПрдВрдЧреЗ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреНрдпрд╛ рд╕рднреА рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ рд╣реИ), рд╕рд╛рде рд╣реА рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЗ
public function endParse() { if (isset($this->_content, $this->_timestamp, $this->_content)) { Yii::info(Yii::t('app', 'End parse')); } else { Yii::info(Yii::t('app', 'Some data were not received')); } return $this; } public function getTitle() { return $this->_title; } public function getTimestamp() { return $this->_timestamp; } public function getContent() { return $this->_content; }
рдЖрдЙрдЯрдкреБрдЯ рдкрд░рд┐рдгрд╛рдо
рдШрдЯрдХ рдХреЛ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рддреИрдпрд╛рд░ рд╣реИ, рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ
$urlThread = 'http://9af5766eb2759a49.demo-xenforo.com/130/index.php?threads/some-thread.1/'; $dataParse = Yii::$app->parser ->loadUsingCurl($urlThread) ->createDomDocument() ->createDomXpath() ->parseTitle() ->parseTimeStamp() ->parseContent() ->endParse(); return $this->render('index', ['data' => $dataParse]);
<?php $this->title = 'My Yii Application'; ?> <div class="site-index"> <h1><?= $data->title; ?></h1> <p>Created At: <?= date('Ymd H:i:s', $data->timestamp); ?></p> <p><?= $data->content; ?></p> </div>
рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕рдорд╛рди рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ XenForo рдордВрдЪ рд╡рд┐рд╖рдп рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Yii рдХреЗ рд▓рд┐рдП рдПрдХ рдШрдЯрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред
рд╕рд╛рджреГрд╢реНрдп рд╕реЗ, рдЖрдк рдЕрдиреНрдп рдбреЗрдЯрд╛ рдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рднреА рдлреЛрд░рдо рд╡рд┐рд╖рдп, рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ:
- рдпрджрд┐ рдХреЛрдИ рд╣реЛ рддреЛ рдкреЗрдЬ рдкреЗрдЬреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- рд╣рдо рд╡рд┐рд╖рдпреЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреГрд╖реНрдареЛрдВ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрддреЗ рд╣реИрдВ
- рд╣рдореЗрдВ рдЗрди рд▓рд┐рдВрдХреНрд╕ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдорд┐рд▓рддреА рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рдкрд╣рд▓реВ рдХреЛ рдирд╣реАрдВ рдЫреБрдЖ рдЧрдпрд╛ рдерд╛; рдпрд╣ рд▓реЗрдЦ рдкреГрд╖реНрда рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдо рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдХрд┐рди рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ рдерд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдХрд╛ рд▓рд┐рдВрдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рд╕рд╛рдзрди
Yii2 рдиреНрдпреВрдирддрдо рдХрд╛ рд╡рд┐рд╡рд░рдгYii2 рдкреНрд░рд▓реЗрдЦрдирд░реВрд╕реА рдореЗрдВ Xpath 1.0 рд╡рд┐рдирд┐рд░реНрджреЗрд╢рд╕реНрд░реЛрдд рдХреЛрдб рд░рд┐рдкреЛрдЬрд┐рдЯрд░реА