{"id":308537,"date":"2020-08-16T09:00:14","date_gmt":"2020-08-16T09:00:14","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=308537"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=308537","title":{"rendered":"pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438"},"content":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/515310\/\">\n<p>\u0414\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e pyOpenRPA. \u0412\u043e 2-\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 HTML\/JS. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0431\u043e\u0442\u0430. <\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0440\u043e\u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u0435\u043c, \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0442\u0435\u043c\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gt\/rq\/mo\/gtrqmo2cvzjaajye98dlpvxo-_u.png\" alt=\"pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438\"\/><\/p>\n<p>  <\/p>\n<h1 id=\"dlya-teh-kto-s-nami-vpervye\">\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0441 \u043d\u0430\u043c\u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\" rel=\"nofollow\">pyOpenRPA<\/a> \u2014 \u044d\u0442\u043e open source <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Robotic_process_automation\" rel=\"nofollow\">RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f <strong>\u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0442\u043e, \u0447\u0435\u043c \u0436\u0435 \u043e\u043d\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/506766\/\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"navigaciya-po-tutorialam-pyopenrpa\">\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u043c pyOpenRPA<\/h1>\n<p>  <\/p>\n<p>\u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0432\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f RPA. <\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u0432\u043e\u0438\u0432 \u044d\u0442\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0442\u0435\u0439-\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 (\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435):<\/strong> <\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/506766\/\">\u041e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 OpenSource (pyOpenRPA)<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/509644\/\">pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u043c\u0438 GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438<\/a><\/li>\n<li>&gt;&gt; <a href=\"https:\/\/habr.com\/ru\/post\/515310\/\">pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 Chrome, Firefox, Opera)<\/a><\/li>\n<li>pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439 &amp; \u043c\u044b\u0448\u044c\u044e<\/li>\n<li>pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h1 id=\"nemnogo-teorii-i-terminov\">\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u043e\u0440\u0438\u0438 \u0438 \u0442\u0435\u0440\u043c\u0438\u043d\u043e\u0432<\/h1>\n<p>  <\/p>\n<p>[\u0418\u0437 \u0432\u0438\u043a\u0438\u043f\u0435\u0434\u0438\u0438]<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u043a\u043b\u0438\u0435\u043d\u0442-\u0441\u0435\u0440\u0432\u0435\u0440\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043a\u043b\u0438\u0435\u043d\u0442 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u0435\u0442 \u0441 \u0432\u0435\u0431-\u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u041b\u043e\u0433\u0438\u043a\u0430 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043c\u0435\u0436\u0434\u0443 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u043e\u043c, \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f, \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043e\u0431\u043c\u0435\u043d \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e \u0441\u0435\u0442\u0438. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u0442 \u0444\u0430\u043a\u0442, \u0447\u0442\u043e \u043a\u043b\u0438\u0435\u043d\u0442\u044b \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043c\u0435\u0436\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0441\u043b\u0443\u0436\u0431\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0412\u0435\u0431 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0441\u0442\u0430\u043b\u0438 \u0448\u0438\u0440\u043e\u043a\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043a\u043e\u043d\u0446\u0435 1990-\u0445 \u2014 \u043d\u0430\u0447\u0430\u043b\u0435 2000-\u0445 \u0433\u043e\u0434\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%92%D0%B5%D0%B1-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5\" rel=\"nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a<\/a><\/p>\n<p>  <\/p>\n<p>\u041e\u043a, \u0441 \u0432\u044b\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0438\u0437 \u0432\u0438\u043a\u0438 \u0432\u0441\u0435 #\u041a\u0440\u0443\u0442\u043e\u0423\u043c\u043d\u043e, \u043d\u043e \u043e\u0442 \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043b\u0435\u0433\u0447\u0435 (\u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0432 \u044d\u0442\u043e\u0439 \u0442\u0435\u043c\u0435 \u0434\u0438\u043b\u0435\u0442\u0430\u043d\u0442). \u041f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u044e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &quot;\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u043c\u044b?&quot;\/&quot;\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u0440\u043e\u0431\u043e\u0442?&quot;. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u0441\u0430\u0439\u0442 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 WEB \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0438 \u043f\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c \u043f\u043e \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438 <\/p>\n<p>  <\/p>\n<h2 id=\"chto-vidim-my\">\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u043c \u043c\u044b?<\/h2>\n<p>  <\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043a\u0440\u0430\u0441\u0438\u0432\u043e \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043d\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u0441 \u0438\u043d\u0442\u0443\u0438\u0442\u0438\u0432\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043e \u043f\u0440\u043e\u0434\u0430\u0436\u0435\/\u0441\u0434\u0430\u0447\u0435 \u0432 \u0430\u0440\u0435\u043d\u0434\u0443 \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/af\/sf\/ku\/afsfkuhlchm-prpeh_-hzrachmw.png\" alt=\"\u041a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\"\/><\/p>\n<p>  <\/p>\n<h2 id=\"chto-vidit-robot\">\u0427\u0442\u043e \u0432\u0438\u0434\u0438\u0442 \u0440\u043e\u0431\u043e\u0442?<\/h2>\n<p>  <\/p>\n<p>\u0420\u043e\u0431\u043e\u0442 \u0432\u0438\u0434\u0438\u0442 \u043e\u0433\u0440\u043e\u043c\u043d\u0443\u044e \u0433\u0438\u043f\u0435\u0440\u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0443\u044e \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0443 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/HTML\" rel=\"nofollow\">HTML<\/a> \u0441 \u043f\u0440\u0438\u043c\u0435\u0441\u044c\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u043a\u043e\u0434\u0430 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/JavaScript\" rel=\"nofollow\">JS<\/a> \u0438 \u0437\u0430\u0432\u0435\u0440\u043d\u0443\u0442\u043e\u0433\u043e \u0432 \u043a\u0430\u0441\u043a\u0430\u0434\u043d\u0443\u044e \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u0442\u0438\u043b\u0435\u0439 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/CSS\" rel=\"nofollow\">CSS<\/a>. \u0423\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043f\u0440\u0430\u0432\u0434\u0430? \ud83d\ude42<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gz\/15\/hy\/gz15hycrdih3s9paxjsuocsnq6e.png\" alt=\"\u041a\u0430\u043a \u0440\u043e\u0431\u043e\u0442 \u0432\u0438\u0434\u0438\u0442 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\"\/><\/p>\n<p>  <\/p>\n<h2 id=\"interpretaciya\">\u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u044f<\/h2>\n<p>  <\/p>\n<p>WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u2014 \u044d\u0442\u043e <strong>\u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043b\u0435\u0433\u043a\u043e \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439<\/strong>. \u041e\u0431\u0438\u043b\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 + \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043b\u044e\u0431\u0443\u044e \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043a\u043e\u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0441 \u043d\u0438\u043c\u0438.<\/p>\n<p>  <\/p>\n<p>\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c WEB \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0440\u0430\u0437\u043d\u044b\u0445 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0439 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438: CSS, XPath, id, class, attribute. \u041c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441\u043e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435\u0439 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432. <\/p>\n<p>  <\/p>\n<h1 id=\"po-shagam-robot-svoimi-rukami\">(\u041f\u043e \u0448\u0430\u0433\u0430\u043c) \u0440\u043e\u0431\u043e\u0442 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438<\/h1>\n<p>  <\/p>\n<p>\u0412 \u044d\u0442\u043e\u043c \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c\u0441\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u043e\u0439 \u0440\u043e\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043f\u043e\u0440\u0442\u0430\u043b\u043e\u0432 \u043f\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f\u043c \u043f\u043e \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438 \u0432 \u0420\u0424 (\u0442\u0435\u043c\u0430 \u043e\u0434\u043d\u0430 \u0438\u0437 \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u0438\u0445).<\/p>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0441\u0435\u0431\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0437\u0430\u0434\u0430\u0447\u0443: <strong>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0440\u043e\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u043f\u043e \u0440\u0430\u043d\u0435\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u043c\u0443 \u0444\u0438\u043b\u044c\u0442\u0440\u0443<\/strong>. \u0412\u0441\u0435 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u0430\u043a \u0434\u0430\u0442\u0430\u0441\u0435\u0442 \u0432 \u0444\u0430\u0439\u043b .json \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u043e\u0439:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">{     &quot;SearchKeyStr&quot;: &quot;\u041c\u0421\u041a_\u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;, # \u041a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e \u043f\u043e\u0438\u0441\u043a\u0430     &quot;SearchTitleStr&quot;: &quot;\u041c\u043e\u0441\u043a\u0432\u0430, \u0440\u0430\u0439\u043e\u043d \u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;, # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u043f\u043e\u0438\u0441\u043a\u0430     &quot;SearchURLStr&quot;: &quot;https:\/\/www.cian.ru\/cat.php?deal_type=sale&amp;engine_version=2&amp;in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&amp;offer_type=flat&amp;polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&amp;room1=1&amp;room2=1&quot;, # URL of the CIAN search [str]     &quot;SearchDatetimeStr&quot;: &quot;2020-08-01 09:33:00.838081&quot;, # \u0414\u0430\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0431\u044b\u043b\u0430 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0432\u044b\u0433\u0440\u0443\u0437\u043a\u0430     &quot;SearchItems&quot;: { # \u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u043d\u044b\u0445 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439         &quot;https:\/\/www.cian.ru\/sale\/flat\/219924574\/:&quot;: { # URL \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u0446\u0435\u043d\u043e\u0432\u043e\u0435 \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435             &quot;TitleStr&quot;: &quot;3-\u043a\u043e\u043c\u043d. \u043a\u0432., 31,4 \u043c\u00b2, 5\/8 \u044d\u0442\u0430\u0436&quot;, # \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044f             &quot;PriceFloat&quot;: 10000000.0, # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f             &quot;PriceSqmFloat&quot;: 133333.0, # \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430 1 \u043a\u0432. \u043c.             &quot;SqMFloat&quot;: 31.4, # \u041a\u043e\u043b-\u0432\u043e \u043a\u0432. \u043c.             &quot;FloorCurrentInt&quot;: 5, # \u042d\u0442\u0430\u0436 \u043b\u043e\u0442\u0430 \u043f\u043e \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u044e             &quot;FloorTotalInt&quot;: 8, # \u042d\u0442\u0430\u0436\u0435\u0439 \u0432 \u0434\u043e\u043c\u0435 \u0432\u0441\u0435\u0433\u043e             &quot;RoomCountInt&quot;: 3 # \u041a\u043e\u043b-\u0432\u043e \u043a\u043e\u043c\u043d\u0430\u0442         }     }  }<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"shag-0-podgotovim-proekt-dlya-novogo-robota-razvernem-pyopenrpa\">\u0428\u0430\u0433 0. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u043e\u0431\u043e\u0442\u0430 (\u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0435\u043c pyOpenRPA)<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043f\u043e\u0434\u0430\u0432\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c, \u0432 pyOpenRPA \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0438\u0430\u043b\u044c\u043d\u043e \u0438\u043d\u043e\u0439 \u043f\u043e\u0434\u0445\u043e\u0434 \u043f\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044e \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0430 \u0438\u043c\u0435\u043d\u043d\u043e: \u0435\u0441\u043b\u0438 \u0432 \u043d\u0438\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0441\u0430\u043c\u0430 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u0442\u043e \u0432 pyOpenRPA \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442\u0435 \u0412\u044b \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0412\u044b. \u042d\u0442\u043e \u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u0438 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e \u044d\u0442\u043e\u0439 RPA \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u0445 (\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c pyOpenRPA \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 Python). <\/p>\n<p>  <\/p>\n<p><strong>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 <a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\" rel=\"nofollow\">pyOpenRPA<\/a>:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 1, \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0443\u044e \u043f\u043e\u0440\u0442\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0441 <a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\" rel=\"nofollow\">GitLab \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/a><\/li>\n<li>\u0412\u0430\u0440\u0438\u0430\u043d\u0442 2, \u0441\u043b\u043e\u0436\u043d\u044b\u0439. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c pyOpenRPA \u0432 \u0441\u0432\u043e\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 Python 3 (pip install pyOpenRPA)<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u042f \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c (\u0432\u0430\u0440\u0438\u0430\u043d\u0442 1). \u041f\u0440\u0435\u0434\u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u0438\u0445-\u043b\u0438\u0431\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u0417\u0434\u0435\u0441\u044c \u0432 \u043b\u0443\u0447\u0448\u0438\u0445 \u0442\u0440\u0430\u0434\u0438\u0446\u0438\u044f\u0445 pyOpenRPA \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043f\u0440\u0438\u043d\u0446\u0438\u043f, \u043a\u043e\u0433\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0438 \u0443 \u043d\u0435\u0433\u043e \u0443\u0436\u0435 \u0432\u0441\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u2014 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0440\u043e\u0431\u043e\u0442\u0430. #Enjoy \ud83d\ude42<\/p>\n<p>  <\/p>\n<h2 id=\"shag-1-sozdat-proekt-robota\">\u0428\u0430\u0433 1. \u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0431\u043e\u0442\u0430<\/h2>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0431\u043e\u0442\u0430, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0430\u043f\u043a\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0443 \u0442\u0435\u043c\u0443 \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u0430\u043f\u043e\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043f\u0440\u043e\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u0440\u043e\u0431\u043e\u0442\u043e\u0432. \u041d\u043e \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0435 \u0431\u0443\u0434\u0443 \u0437\u0430\u043e\u0441\u0442\u0440\u044f\u0442\u044c \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0446\u0435\u043d\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u2014 \u043d\u0430 \u043b\u043e\u0433\u0438\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 WEB \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u0442 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>Selenium WebDriver<\/li>\n<li>Google Chrome \u0438\u043b\u0438 Mozilla Firefox \u0438\u043b\u0438 Internet Explorer<\/li>\n<li>Python 3<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u0448\u043b\u0438 \u043f\u043e \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0443 1 (\u0441\u043c. \u0448\u0430\u0433 0), \u0442\u043e \u0443 \u0412\u0430\u0441 \u0432\u0441\u0435 \u044d\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u0443\u0436\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u0442\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f pyOpenRPA (#\u0423\u0434\u043e\u0431\u043d\u043e). \u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 pyOpenRPA \u0443\u0436\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 portable \u0432\u0435\u0440\u0441\u0438\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c (Google Chrome, Mozilla Firefox, Python3 32|64 \u0438 \u0442.\u0434.). <\/p>\n<p>  <\/p>\n<p>\u0412\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0437\u0430\u043c\u0435\u0442\u0438\u043b\u0438, \u0447\u0442\u043e \u0432 pyOpenRPA \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/habr.com\/ru\/post\/152653\/\">Selenium<\/a>. \u042d\u0442\u043e\u0442 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0434\u043d\u0438\u043c \u0438\u0437 \u043b\u0443\u0447\u0448\u0438\u0445 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043f\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044e \u0432 WEB. \u0418\u043c\u0435\u043d\u043d\u043e \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0435\u0433\u043e \u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 pyOpenRPA.<\/p>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\u0420\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 pyOpenRPA &gt; Wiki &gt; RUS_Tutorial &gt; WebGUI_Habr:<br \/> \n<ul>\n<li>\u0424\u0430\u0439\u043b &quot;3. MonitoringCIAN_Run_64.py&quot; \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u0440\u043e\u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u0442 WEB \u043f\u043b\u043e\u0449\u0430\u0434\u043a\u0443<\/li>\n<li>\u0424\u0430\u0439\u043b &quot;3. MonitoringCIAN_Run_64.cmd&quot; \u2014 \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u043e\u0431\u043e\u0442\u0430 \u0441 1-\u0433\u043e \u043a\u043b\u0438\u043a\u0430 \u043f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 .exe \u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0443 \u043f\u0440\u0438\u043c\u0435\u0440 &quot;3. MonitoringCIAN_Run_64.cmd&quot; \u0444\u0430\u0439\u043b\u0430:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">cd %~dp0..\\..\\..\\Sources ..\\Resources\\WPy64-3720\\python-3.7.2.amd64\\python.exe &quot;..\\Wiki\\RUS_Tutorial\\WebGUI_Habr\\3. MonitoringCIAN_Run_64.py&quot; pause &gt;nul<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u043b\u044f \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Selenium WebDriver \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0435\u0439:<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">########################## # Init the Chrome web driver ########################### def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):     # Set full path to exe of the chrome     lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()     lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath     # Add extensions     for lExtensionItemFullPath in inExtensionFullPathList:         lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)     # Run chrome instance     lWebDriverInstance = None     if inWebDriverFullPath:         # Run with specified web driver path         lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)     else:         lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)     # Return the result     return lWebDriverInstance<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"shag-2-zapustit-web-instrumenty-razrabotchika-i-sformirovat-css-selektory\">\u0428\u0430\u0433 2. \u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c WEB \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u0438 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u0442\u044c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b<\/h2>\n<p>  <\/p>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 WEB \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437 Google Chrome, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 pyOpenRPA (\u0432\u0430\u0440\u0438\u0430\u043d\u0442 1 \u0438\u0437 \u0448\u0430\u0433\u0430 0).<\/p>\n<p>  <\/p>\n<p><strong>\u041e\u0442\u043a\u0440\u043e\u0435\u043c Google Chrome \u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430<\/strong> (pyOpenRPA repo\\Resources\\GoogleChromePortable\\App\\Chrome-bin\\chrome.exe, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e Ctrl + Shift + i)<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/2p\/nq\/pc\/2pnqpcdew_gkdrsvc2rhya1wc8k.png\" alt=\"Portable Google Chrome + Dev Tools\"\/><\/p>\n<p>  <\/p>\n<p><strong>\u041e\u0442\u043a\u0440\u043e\u0435\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0441\u0430\u0439\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0421\u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u043f\u043e\u0438\u0441\u043a\u0430 \u0438 \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u043e\u0432\u044b\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u043f\u0438\u0441\u043a\u0430.<\/strong><\/p>\n<p>  <\/p>\n<p><a href=\"https:\/\/www.cian.ru\/cat.php?deal_type=sale&amp;engine_version=2&amp;in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&amp;offer_type=flat&amp;polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&amp;room1=1&amp;room2=1\" rel=\"nofollow\">\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u0437\u0430\u043f\u0440\u043e\u0441\u0430<\/a><\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/qc\/sp\/po\/qcspporaxqux_kcimoncngnjtcg.png\" alt=\"\u0421\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043f\u043e \u0444\u0438\u043b\u044c\u0442\u0440\u0443\"\/><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u0442\u044c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 Google Chrome. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0443\u0437\u043d\u0430\u0442\u044c \u043f\u0440\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u043e\u0432 \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/learn.javascript.ru\/css-selectors\" rel=\"nofollow\">\u0437\u0434\u0435\u0441\u044c \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/a><br \/>  \u0414\u043b\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u044f \u0431\u0443\u0434\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0432 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430 \u043d\u0430 \u0432\u043a\u043b\u0430\u0434\u043a\u0435 &quot;Console&quot;. \u041d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u0438 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0441\u043f\u0438\u0441\u043a\u0430 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/o-\/zy\/x9\/o-zyx9fqur5fq6mu1xedb7srskg.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430\"\/><\/p>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0434\u0431\u0435\u0440\u0435\u043c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0441\u043f\u0438\u0441\u043a\u0430 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435.<\/strong><\/p>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u0430 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0439 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u044b \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0435 \u0431\u0430\u043d\u043d\u0435\u0440\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0446\u0435\u043d\u043e\u0432\u043e\u043c \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0438. <\/p>\n<p>  <\/p>\n<p>\u0418 \u0442\u0430\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432 \u0440\u0435\u043a\u043b\u0430\u043c\u043d\u044b\u0445 \u0431\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0431\u044b\u043b\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432:<\/p>\n<p>  <\/p>\n<ul>\n<li>div[data-name=&quot;BannerServicePlaceInternal&quot;] <\/li>\n<li>div[data-name=&quot;getBannerMarkup&quot;]<\/li>\n<li>div[data-name=&quot;AdFoxBannerTracker&quot;]<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u043d \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0432\u044b\u0431\u043e\u0440\u043a\u0438 \u0442\u0430\u043a\u0438\u0435 \u0432\u0438\u0434\u044b \u0431\u0430\u043d\u043d\u0435\u0440\u043e\u0432. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u0433\u043e\u0442\u043e\u0432\u044b\u0439 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440.<\/p>\n<p>  <\/p>\n<ul>\n<li>CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, \u0421\u043f\u0438\u0441\u043e\u043a \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439: div[data-name=&quot;Offers&quot;] &gt; div:not([data-name=&quot;BannerServicePlaceInternal&quot;]):not([data-name=&quot;getBannerMarkup&quot;]):not([data-name=&quot;AdFoxBannerTracker&quot;])<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0434\u0431\u0435\u0440\u0435\u043c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b \u043f\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f, URL \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443.<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a: div[data-name=&quot;TopTitle&quot;],div[data-name=&quot;Title&quot;]<\/li>\n<li>CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f: div[data-name=&quot;Price&quot;] &gt; div[class<em>=&quot;header&quot;],div[data-name=&quot;TopPrice&quot;] &gt; div[class<\/em>=&quot;header&quot;]<\/li>\n<li>CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, URL \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443: a[class*=&quot;&#8212;header&#8212;&quot;]<\/li>\n<\/ul>\n<p>  <\/p>\n<p><strong>\u041f\u043e\u0434\u0431\u0435\u0440\u0435\u043c CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0434\u043b\u044f \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440, \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443: div[data-name=&quot;Pagination&quot;] li[class*=&quot;active&quot;] + li a<\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"shag-3-obrabotatpreobrazovat-poluchaemye-dannye\">\u0428\u0430\u0433 3. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c\/\u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/h2>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0448\u0430\u0433\u0435 \u043c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u043e\u0431\u0440\u0430\u043b\u0438 \u0432\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440\u044b. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0433\u0440\u0430\u043c\u043e\u0442\u043d\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0430 \u043f\u043e\u0442\u043e\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0435.<\/p>\n<p>  <\/p>\n<p>\u0412 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0432\u0438\u0434\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lOfferItemInfo = { # Item URL with https     &quot;TitleStr&quot;: &quot;3-\u043a\u043e\u043c\u043d. \u043a\u0432., 31,4 \u043c\u00b2, 5\/8 \u044d\u0442\u0430\u0436&quot;, # Offer title [str]     &quot;PriceFloat&quot;: 10000000.0, # Price [float]     &quot;PriceSqmFloat&quot;: 133333.0, # CALCULATED Price per square meters [float]     &quot;SqMFloat&quot;: 31.4, # Square meters in flat [float]     &quot;FloorCurrentInt&quot;: 5, # Current floor [int]     &quot;FloorTotalInt&quot;: 8, # Current floor [int]     &quot;RoomCountInt&quot;: 3  # Room couint [int] }<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lOfferListCSSStr = 'div[data-name=&quot;Offers&quot;] &gt; div:not([data-name=&quot;BannerServicePlaceInternal&quot;]):not([data-name=&quot;getBannerMarkup&quot;]):not([data-name=&quot;AdFoxBannerTracker&quot;])' lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0414\u0430\u043b\u0435\u0435 \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0446\u0435\u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">for lOfferItem in lOfferList:<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u0437 WEB \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b: \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a, \u0421\u0442\u043e\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u044f, URL \u043d\u0430 \u043a\u0430\u0440\u0442\u043e\u0447\u043a\u0443.<\/strong><\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name=&quot;TopTitle&quot;],div[data-name=&quot;Title&quot;]').text # Extract title text lPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name=&quot;Price&quot;]  &gt; div[class*=&quot;header&quot;],div[data-name=&quot;TopPrice&quot;] &gt; div[class*=&quot;header&quot;]').text # Extract total price lURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*=&quot;--header--&quot;]').get_attribute(&quot;href&quot;) # Extract offer URL lOfferItemInfo[&quot;TitleStr&quot;] = lTitleStr # set the title lPriceStr = lPriceStr.replace(&quot; &quot;,&quot;&quot;).replace(&quot;\u20bd&quot;,&quot;&quot;) # Remove some extra symbols lOfferItemInfo[&quot;PriceFloat&quot;] = round(float(lPriceStr),2) # Convert price to the float type<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043c \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0435\u043c.<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <strong>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f<\/strong> \u0441\u043b\u043e\u0432\u043e &quot;\u0410\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u044b&quot;<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lREResult = re.search(r&quot;.*, (\\d*,?\\d*) \u043c\u00b2, (\\d*)\/(\\d*) \u044d\u0442\u0430.&quot;, lTitleStr)  # run the re lOfferItemInfo[&quot;RoomCountInt&quot;] = 1 # Room count lSqmStr = lREResult.group(1) lSqmStr= lSqmStr.replace(&quot;,&quot;,&quot;.&quot;) lOfferItemInfo[&quot;SqMFloat&quot;] = round(float(lSqmStr),2) # sqm count lOfferItemInfo[&quot;FloorCurrentInt&quot;] = int(lREResult.group(2)) # Floor current lOfferItemInfo[&quot;FloorTotalInt&quot;] = int(lREResult.group(3)) # Floor total lOfferItemInfo[&quot;PriceSqmFloat&quot;] = round(lOfferItemInfo[&quot;PriceFloat&quot;] \/ lOfferItemInfo[&quot;SqMFloat&quot;],2) # Sqm per M<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435 <strong>\u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f<\/strong> \u0441\u043b\u043e\u0432\u043e &quot;\u0410\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u044b&quot;<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lREResult = re.search(r&quot;.*(\\d)-\u043a\u043e\u043c\u043d. .*, (\\d*,?\\d*) \u043c\u00b2, (\\d*)\/(\\d*) \u044d\u0442\u0430.&quot;, lTitleStr) # run the re lOfferItemInfo[&quot;RoomCountInt&quot;] = int(lREResult.group(1)) # Room count lSqmStr = lREResult.group(2) lSqmStr= lSqmStr.replace(&quot;,&quot;,&quot;.&quot;) lOfferItemInfo[&quot;SqMFloat&quot;] = round(float(lSqmStr),2) # sqm count lOfferItemInfo[&quot;FloorCurrentInt&quot;] = int(lREResult.group(3)) # Floor current lOfferItemInfo[&quot;FloorTotalInt&quot;] = int(lREResult.group(4)) # Floor total lOfferItemInfo[&quot;PriceSqmFloat&quot;] = round(lOfferItemInfo[&quot;PriceFloat&quot;] \/ lOfferItemInfo[&quot;SqMFloat&quot;],2) # Sqm per M<\/code><\/pre>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432\u044b\u0448\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043c\u0430\u0433\u0438\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D1%8B%D0%B5_%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F\" rel=\"nofollow\">\u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439<\/a><\/p>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043f\u043e\u0434\u0431\u043e\u0440\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0445 \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u044f \u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0441\u044c <a href=\"https:\/\/www.google.com\/search?q=online+regex&amp;oq=online+reg&amp;aqs=chrome.0.0l2j69i57j0l5.5699j0j7&amp;sourceid=chrome&amp;ie=UTF-8\" rel=\"nofollow\">online \u0432\u0430\u043b\u0438\u0434\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0442\u0438\u043f\u0430 \u0442\u0430\u043a\u0438\u0445<\/a><\/p>\n<p>  <\/p>\n<p><strong>\u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0438 (\u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438\u043c\u0435\u0435\u0442\u0441\u044f) \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u043f\u0435\u0440\u0435\u0445\u043e\u0434 \u043d\u0430 \u043d\u0435\u0435.<\/strong><\/p>\n<p>  <\/p>\n<p>\u0412\u044b\u0448\u0435 (\u043d\u0430 \u0448\u0430\u0433\u0435 2) \u043c\u044b \u0443\u0436\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u043b\u0438 CSS \u0441\u0435\u043b\u0435\u043a\u0442\u043e\u0440 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443. \u041d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043a\u043b\u0438\u043a\u0430 .click() \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0443.<br \/>  \u041d\u043e \u043f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f .click \u043e\u0442 Selenium \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b (\u043d\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435). \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c JavaScript \u043d\u0430 \u0441\u0430\u043c\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u0447\u0435\u0440\u0435\u0437 Selenium. \u0410 \u0443\u0436\u0435 \u0438\u0437 JavaScript \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043f\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043e\u0442\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443: <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">inWebDriver.execute_script(&quot;&quot;&quot;document.querySelector('div[data-name=&quot;Pagination&quot;] li[class*=&quot;active&quot;] + li a').click()&quot;&quot;&quot;)<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0431\u044b\u043b \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d \u0441\u0438\u0433\u043d\u0430\u043b \u043d\u0430 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f \u0435\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u0422\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u044f\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u043e\u0432\u044b\u0445 \u0446\u0435\u043d\u043e\u0432\u044b\u0445 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># wait while preloader is active lDoWaitBool = True while lDoWaitBool:     lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*=&quot;--preloadOverlay--&quot;]') # So hard to catch the element :)     if len(lPreloaderCSS)&gt;0: time.sleep(0.5) # preloader is here - wait     else: lDoWaitBool = False # Stop wait if preloader is dissappear<\/code><\/pre>\n<p>  <\/p>\n<p><strong>\u0418\u0442\u043e\u0433\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 .json \u0444\u0430\u0439\u043b.<\/strong> <\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># Check dir - create if not exists if not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):     os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr'])) # Save result in file lFile = open(f&quot;{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json&quot;,&quot;w&quot;,encoding=&quot;utf-8&quot;) lFile.write(json.dumps(lResult)) lFile.close()<\/code><\/pre>\n<p>  <\/p>\n<h2 id=\"shag-4-obrabotka-neshtatnyh-situaciy\">\u0428\u0430\u0433 4. \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439<\/h2>\n<p>  <\/p>\n<p>\u042d\u0442\u0430\u043f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u2014 \u044d\u0442\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0432\u0430\u0436\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0443\u0441\u0438\u043b\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u044d\u0444\u0444\u0435\u043a\u0442. \u041f\u0440\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u043a\u043e\u0434\u0430 \u043d\u0430 \u044d\u0442\u043e\u043c WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u044f\u0441\u043d\u0438\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0431\u043e\u0438. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u043e\u0436\u0443 \u0442\u0435 \u0432\u0438\u0434\u044b \u0441\u0431\u043e\u0435\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u043b\u0438\u0441\u044c \u0443 \u043c\u0435\u043d\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li>\u0417\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043b. \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/li>\n<li>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (\u0438\u043d\u043e\u0433\u0434\u0430, \u043d\u043e \u0441\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \ud83d\ude42 )<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041d\u043e \u0440\u043e\u0431\u043e\u0442\u044b \u043d\u0435 \u0431\u043e\u044f\u0442\u0441\u044f \u0442\u0430\u043a\u0438\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c (\u043d\u0430 \u0442\u043e \u043e\u043d\u0438 \u0438 \u0440\u043e\u0431\u043e\u0442\u044b \ud83d\ude42 ). <\/p>\n<p>  <\/p>\n<p><strong>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0438\u0434\u0430 \u0441\u0431\u043e\u044f \u043c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0439 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0440\u043e\u0431\u043e\u0442\u044b \u0434\u043e\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0434\u043e \u043a\u043e\u043d\u0446\u0430.<\/strong><\/p>\n<p>  <\/p>\n<ul>\n<li>\n<p>\u0417\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u043f\u043e\u043b\u0437\u0443\u043d\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043b. \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># wait while preloader is active. If timeout - retry all job lTimeFromFLoat = time.time() # get current time in float (seconds) lDoWaitBool = True while lDoWaitBool: lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*=&quot;--preloadOverlay--&quot;]') if len(lPreloaderCSS)&gt;0: time.sleep(0.5) # preloader is here - wait else: lDoWaitBool = False # Stop wait if preloader is dissappear if (time.time() - lTimeFromFLoat) &gt; 15: # check if timeout is more than 15 seconds     lRetryJobBool = True # Loading error on page - do break, then retry the job     if inLogger: inLogger.warning(f&quot;\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u043e\u043b\u0435\u0435 {15} \u0441., \u0420\u043e\u0431\u043e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430&quot;)     break # break the loop if lRetryJobBool == True: # break the loop if RetryJobBool is true break<\/code><\/pre>\n<p>  <\/li>\n<li>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0442\u043a\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0432\u0441\u0435\u043c \u043d\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 (\u0438\u043d\u043e\u0433\u0434\u0430, \u043d\u043e \u0441\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \ud83d\ude42 )<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\">lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*=&quot;--active--&quot;] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job) if lPageNumberInt == lPageCounterInt: ... \u041a\u043e\u0434 \u0440\u043e\u0431\u043e\u0442\u0430 ... else: lRetryJobBool = True if inLogger: inLogger.warning(     f&quot;\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430. \u0411\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {lPageNumberInt}, \u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {lPageCounterInt}&quot;)<\/code><\/pre>\n<p>  <\/li>\n<\/ul>\n<p>  <\/p>\n<h2 id=\"shag-5-konsolidirovat-kod-v-proekte-robota\">\u0428\u0430\u0433 5. \u041a\u043e\u043d\u0441\u043e\u043b\u0438\u0434\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 \u0440\u043e\u0431\u043e\u0442\u0430<\/h2>\n<p>  <\/p>\n<p><strong>\u0421\u043e\u0431\u0435\u0440\u0435\u043c \u0432\u0441\u0435 \u0431\u043b\u043e\u043a\u0438 \u0432\u043e\u0435\u0434\u0438\u043d\u043e.<\/strong> <\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0430\u043a\u0435\u0442 (<a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\/-\/blob\/master\/Wiki\/RUS_Tutorial\/WebGUI_Habr\/3.%20MonitoringCIAN_Run_64.py\" rel=\"nofollow\">\u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043d\u0430 GitLab<\/a>):<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"># Init Chrome web driver with extensions (if applicable) # Import section from selenium import webdriver import time import re # Regexp to extract info from string import json import datetime import os import re import copy import logging # Store structure (.json) &quot;&quot;&quot; {     &quot;SearchKeyStr&quot;: &quot;\u041c\u0421\u041a_\u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;,     &quot;SearchTitleStr&quot;: &quot;\u041c\u043e\u0441\u043a\u0432\u0430, \u0440\u0430\u0439\u043e\u043d \u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;, # Title of the search [str]     &quot;SearchURLStr&quot;: &quot;https:\/\/www.cian.ru\/cat.php?deal_type=sale&amp;engine_version=2&amp;in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&amp;offer_type=flat&amp;polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&amp;room1=1&amp;room2=1&quot;, # URL of the CIAN search [str]     &quot;SearchDatetimeStr&quot;: &quot;2020-08-01 09:33:00.838081&quot;, # Date of data extraction,  [str]     &quot;SearchItems&quot;: {         &quot;https:\/\/www.cian.ru\/sale\/flat\/219924574\/:&quot;: { # Item URL with https             &quot;TitleStr&quot;: &quot;3-\u043a\u043e\u043c\u043d. \u043a\u0432., 31,4 \u043c\u00b2, 5\/8 \u044d\u0442\u0430\u0436&quot;, # Offer title [str]             &quot;PriceFloat&quot;: 10000000.0, # Price [float]             &quot;PriceSqmFloat&quot;: 133333.0, # CALCULATED Price per square meters [float]             &quot;SqMFloat&quot;: 31.4, # Square meters in flat [float]             &quot;FloorCurrentInt&quot;: 5, # Current floor [int]             &quot;FloorTotalInt&quot;: 8, # Current floor [int]             &quot;RoomCountInt&quot;: 3 # Room couint [int]         }     }  } &quot;&quot;&quot;  ########################## # Init the Chrome web driver ########################### gChromeExeFullPath = r'..\\Resources\\GoogleChromePortable\\App\\Chrome-bin\\chrome.exe' gExtensionFullPathList = [] gWebDriverFullPath = r'..\\Resources\\SeleniumWebDrivers\\Chrome\\chromedriver_win32 v84.0.4147.30\\chromedriver.exe' def WebDriverInit(inWebDriverFullPath, inChromeExeFullPath, inExtensionFullPathList):     # Set full path to exe of the chrome     lWebDriverChromeOptionsInstance = webdriver.ChromeOptions()     lWebDriverChromeOptionsInstance.binary_location = inChromeExeFullPath     # Add extensions     for lExtensionItemFullPath in inExtensionFullPathList:         lWebDriverChromeOptionsInstance.add_extension (lExtensionItemFullPath)     # Run chrome instance     lWebDriverInstance = None     if inWebDriverFullPath:         # Run with specified web driver path         lWebDriverInstance = webdriver.Chrome(executable_path = inWebDriverFullPath, options=lWebDriverChromeOptionsInstance)     else:         lWebDriverInstance = webdriver.Chrome(options = lWebDriverChromeOptionsInstance)     # Return the result     return lWebDriverInstance  from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC  # def to extract list of offers from one job def OffersByJobExtractDict(inLogger, inWebDriver, inJob):     # BUG 0 - if timeout - retry the job +     # BUG 1 - do mouse scroll to to emulate user activity - cian can hold the robot     # BUG 2 - check the page to retry job offer if page is not next +     # BUG 3 - RE fall on \u0410\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u044b-\u0441\u0442\u0443\u0434\u0438\u044f, 85,6 \u043c\u00b2, 4\/8 \u044d\u0442\u0430\u0436 +     lRetryJobBool = True # Init flag if some error is raised - retry     while lRetryJobBool:         lRetryJobBool = False  # Set false until some another action will appear         lResult = copy.deepcopy(inJob) # do copy the structure         lFilterURLStr = lResult[&quot;SearchURLStr&quot;]         inWebDriver.get(lFilterURLStr) # Open the URL         lDatetimeNowStr = str(datetime.datetime.now())         lResult.update({             &quot;SearchDatetimeStr&quot;: lDatetimeNowStr, # Date of data extraction,  [str]             &quot;SearchItems&quot;: {} # prepare the result         })         # Get List of the page         lNextPageItemCSS = 'div[data-name=&quot;Pagination&quot;] li[class*=&quot;active&quot;] + li a'         lNextPageItem = inWebDriver.find_element_by_css_selector(lNextPageItemCSS)         lPageCounterInt = 1 # Init the page counter         while lNextPageItem:             lPageNumberInt = int(inWebDriver.find_element_by_css_selector(css_selector='li[class*=&quot;--active--&quot;] span').text) # Get the current page int from web and check with iterator (if not equal - retry all job)             if lPageNumberInt == lPageCounterInt:                 lOfferListCSSStr = 'div[data-name=&quot;Offers&quot;] &gt; div:not([data-name=&quot;BannerServicePlaceInternal&quot;]):not([data-name=&quot;getBannerMarkup&quot;]):not([data-name=&quot;AdFoxBannerTracker&quot;])'                 lOfferList = inWebDriver.find_elements_by_css_selector(css_selector=lOfferListCSSStr)                 for lOfferItem in lOfferList: # Processing the item, extract info                     lOfferItemInfo = { # Item URL with https                         &quot;TitleStr&quot;: &quot;3-\u043a\u043e\u043c\u043d. \u043a\u0432., 31,4 \u043c\u00b2, 5\/8 \u044d\u0442\u0430\u0436&quot;, # Offer title [str]                         &quot;PriceFloat&quot;: 10000000.0, # Price [float]                         &quot;PriceSqmFloat&quot;: 133333.0, # CALCULATED Price per square meters [float]                         &quot;SqMFloat&quot;: 31.4, # Square meters in flat [float]                         &quot;FloorCurrentInt&quot;: 5, # Current floor [int]                         &quot;FloorTotalInt&quot;: 8, # Current floor [int]                         &quot;RoomCountInt&quot;: 3  # Room couint [int]                     }                     lTitleStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name=&quot;TopTitle&quot;],div[data-name=&quot;Title&quot;]').text # Extract title text                     if inLogger: inLogger.info(f&quot;\u0421\u0442\u0430\u0440\u0442 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f: {lTitleStr}&quot;)                     lPriceStr = lOfferItem.find_element_by_css_selector(css_selector='div[data-name=&quot;Price&quot;]  &gt; div[class*=&quot;header&quot;],div[data-name=&quot;TopPrice&quot;] &gt; div[class*=&quot;header&quot;]').text # Extract total price                     lURLStr = lOfferItem.find_element_by_css_selector(css_selector='a[class*=&quot;--header--&quot;]').get_attribute(&quot;href&quot;) # Extract offer URL                     lOfferItemInfo[&quot;TitleStr&quot;] = lTitleStr # set the title                     lPriceStr = lPriceStr.replace(&quot; &quot;,&quot;&quot;).replace(&quot;\u20bd&quot;,&quot;&quot;) # Remove some extra symbols                     lOfferItemInfo[&quot;PriceFloat&quot;] = round(float(lPriceStr),2) # Convert price to the float type                     #Check if \u0410\u043f\u0430\u0440\u0442\u0430\u043c\u0435\u043d\u0442\u044b                     if &quot;\u0410\u041f\u0410\u0420\u0422\u0410\u041c\u0415\u041d\u0422\u042b&quot; in lTitleStr.upper():                         lREResult = re.search(r&quot;.*, (\\d*,?\\d*) \u043c\u00b2, (\\d*)\/(\\d*) \u044d\u0442\u0430.&quot;, lTitleStr)  # run the re                         lOfferItemInfo[&quot;RoomCountInt&quot;] = 1 # Room count                         lSqmStr = lREResult.group(1)                         lSqmStr= lSqmStr.replace(&quot;,&quot;,&quot;.&quot;)                         lOfferItemInfo[&quot;SqMFloat&quot;] = round(float(lSqmStr),2) # sqm count                         lOfferItemInfo[&quot;FloorCurrentInt&quot;] = int(lREResult.group(2)) # Floor current                         lOfferItemInfo[&quot;FloorTotalInt&quot;] = int(lREResult.group(3)) # Floor total                         lOfferItemInfo[&quot;PriceSqmFloat&quot;] = round(lOfferItemInfo[&quot;PriceFloat&quot;] \/ lOfferItemInfo[&quot;SqMFloat&quot;],2) # Sqm per M                     else:                         lREResult = re.search(r&quot;.*(\\d)-\u043a\u043e\u043c\u043d. .*, (\\d*,?\\d*) \u043c\u00b2, (\\d*)\/(\\d*) \u044d\u0442\u0430.&quot;, lTitleStr) # run the re                         lOfferItemInfo[&quot;RoomCountInt&quot;] = int(lREResult.group(1)) # Room count                         lSqmStr = lREResult.group(2)                         lSqmStr= lSqmStr.replace(&quot;,&quot;,&quot;.&quot;)                         lOfferItemInfo[&quot;SqMFloat&quot;] = round(float(lSqmStr),2) # sqm count                         lOfferItemInfo[&quot;FloorCurrentInt&quot;] = int(lREResult.group(3)) # Floor current                         lOfferItemInfo[&quot;FloorTotalInt&quot;] = int(lREResult.group(4)) # Floor total                         lOfferItemInfo[&quot;PriceSqmFloat&quot;] = round(lOfferItemInfo[&quot;PriceFloat&quot;] \/ lOfferItemInfo[&quot;SqMFloat&quot;],2) # Sqm per M                     lResult['SearchItems'][lURLStr] = lOfferItemInfo # Set item in result dict                 # Click next page item                 lNextPageItem = None                 lNextPageList = inWebDriver.find_elements_by_css_selector(lNextPageItemCSS)                 if len(lNextPageList)&gt;0:                     lNextPageItem = lNextPageList[0]                     try:                         #lNextPageItem = WebDriverWait(lWebDriver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, 'div[data-name=&quot;Pagination&quot;]')))                         #lNextPageItem.click()                         inWebDriver.execute_script(&quot;&quot;&quot;document.querySelector('div[data-name=&quot;Pagination&quot;] li[class*=&quot;active&quot;] + li a').click()&quot;&quot;&quot;)                     except Exception as e:                         print(e)                     time.sleep(0.5) # some init operations                     # wait while preloader is active. If timeout - retry all job                     lTimeFromFLoat = time.time() # get current time in float (seconds)                     lDoWaitBool = True                     while lDoWaitBool:                         lPreloaderCSS = inWebDriver.find_elements_by_css_selector(css_selector='div[class*=&quot;--preloadOverlay--&quot;]')                         if len(lPreloaderCSS)&gt;0: time.sleep(0.5) # preloader is here - wait                         else: lDoWaitBool = False # Stop wait if preloader is dissappear                         if (time.time() - lTimeFromFLoat) &gt; 15: # check if timeout is more than 15 seconds                             lRetryJobBool = True # Loading error on page - do break, then retry the job                             if inLogger: inLogger.warning(f&quot;\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0431\u043e\u043b\u0435\u0435 {15} \u0441., \u0420\u043e\u0431\u043e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0441\u043d\u0430\u0447\u0430\u043b\u0430&quot;)                             break # break the loop                     if lRetryJobBool == True: # break the loop if RetryJobBool is true                         break                 lPageCounterInt = lPageCounterInt + 1 # Increment the page counter             else:                 lRetryJobBool = True                 if inLogger: inLogger.warning(                     f&quot;\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u043f\u043e \u0441\u043f\u0438\u0441\u043a\u0443 \u043d\u0435 \u0431\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430. \u0411\u044b\u043b\u0430 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {lPageNumberInt}, \u041e\u0436\u0438\u0434\u0430\u043b\u0430\u0441\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430: {lPageCounterInt}&quot;)         if lRetryJobBool == False:  # break the loop if RetryJobBool is true             # Check dir - create if not exists             if not os.path.exists(os.path.join('Datasets',lResult['SearchKeyStr'])):                 os.makedirs(os.path.join('Datasets',lResult['SearchKeyStr']))             # Save result in file             lFile = open(f&quot;{os.path.join('Datasets',lResult['SearchKeyStr'],lDatetimeNowStr.replace(' ','_').replace('-','_').replace(':','_').replace('.','_'))}.json&quot;,&quot;w&quot;,encoding=&quot;utf-8&quot;)             lFile.write(json.dumps(lResult))             lFile.close()  # \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c Google Chrome with selenium web driver lWebDriver = WebDriverInit(inWebDriverFullPath = gWebDriverFullPath, inChromeExeFullPath = gChromeExeFullPath, inExtensionFullPathList = gExtensionFullPathList) lFilterURLStr = &quot;https:\/\/www.cian.ru\/cat.php?deal_type=sale&amp;engine_version=2&amp;in_polygon%5B1%5D=37.6166_55.7678%2C37.6147_55.7688%2C37.6114_55.7694%2C37.6085_55.7698%2C37.6057_55.77%2C37.6018_55.77%2C37.5987_55.77%2C37.5961_55.7688%2C37.5942_55.7677%2C37.5928_55.7663%2C37.5915_55.7647%2C37.5908_55.7631%2C37.5907_55.7616%2C37.5909_55.7595%2C37.5922_55.7577%2C37.5944_55.7563%2C37.5968_55.7555%2C37.6003_55.7547%2C37.603_55.7543%2C37.6055_55.7542%2C37.6087_55.7541%2C37.6113_55.7548%2C37.6135_55.756%2C37.6151_55.7574%2C37.6163_55.7589%2C37.6179_55.7606%2C37.6187_55.7621%2C37.619_55.7637%2C37.6194_55.7651%2C37.6193_55.7667%2C37.6178_55.7679%2C37.6153_55.7683%2C37.6166_55.7678&amp;offer_type=flat&amp;polygon_name%5B1%5D=%D0%9E%D0%B1%D0%BB%D0%B0%D1%81%D1%82%D1%8C+%D0%BF%D0%BE%D0%B8%D1%81%D0%BA%D0%B0&amp;room1=1&amp;room2=1&quot; lJobItem = {     &quot;SearchKeyStr&quot;: &quot;\u041c\u0421\u041a_\u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;,     &quot;SearchTitleStr&quot;: &quot;\u041c\u043e\u0441\u043a\u0432\u0430, \u0440\u0430\u0439\u043e\u043d \u0422\u0432\u0435\u0440\u0441\u043a\u043e\u0439&quot;,  # Title of the search [str]     &quot;SearchURLStr&quot;: lFilterURLStr,     # URL of the CIAN search [str] } OffersByJobExtractDict(inLogger = logging, inWebDriver = lWebDriver, inJob = lJobItem)<\/code><\/pre>\n<p>  <\/p>\n<h1 id=\"podvedem-itogi\">\u041f\u043e\u0434\u0432\u0435\u0434\u0435\u043c \u0438\u0442\u043e\u0433\u0438<\/h1>\n<p>  <\/p>\n<p>\u0423\u0432\u0430\u0436\u0430\u0435\u043c\u044b\u0435 \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u044b. <\/p>\n<p>  <\/p>\n<p>\u041c\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0440\u0435\u043e\u0434\u043e\u043b\u0435\u043b\u0438 \u0432\u0442\u043e\u0440\u0443\u044e \u0441\u0435\u0440\u0438\u044e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044e \u0440\u043e\u0431\u043e\u0442\u043e\u0432 \u0432 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e open source pyOpenRPA. \u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0440\u043e\u0431\u043e\u0442\u0430 \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 pyOpenRPA <a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\/-\/tree\/master\/Wiki\/RUS_Tutorial\/WebGUI_Habr\" rel=\"nofollow\">\u043f\u043e \u0441\u0441\u044b\u043b\u043e\u0447\u043a\u0435<\/a>.<br \/>  \u0412 \u043d\u0430\u0448\u0435\u043c \u0430\u0440\u0435\u0441\u0435\u043d\u0430\u043b\u0435 \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438 \u0443\u043f\u0440\u0430\u043b\u0435\u043d\u0438\u044f Desktop \u0438 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438. \u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435-\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0435 \u043c\u044b \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c\u0441\u044f \u043d\u0430 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044f\u0445 \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043c\u044b\u0448\u044c\u044e \u0438 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439. <\/p>\n<p>  <\/p>\n<p>\u041f\u0438\u0448\u0438\u0442\u0435 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b, \u0432\u043d\u0435\u0434\u0440\u044f\u0439\u0442\u0435 \u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0445 \u0440\u043e\u0431\u043e\u0442\u043e\u0432, \u0431\u0443\u0434\u044c\u0442\u0435 \u0441\u0447\u0430\u0441\u0442\u043b\u0438\u0432\u044b \ud83d\ude42 <\/p>\n<p>  <\/p>\n<p><strong>\u0414\u043e \u0441\u043a\u043e\u0440\u044b\u0445 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439!<\/strong><\/p>\n<\/div>\n<p> \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:\/\/habr.com\/ru\/post\/515310\/\"> https:\/\/habr.com\/ru\/post\/515310\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html post__text_v1\" id=\"post-content-body\" data-io-article-url=\"https:\/\/habr.com\/ru\/post\/515310\/\">\n<p>\u0414\u043e\u043b\u0433\u043e\u0436\u0434\u0430\u043d\u043d\u044b\u0439 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u043f\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044e \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u043c\u0438 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e pyOpenRPA. \u0412\u043e 2-\u0439 \u0447\u0430\u0441\u0442\u0438 \u043c\u044b \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b \u0440\u043e\u0431\u043e\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0432\u043e\u0437\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0430 HTML\/JS. \u0410 \u0442\u0430\u043a\u0436\u0435 \u0441\u0432\u043e\u0438\u043c\u0438 \u0440\u0443\u043a\u0430\u043c\u0438 \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e, \u043d\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u043e\u0431\u043e\u0442\u0430. <\/p>\n<p>  <\/p>\n<p>\u042d\u0442\u043e\u0442 \u0440\u043e\u0431\u043e\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0442\u0435\u043c, \u0434\u043b\u044f \u043a\u043e\u0433\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430 \u0442\u0435\u043c\u0430 \u043f\u043e\u043a\u0443\u043f\u043a\u0438\/\u043f\u0440\u043e\u0434\u0430\u0436\u0438 \u043d\u0435\u0434\u0432\u0438\u0436\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/gt\/rq\/mo\/gtrqmo2cvzjaajye98dlpvxo-_u.png\" alt=\"pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438\"\/><\/p>\n<p>  <\/p>\n<h1 id=\"dlya-teh-kto-s-nami-vpervye\">\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u0441 \u043d\u0430\u043c\u0438 \u0432\u043f\u0435\u0440\u0432\u044b\u0435<\/h1>\n<p>  <\/p>\n<p><a href=\"https:\/\/gitlab.com\/UnicodeLabs\/OpenRPA\" rel=\"nofollow\">pyOpenRPA<\/a> \u2014 \u044d\u0442\u043e open source <a href=\"https:\/\/ru.wikipedia.org\/wiki\/Robotic_process_automation\" rel=\"nofollow\">RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f <strong>\u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u043e\u043f\u043e\u0432\u044b\u0435 \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0435 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b<\/strong>.<\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u0442\u043e, \u0447\u0435\u043c \u0436\u0435 \u043e\u043d\u0430 \u043f\u043e\u043b\u0435\u0437\u043d\u0430, \u043c\u043e\u0436\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/506766\/\">\u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  <\/p>\n<h1 id=\"navigaciya-po-tutorialam-pyopenrpa\">\u041d\u0430\u0432\u0438\u0433\u0430\u0446\u0438\u044f \u043f\u043e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430\u043c pyOpenRPA<\/h1>\n<p>  <\/p>\n<p>\u0422\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0441\u0432\u0435\u0440\u0441\u0442\u0430\u043d \u0432 \u0432\u0438\u0434\u0435 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0431\u0443\u0434\u0443\u0442 \u043e\u0441\u0432\u0435\u0449\u0430\u0442\u044c\u0441\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u043b\u044f RPA. <\/p>\n<p>  <\/p>\n<p>\u041e\u0441\u0432\u043e\u0438\u0432 \u044d\u0442\u0438 \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u0438, \u0443 \u0432\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0433\u043b\u0443\u0431\u0438\u0442\u044c\u0441\u044f \u0432 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0443 \u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u0434 \u0432\u0430\u043c\u0438.<\/p>\n<p>  <\/p>\n<p><strong>\u041f\u0435\u0440\u0435\u0447\u0435\u043d\u044c \u0441\u0442\u0430\u0442\u0435\u0439-\u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 (\u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c\u044b\u0435):<\/strong> <\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/506766\/\">\u041e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u043f\u043b\u0430\u0442\u043d\u044b\u0445 RPA \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c \u0438 \u0431\u0430\u0437\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 OpenSource (pyOpenRPA)<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/509644\/\">pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043a\u043e\u043d\u043d\u044b\u043c\u0438 GUI \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438<\/a><\/li>\n<li>&gt;&gt; <a href=\"https:\/\/habr.com\/ru\/post\/515310\/\">pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 WEB \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u043c\u0438 (\u0442\u043e, \u0447\u0442\u043e \u043c\u044b \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432 Chrome, Firefox, Opera)<\/a><\/li>\n<li>pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439 &amp; \u043c\u044b\u0448\u044c\u044e<\/li>\n<li>pyOpenRPA \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b. \u0420\u0430\u0441\u043f\u043e\u0437\u043d\u0430\u0432\u0430\u043d\u0438\u0435 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u0441\u0430\u043c\u043e\u043c\u0443 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0443.<\/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-308537","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308537","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=308537"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/308537\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=308537"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=308537"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=308537"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}