{"id":286398,"date":"2017-05-16T11:15:03","date_gmt":"2017-05-16T07:15:03","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=286398"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2017-05-16T07:15:03","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=286398","title":{"rendered":"\u041f\u043e\u0434\u043d\u0438\u043c\u0430\u0435\u043c \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0446\u0435\u043d \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430"},"content":{"rendered":"<p>\u041b\u044e\u0431\u043e\u0439 \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0444\u0435\u0440\u0435 e-comerce \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432. \u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u043e\u0439. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u0438 \u0442\u0435\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u0434\u043d\u0430 \u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0435 \u0446\u0435\u043d\u044b \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430. \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0443\u0447\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u043e \u043f\u043e \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438.<br \/>   <a name=\"habracut\"><\/a><br \/>  <b>\u0421\u043f\u043e\u0441\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0446\u0435\u043d\u0430\u0445 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432:<\/b>  <\/p>\n<ol>\n<li>\u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0446\u0435\u043d \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u2014 <a href=\"https:\/\/pricelabs.yandex.ru\/dashboard\/\">pricelab<\/a>. \u041d\u043e \u0432 \u043d\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0442\u0435 \u0442\u043e\u0432\u0430\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0443\u0436\u0435 \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0442 \u0432 yandex market. \u0422\u043e\u0435\u0441\u0442\u044c, \u0432\u0430\u0448 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432 YandexMarket, \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u044e\u0449\u0438\u0439 \u0432\u0430\u0441 \u0442\u043e\u0432\u0430\u0440, \u0442\u0430\u043a\u0436\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0432\u044b\u0433\u0440\u0443\u0436\u0435\u043d, \u0438 \u0432\u044b \u0441\u0430\u043c\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u044b\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432\u0430\u0448 \u0442\u043e\u0432\u0430\u0440.<br \/>  \u041a\u0430\u043a\u0438\u0435 \u0436\u0435 \u043c\u0438\u043d\u0443\u0441\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u0437\u0430 \u0441\u043e\u0431\u043e\u0439 \u0432\u043b\u0435\u0447\u0435\u0442. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u044f \u0442\u043e, \u0447\u0442\u043e \u0432 YandexMarket \u0446\u0435\u043d\u0430 \u043a\u043b\u0438\u043a\u0430 \u0441\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e \u0446\u0435\u043d\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/SKU\">SKU<\/a> \u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0432 \u043d\u0435\u043c \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u0432\u0430\u0440\u044b \u0441 \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0446\u0435\u043d\u043e\u0439, \u0434\u0430 \u0438 \u0441\u0430\u043c\u0438\u043c \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0442\u043e\u0432\u0430\u0440 \u043d\u0435 \u0440\u0435\u043d\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e.<br \/>  \u0423 \u043d\u0430\u0441 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433\u0430 \u0446\u0435\u043d \u0441 pricelab, \u043d\u043e \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u043d\u0435 \u0432\u044b\u0433\u0440\u0443\u0436\u0430\u044e\u0442\u0441\u044f \u0432 pricelab.<\/li>\n<li>\u0414\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u0442\u044c\u0441\u044f \u0441 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u043e\u043c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430. \u042d\u0442\u043e \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0438 \u0447\u0435\u0441\u0442\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0440\u0430\u0437\u0443 \u043e\u0442\u043c\u0435\u0442\u0430\u0435\u0442\u0441\u044f<\/li>\n<li>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0430\u0439\u0442\u0430 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430. \u042d\u0442\u043e \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434 \u0438 \u043e\u043d \u0434\u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0430\u0440\u043e\u043c. \u041d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0438\u043c\u0435\u043d\u043d\u043e \u043e\u043d.<\/li>\n<\/ol>\n<p>  <b>\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b<\/b>  <\/p>\n<ol>\n<li>\u0411\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445<\/li>\n<li>\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430<\/li>\n<\/ol>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u0442\u043e\u0440\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u043b\u043e\u0436\u0438\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d \u0431\u044b\u043b 1C-Bitrix, \u0442\u043e \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0446\u0435\u043d \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 php. \u041d\u043e \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0434\u0445\u043e\u0434, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0438\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u043d\u0430 Node.js.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0442\u043e\u0432\u0430\u0440 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/IPhone_6\">iphone<\/a> \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0430\u0445 \u0438 \u0431\u0443\u0434\u0435\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0435\u0433\u043e \u0446\u0435\u043d\u044b.<\/p>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432:  <\/p>\n<pre><code class=\"sql\">CREATE TABLE panda.competitors (   id int(11) NOT NULL AUTO_INCREMENT,   name varchar(50) DEFAULT NULL,   PRIMARY KEY (id) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f URL \u0434\u043b\u044f \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0438 \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 HTML \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435.<br \/>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043f\u0438\u0441\u043a\u043e\u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432  <\/p>\n<pre><code class=\"sql\">CREATE TABLE panda.competitors_selector (   id int(11) NOT NULL AUTO_INCREMENT,   competitor_id int(11) DEFAULT NULL,   selector varchar(255) DEFAULT NULL,   use_status CHAR(20) DEFAULT 'unused',   PRIMARY KEY (id) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; <\/code><\/pre>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f url, \u0446\u0435\u043d\u044b \u0438 \u0442.\u0434.  <\/p>\n<pre><code class=\"sql\">CREATE TABLE panda.competitors_data (   id INT(11) NOT NULL AUTO_INCREMENT,   competitor_id INT(11) DEFAULT NULL,   sku INT(11) DEFAULT NULL,   competitor_url VARCHAR(255) DEFAULT NULL,   competitor_price INT(11) DEFAULT NULL,   competitor_response_ms INT(11) DEFAULT NULL,   competitor_price_status CHAR(20) DEFAULT 'created',   last_update_unixtime INT(11) DEFAULT NULL,   PRIMARY KEY (id) ) ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci; <\/code><\/pre>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b competitors:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/0e0\/b68\/940\/0e0b68940260bb6482ce06940037f0da.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b competitors_selector:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/e62\/a88\/0ac\/e62a880ac4b84a08b107d91ea92ec40d.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b competitors_selector:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/bbf\/4a1\/058\/bbf4a10589176733408d62c2ec20a57b.jpg\" alt=\"image\"\/><\/p>\n<p>  \u0414\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 competitors_selector \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/32e\/706\/f05\/32e706f0571a9c430b6c174cd00d84ff.jpg\" alt=\"image\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/816\/11a\/8b4\/81611a8b4c3edf0a3c3386ee5a0817a5.jpg\" alt=\"image\"\/><\/p>\n<p>  \u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0432\u0430\u0436\u0430\u044e\u0449\u0438\u0439 \u0441\u0435\u0431\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/www.w3.org\/TR\/microdata\/\">microdata<\/a> \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0430\u0440\u0441\u0435\u0440\u043e\u0432, \u043d\u0430 \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f. \u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0438\u0441\u044c \u0441 NODE.js, \u0442\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u043f\u0440\u0435\u043a\u0440\u0430\u0441\u043d\u044b\u043c \u043c\u043e\u0434\u0443\u043b\u0435\u043c <a href=\"https:\/\/www.npmjs.com\/package\/semantic-schema-parser\">semantic-schema-parser<\/a>. \u0421\u0430\u043c \u043c\u043e\u0434\u0443\u043b\u044c \u0443\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 149 \u0441\u0442\u0440\u043e\u043a, \u0438 \u043f\u043e\u0434 \u043a\u0430\u043f\u043e\u0442\u043e\u043c \u0443 \u043d\u0435\u0433\u043e, \u043e\u0442\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u0430\u0440\u0441\u0435\u0440 \u043a\u043e\u043d\u0435\u043d\u0442\u0430 <a href=\"https:\/\/www.npmjs.com\/package\/cheerio\">cheerio<\/a>. \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u043c\u043e\u0434\u0443\u043b\u044c, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 callback \u043e\u0431\u044a\u0435\u043a\u0442 $. <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/a93\/8df\/33d\/a938df33d805e6b935bc66c9b5443f25.jpg\" alt=\"image\"\/><br \/>  \u041d\u043e \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u0431\u044b\u0432\u0430\u0442\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b, \u0432\u0441\u0435 \u0435\u0449\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 <a href=\"https:\/\/www.w3.org\/TR\/microdata\/\">microdata<\/a>. \u0422\u0443\u0442 \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0432 \u0434\u0435\u043b\u043e \u0434\u0430\u043d\u043d\u044b\u0435 competitors_selector. \u0412 \u043e\u043f\u0446\u0438\u044f\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 5 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0432, user-agent \u043a\u0430\u043a yandex bot, \u0438 timeout 2 \u0441\u0435\u043a.<br \/>  \u0414\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 html \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 <a href=\"https:\/\/www.npmjs.com\/package\/needle\">needle<\/a>. \u0414\u043b\u044f \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u0438\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u043a \u0411\u0414, \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c <a href=\"https:\/\/www.npmjs.com\/package\/templayed\">templayed<\/a><br \/>  \u0417\u0430\u043f\u0440\u043e\u0441\u044b \u043a \u0411\u0414:<br \/>  resetSelectorsStatus.sql  <\/p>\n<pre><code class=\"sql\">UPDATE  \tcompetitors_selector  SET  \tuse_status = 'unuse'  WHERE 1; <\/code><\/pre>\n<p>  selectcSelectors.sql  <\/p>\n<pre><code class=\"sql\">SELECT *  FROM competitors_selector <\/code><\/pre>\n<p>  selectcURLs.sql  <\/p>\n<pre><code class=\"sql\">SELECT * FROM competitors_data <\/code><\/pre>\n<p>  updateCompetitorData.sql  <\/p>\n<pre><code class=\"sql\">UPDATE  competitors_data  SET  competitor_price = '{{price}}' ,competitor_response_ms =  {{response_ms}} ,last_update_unixtime = {{response_time}} ,competitor_price_status = '{{status}}' WHERE id = {{id}} <\/code><\/pre>\n<p>  \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:  <\/p>\n<ol>\n<li>\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c selector<\/li>\n<li>\u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u0438\u0437 DOM-\u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432.\n<pre><code class=\"javascript\">{\u043a\u043b\u044e\u0447:['selector1','selector2']}<\/code><\/pre>\n<\/li>\n<li>\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c HTML<\/li>\n<li>\u0410\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c microdata<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0432 microdata \u043d\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0442\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c selector&#8217;\u044b<\/li>\n<li>\u0415\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b, \u0442\u043e \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c null<\/li>\n<\/ol>\n<p>  \u041a\u043e\u0434 \u043a\u043b\u0430\u0441\u0441\u0430 Scraping \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043d\u0438\u0436\u0435. \u0412 \u043a\u043e\u0434\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c url. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0443\u043c\u043a\u0430 \u0431\u044b\u043b\u0430:  <\/p>\n<ol>\n<li>\u0410\u0433\u0440\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432 \u0438\u0437 competitors_data <\/li>\n<li>\u0412\u044b\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432<\/li>\n<li>\u041a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u043c \u0447\u0435\u0440\u0435\u0437 timeout<\/li>\n<\/ol>\n<p>  \u041d\u043e \u043f\u043e\u043a\u0430 \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f:  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"javascript\">  var needle = require('needle'); var mysql = require('mysql'); var templayed = require('templayed'); var fs = require('fs'); var schema = require(&quot;semantic-schema-parser&quot;);   var Scraping = new function(){ \t\/\/1. \u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0411\u0414 \t_this = this; \t_this.DB = mysql.createConnection({ \t\t  host     : 'localhost', \t\t  user     : '******************', \t\t  password : '******************', \t\t  database : 'panda' \t\t}); \t_this.querys  = {}; \t_this.selectors = {};\/\/dom \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b \u0434\u043b\u044f Scraping'a \t_this.rows = null;\/\/\u041c\u0430\u0441\u0441\u0438\u0432 \u0438\u0437 url \t_this.workers = 5;\/\/\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u044b\u0445 \u043e\u043f\u0440\u043e\u0441\u043e\u0432 \t_this.needleOptions = { \t\t\tfollow_max : 5    \/\/ \u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 5 \u0440\u0435\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0432 \t\t\t,headers:{'User-Agent': 'Mozilla\/5.0 (compatible; YandexBot\/3.0; +http:\/\/yandex.com\/bots) '} \t\t\t,open_timeout: 2000 \/\/ if we don't get our response headers in 5 seconds, boom. \t} \tthis.run = function(){ \t\t_this.DB.connect(); \t\t_this.queryLoad(); \t\t_this.resetSelectorsStatus(); \t} \t\/\/--------------------\/\/ \/\/\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 {\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f \u0431\u043b\u043e\u043a\u0438\u0440\u0443\u044e\u0449\u0430\u044f(\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f)} \tthis.queryLoad = function(){ \t\t_this.querys['selectcSelectors'] = fs.readFileSync('sql\/selectcSelectors.sql', 'utf8'); \t\t_this.querys['resetSelectorsStatus'] = fs.readFileSync('sql\/resetSelectorsStatus.sql', 'utf8'); \t\t_this.querys['selectcURLs'] = fs.readFileSync('sql\/selectcURLs.sql', 'utf8'); \t\t_this.querys['updateCompetitorData'] = fs.readFileSync('sql\/updateCompetitorData.sql', 'utf8'); \t\t \t\t \t}; \t\/\/--------------------\/\/ \/\/\u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \tthis.resetSelectorsStatus = function(callback){ \t\t_this.DB.query(  _this.querys['resetSelectorsStatus'], function(err, rows) { \t\t\t_this.selectcSelectors(); \t\t}); \t} \t\/\/--------------------\/\/ \/\/----\u041c\u0430\u0441\u0441\u0438\u0432 DOM \u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \tthis.selectcSelectors = function(callback){ \t\t_this.DB.query(  _this.querys['selectcSelectors'] , function(err, rows) { \t\t\t  if (!err){ \t\t\t\trows.forEach(function(item, i, arr) { \t\t\t\t\t if (!_this.selectors[item.competitor_id]){_this.selectors[item.competitor_id]=[];} \t\t\t\t\t _this.selectors[item.competitor_id].push({id:item.id,selector:item.selector}); \t\t\t\t}); \t\t\t\t_this.selectcURLs(); \t\t\t  } \t\t}); \t} \t\/\/--------------------\/\/ \tthis.selectcURLs = function(callback){ \t\t_this.DB.query(  _this.querys['selectcURLs'] , function(err, rows) { \t\t\t  if (!err){ \t\t\t\t  _this.rows = rows; \t\t\t\t  _this.workersTask();  \t\t\t  } \t\t}); \t} \t\/\/--------------------\/\/ \tthis.workersTask = function(){ \t\t__this = this; \t\t__this.worker = []; \t\tfor (var i = 0; i &lt; _this.workers; i++) { \t\t\t__this.worker[i] = { \t\t\t\t\tid:i \t\t\t\t\t,status: 'run' \t\t\t\t\t,allTask : function(){ \t\t\t\t\t\tvar status = {}; \t\t\t\t\t\tstatus['run'] = 0; \t\t\t\t\t\tstatus['iddle'] = 0; \t\t\t\t\t\t__this.worker.forEach(function(item){ \t\t\t\t\t\t\tif(item.status==='run'){status['run']++;} \t\t\t\t\t\t\telse{status['iddle']++;} \t\t\t\t\t\t}); \t\t\t\t\t\treturn status; \t\t\t\t\t} \t\t\t\t\t,timeStart : new Date().valueOf() \t\t\t\t\t,func: function(){ \t\t\t\t\t\t_this.parseData(__this.worker[this.id]) \t\t\t\t\t} \t\t\t} \t\t\t__this.worker[i].func(); \t\t} \t} \t\/\/--------------------\/\/ \tthis.parseData = function(worker){ \t\t__this = this; \t\tvar count = _this.rows.length; \t\tvar startTime = new Date().valueOf();   \t\tif(count &gt; 0 ){ \t\t\tvar row = _this.rows.shift();\/\/\u0443\u0434\u0430\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0438\u0437 rows \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0435\u0433\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \t\t\tvar URL  = row.competitor_url; \t\t\tneedle.get(URL, _this.needleOptions, function(err, res){ \t\t\t    if (err) {worker.func(); return;} \t\t\t     \t\t\t    var timeRequest = ( new Date().valueOf() ) - startTime; \t\t\t    schema.parseContent(res.body, function(schemaObject, $){ \t\t\t    \tprice = _this.parseBody(schemaObject,$,row); \t\t\t    \tstatus = ( price!='NULL' ) ? 'active' : 'error'; \t\t\t    \t \t\t\t    \t\/\/console.log(res.statusCode, 'timeout:'+timeRequest, 'price:'+price, worker.id, URL, row.id); \t\t\t    \t \t\t\t    \t_this.updateCompetitorData({ \t\t\t    \t\t\t\tid : row.id \t\t\t    \t\t\t\t,status:status \t\t\t    \t\t\t\t,response_time:( new Date().valueOf() ) \t\t\t    \t\t\t\t,response_ms:timeRequest \t\t\t    \t\t\t\t,competitor_price:price \t\t\t    \t\t\t}); \t\t\t    \t \t\t\t    \tworker.func(); \t\t\t    }); \t\t\t     \t\t\t}); \t    }else{ \t    \tworker.status = 'idle'; \t    \tif(worker.allTask().run===0){ \t    \t\tconsole.log('\u041c\u044b \u0432\u0441\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438, \u043c\u044b \u043c\u043e\u043b\u043e\u0434\u0446\u044b'); \t    \t\t_this.DB.end();\/\/\u0417\u0430\u043a\u0440\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0441 \u0431\u0434; \t    \t} \t    } \t} \t \t_this.parseBody = function(schemaObject,$,row){ \t\tvar price;     \tschemaObject.elems.forEach(function(elemsItem, i) {     \t\tif(!elemsItem.product)return;     \t\telemsItem.product.forEach(function(productItem, i) {     \t\t\tif(!productItem.price)return;     \t\t\tprice = ( productItem.price['content'] ) ? productItem.price['content'] :     \t\t\t\t  \t\t( productItem.price['text'] ) ? productItem.price['text'] :     \t\t\t\t  \t\tnull;\t     \t\t\tprice = price.replace(\/[^.\\d]+\/g,&quot;&quot;).replace( \/^([^\\.]*\\.)|\\.\/g, '$1' );     \t\t\tprice = Math.floor(price);\t     \t\t});     \t});     \tif( (!price) && (_this.selectors[row.competitor_id]) ){     \t\t_this.selectors[row.competitor_id].forEach(function(selector){     \t\t\tprice_text = $(selector.selector).text();     \t\t\tif (price_text){     \t\t\t\tprice = price_text.replace(\/[^.\\d]+\/g,&quot;&quot;).replace( \/^([^\\.]*\\.)|\\.\/g, '$1' );         \t\t\tprice = Math.floor(price);         \t\t\t         \t\t\t\/\/\u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0442\u0430\u0442\u0443\u0441 \u043e \u0442\u043e\u043c \u0447\u0442\u043e selector \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d         \t\t\t\/\/-------------------------------------------------\/\/     \t\t\t\treturn;     \t\t\t}     \t\t});     \t}        \tif(!price){price = 'NULL'};     \treturn price; \t} \t\/\/--------------------\/\/ \t_this.updateCompetitorData = function(data){ \t\tquery = templayed(  _this.querys['updateCompetitorData']  )(data); \t\t_this.DB.query( query , function(err, rows) {}); \t} \t\/\/--------------------\/\/ \t_this.run(); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u041f\u043e\u0434\u0432\u043e\u0434\u044f \u0438\u0442\u043e\u0433, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0447\u0442\u043e \u0441 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c microdata \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0432\u0430\u0440\u043e\u0432, \u0446\u0435\u043d\u044b \u0438 \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442\u0441\u044f. \u041d\u043e \u0435\u0441\u0442\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043b\u043e\u0436\u043a\u0430 \u0434\u0435\u0433\u0442\u044f:  <\/p>\n<ul>\n<li>\u041d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 microdata<\/li>\n<li>\u041d\u0435 \u0443 \u0432\u0441\u0435\u0445 microdata \u0432\u0430\u043b\u0438\u0434\u043d\u0430\u044f (\u044f\u0440\u043a\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 ozone)<\/li>\n<li>\u041d\u0435 \u0432\u0441\u0435 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432 microdata \u0434\u0430\u043d\u043d\u044b\u0435 \u043e \u0446\u0435\u043d\u0435, \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438, \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u0438<\/li>\n<li>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u0432 microdata \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0432\u043c\u0435\u0441\u0442\u043e content-&gt;text \u043b\u0438\u0431\u043e \u043d\u0430\u043e\u0431\u0440\u043e\u0442<\/li>\n<\/ul>\n<p>  \u0422\u0435 \u0436\u0435 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u044b \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 microdata, \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043d\u0435 id \u0430 class, \u0447\u0442\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u0432\u0435\u0440\u0441\u0442\u043a\u0438, \u043d\u043e \u0443\u0441\u043b\u043e\u0436\u043d\u044f\u0435\u0442 \u043f\u0430\u0440\u0441\u0438\u043d\u0433 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0435 \u0443 \u043d\u0430\u0441 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c 7 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0441 class=&#8217;price&#8217;, \u0430 \u0446\u0435\u043d\u0430 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 4,5,6,10). \u0422\u0430\u043a\u0436\u0435 \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0432 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0446\u0435\u043d\u0430 \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435: <\/p>\n<pre><code class=\"php\">&lt;div class=&quot;price price_break&quot;&gt;&lt;ins class=&quot;num&quot;&gt;2980&lt;\/ins&gt;&lt;ins class=&quot;rub&quot;&gt; \u0440\u0443\u0431.&lt;\/ins&gt;&lt;\/div&gt;<\/code><\/pre>\n<p>  \u0412 \u043b\u044e\u0431\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0441 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u0435\u043c microdata, \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0441\u0442\u0430\u043b \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0449\u0435.<br \/>  \u0421 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435, \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u044e \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f url \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u0430 \u0438 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0438 \u0432 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442 \u043c\u0430\u0433\u0430\u0437\u0438\u043d\u0435.<br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habrahabr.ru\/post\/328734\/\"> https:\/\/habrahabr.ru\/post\/328734\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u041b\u044e\u0431\u043e\u0439 \u043a\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0441\u0444\u0435\u0440\u0435 e-comerce \u0440\u0430\u043d\u043e \u0438\u043b\u0438 \u043f\u043e\u0437\u0434\u043d\u043e \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c\u044e \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0432\u044b\u043c \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u043d\u043a\u0443\u0440\u0435\u043d\u0442\u043e\u0432. \u041e\u0434\u0438\u043d \u0438\u0437 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0432\u043e\u043f\u0440\u043e\u0441\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0446\u0435\u043d\u043e\u0439. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u043c\u0430\u0440\u043a\u0435\u0442\u0438\u043d\u0433\u043e\u0432\u044b\u0445 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e \u0441\u0440\u0435\u0434\u0438 \u0442\u0435\u0445 \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u0442\u043e\u0432\u044b \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, \u043e\u0434\u043d\u0430 \u0442\u0440\u0435\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0438\u0437\u043a\u0438\u0435 \u0446\u0435\u043d\u044b \u043a\u0430\u043a \u0440\u0435\u0448\u0430\u044e\u0449\u0438\u0439 \u0444\u0430\u043a\u0442\u043e\u0440 \u0432\u044b\u0431\u043e\u0440\u0430 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430. \u041d\u0430 \u043f\u0440\u043e\u0441\u0442\u043e\u0440\u0430\u0445 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0443\u0447\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u043d\u043e \u043f\u043e \u0442\u0435\u043c \u0438\u043b\u0438 \u0438\u043d\u044b\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c \u043e\u043d\u0438 \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u043b\u0438.   <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-286398","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286398","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=286398"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/286398\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=286398"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=286398"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=286398"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}