{"id":393759,"date":"2024-06-29T11:12:22","date_gmt":"2024-06-29T11:12:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=393759"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=393759","title":{"rendered":"<span>\u041a\u0430\u043a \u044f \u0431\u043e\u0440\u043e\u043b\u0441\u044f \u0441 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442\u043e\u043c<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041a\u0430\u043a \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c<\/h3>\n<p>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 CPM, \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u043d\u0430 <a href=\"https:\/\/www.youtube.com\/watch?v=mMLmCViaFKI&amp;ab_channel=Beluga\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u0438\u0434\u0435\u043e<\/a>, \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 WPM.<\/p>\n<p>\u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u0418 \u043c\u043d\u0435 \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/563\/e7d\/ef2\/563e7def2305bb5a22e62dfb8dc5abba.png\" alt=\"\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u043e\" title=\"\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u043e\" width=\"678\" height=\"422\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/563\/e7d\/ef2\/563e7def2305bb5a22e62dfb8dc5abba.png\"\/><figcaption>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u043e<\/figcaption><\/figure>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 &#171;\u043a\u043e\u043c\u043d\u0430\u0442\u044b&#187; \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3ca\/120\/11e\/3ca12011e51f794b1317a89738795786.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439\" width=\"1592\" height=\"692\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3ca\/120\/11e\/3ca12011e51f794b1317a89738795786.png\"\/><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fa1\/9c9\/4bc\/fa19c94bcac99c0375acd7ebb6d4d7a0.png\" alt=\"\u0421\u043b\u043e\u0432\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\" title=\"\u0421\u043b\u043e\u0432\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430\" width=\"1648\" height=\"462\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fa1\/9c9\/4bc\/fa19c94bcac99c0375acd7ebb6d4d7a0.png\"\/><figcaption>\u0421\u043b\u043e\u0432\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430<\/figcaption><\/figure>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0434\u0443\u043c\u0430\u043b \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043b\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f16\/f12\/51a\/f16f1251adaed22ba6ba50f955578a35.png\" alt=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\" title=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f\" width=\"688\" height=\"342\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f16\/f12\/51a\/f16f1251adaed22ba6ba50f955578a35.png\"\/><figcaption>\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f<\/figcaption><\/figure>\n<p>\u0418\u0437 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u044b\u0432\u043e\u0434\u0430: \u043f\u0435\u0440\u0432\u044b\u0439 &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e \u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 291 \u0441\u043b\u043e\u0432\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, 'html.parser') words_list = list() boundaries = soup.find(attrs={'id': 'row1', 'style': \"top: 1px;\"}) for span in boundaries.find_all('span'): words_list.append(span.text)<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0449\u0435. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f\/\u0432\u0432\u043e\u0434\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0438:<\/p>\n<pre><code class=\"python\">from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup from webdriver_manager.chrome import ChromeDriverManager import json  HTML_SOURCE = \"https:\/\/10fastfingers.com\/competition\/611216d69046c\"   class MonkeyWorker:     def __init__(self, url, login, password):         self.__URL = url         #   Create actual driver         self.driver = webdriver.Chrome(ChromeDriverManager(version=\"92.0.4515.107\").install())         self.driver.maximize_window()         #   Login         self.driver.get(\"https:\/\/10fastfingers.com\/login\")         time.sleep(2)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][email]\"]').send_keys(login)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][password]\"]').send_keys(password)         time.sleep(1)         self.driver.find_element_by_xpath('\/\/button[@class = \"CybotCookiebotDialogBodyButton\"]').click()         self.driver.find_element_by_xpath('\/\/button[@class = \"btn btn-info\" and @id = \"login-form-submit\"]').click()         time.sleep(3)         #   Open input Link         self.driver.get(self.__URL)         time.sleep(5)         self.soup = BeautifulSoup(self.driver.page_source, 'html.parser')         self.words_list = list()         self.input_form = self.driver.find_element_by_xpath('\/\/input[@class = \"form-control\" and @id = \"inputfield\"]')      def get_words(self):         boundaries = self.soup.find(attrs={'id': 'row1', 'style': \"top: 1px;\"})         for span in boundaries.find_all('span'):             self.words_list.append(span.text)      def input_words(self):         for word in self.words_list:             for symbol in word:                 self.input_form.send_keys(symbol)             self.input_form.send_keys(Keys.SPACE)      def close(self):         self.driver.quit()   with open('config.txt') as file:     conf = json.load(file)  monke = MonkeyWorker(HTML_SOURCE, conf[\"login\"], conf[\"password\"]) monke.get_words() monke.input_words() char = input() monke.close()<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <strong>input_words<\/strong> \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c \u0432 \u0441\u043b\u043e\u0432\u0435 \u0441 \u0446\u0435\u043b\u044c\u044e \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0432\u043e\u0434\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u0430\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/915\/55d\/c40\/91555dc4024fc320f2da8ce56876e563.png\" width=\"1030\" height=\"612\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/915\/55d\/c40\/91555dc4024fc320f2da8ce56876e563.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0430.<\/p>\n<h3>\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442\u043e\u043c<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0447\u0442\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0438 \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/24c\/27f\/f3c\/24c27ff3ce516187c8d3f4cd60938ea6.png\" width=\"1356\" height=\"648\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/24c\/27f\/f3c\/24c27ff3ce516187c8d3f4cd60938ea6.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430. \u0418\u0437 \u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0430 &#171;\u0441\u0434\u0430\u0447\u0443 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430&#187;, \u0438 \u0447\u0442\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b \u0430\u043d\u043e\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c WPM. \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0441\u0442\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f1d\/eb5\/d68\/f1deb5d68c63d0b4d8cd4a8b1ebbba34.png\" width=\"1582\" height=\"1308\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f1d\/eb5\/d68\/f1deb5d68c63d0b4d8cd4a8b1ebbba34.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 <strong>Start Test<\/strong> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0438\u0436\u0435:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/46f\/0be\/625\/46f0be625dee5c02626448ad2a926f26.png\" width=\"1602\" height=\"916\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/46f\/0be\/625\/46f0be625dee5c02626448ad2a926f26.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0438 \u043a\u0430\u043a \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043a\u043b\u0438\u043a\u0430. \u0412 Selenium \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c:<\/p>\n<pre><code class=\"python\">driver.execute_script(\"$(arguments[0]).click();\", self.driver.find_element_by_xpath('\/\/button[@class = \\                                     \"btn btn-large btn-info\" and @id = \"start-btn\"]'))<\/code><\/pre>\n<p>\u0411\u044b\u043b\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u0430 \u043c\u0435\u043d\u044f \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c. \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432. \u041c\u043e\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>requests<\/code> . \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<pre><code class=\"python\">IMAGE_URL = str(self.soup.find('div', attrs={\"id\": \"word-img\"}).find_all('img')[0]['src']) image = requests.get(IMAGE_URL).content()<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0435\u043b\u044b\u0439 \u0444\u043e\u043d. \u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 Selenium. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 ChromeDriver. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def img_getter():     \"\"\"     Function to get image by opening new tab. Doesn't work because 10fastfingers have smart text genearator     :return:     \"\"\"     #   Getting image     IMAGE_URL = str(self.soup.find('div', attrs={\"id\": \"word-img\"}).find_all('img')[0]['src'])     self.driver.execute_script(\"window.open('');\")     self.driver.switch_to.window(self.driver.window_handles[1])     self.driver.get(IMAGE_URL)     #   Convert selenium screenshot to Image     self.image = Image.open(io.BytesIO(self.driver.get_screenshot_as_png()))    # Creating Image     #   self.driver.close()     self.driver.switch_to.window(self.driver.window_handles[0])      self.image.show()     self.__image_preprocessing()<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0415\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0431\u0435\u043b\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0432 \u0441\u0435\u0431\u0435 \u043e\u0431\u0448\u0438\u0440\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u0438:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/66c\/94c\/3ee\/66c94c3ee5fdbf1289d8c5d164343410.png\" alt=\"\u041c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043b\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\" title=\"\u041c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043b\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\" width=\"2170\" height=\"1008\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/66c\/94c\/3ee\/66c94c3ee5fdbf1289d8c5d164343410.png\"\/><figcaption>\u041c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043b\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a<\/figcaption><\/figure>\n<pre><code>def __old_image_preprocessing(self):     image = self.image.convert('RGB')     numpy_image = np.array(image)     original = numpy_image.copy()     image = image.filter(ImageFilter.MedianFilter(3))      # Find X,Y coordinates of all white pixels     whiteY, whiteX = np.where(np.all(numpy_image == [255, 255, 255], axis=2))     top, bottom = whiteY[0], whiteY[-1]     left, right = whiteX[0], whiteX[-1]      # Crop white solid     ROI = original[top:bottom, left:right]     final = Image.fromarray(ROI)     final.show()     self.image = final<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438! <\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/084\/aa0\/7a8\/084aa07a88e137076fa7ba36d9e03fb4.png\" alt=\"\u0422\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c\" title=\"\u0422\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c\" width=\"1462\" height=\"886\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/084\/aa0\/7a8\/084aa07a88e137076fa7ba36d9e03fb4.png\"\/><figcaption>\u0422\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c60\/a99\/514\/c60a995140f34b385f421de42dafb037.png\" alt=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435\" title=\"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435\" width=\"1166\" height=\"356\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c60\/a99\/514\/c60a995140f34b385f421de42dafb037.png\"\/><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/figcaption><\/figure>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0418\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u044f, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0440\u043e\u043f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">def getting_image(self):     element = self.driver.find_element_by_xpath('\/\/div[@id = \"word-img\"]')     location = element.location_once_scrolled_into_view     size = element.size     area = (location[\"x\"] * 2, location[\"y\"] * 2, location[\"x\"] * 2 + size[\"width\"] * 2,             location[\"y\"] * 2 + size[\"height\"] * 2)      self.image = self.driver.get_screenshot_as_png()     self.image = Image.open(io.BytesIO(self.image))     self.image = self.image.crop(area)     self.__image_preprocessing()      def __image_preprocessing(self):     \"\"\"     Apply SHARPEN filter to make words detecting little better     :return:     \"\"\"     self.image.show()     self.image = self.image.filter(ImageFilter.SHARPEN)     self.image.show()     self.image = self.image.filter(ImageFilter.SHARPEN)     self.image.show()<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f OCR Tesseract \u0438 \u0434\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. <\/p>\n<pre><code class=\"python\">import pytesseract as image_engine from pytesseract import Output  def get_words(self):      words = image_engine.image_to_data(self.image, lang=\"eng\", output_type=Output.DICT)     clean_words = list(filter(lambda x: x != '', words[\"text\"]))     self.words_list = clean_words<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0432 \u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u044e \u0441\u043b\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Tesseract, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432 \u0447\u0435\u043c-\u0442\u043e \u0432 \u0434\u0443\u0445\u0435: <a href=\"https:\/\/github.com\/courao\/ocr.pytorch\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/courao\/ocr.pytorch<\/a><\/p>\n<p>\u042f \u0436\u0435 \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418 \u043e\u043d \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ddd\/951\/791\/ddd951791262a4d87467f5b48dd40ef8.png\" width=\"1018\" height=\"606\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ddd\/951\/791\/ddd951791262a4d87467f5b48dd40ef8.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043e\u0439\u0442\u0438 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 <a href=\"https:\/\/10fastfingers.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/10fastfingers.com\/<\/a>. \u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0432\u0435\u0441\u0435\u043b\u044c\u044f \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Selenium. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043c\u043e\u0439 \u043f\u043e\u0441\u0442 \u0412\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<p><em>\u0410\u043d\u0442\u0438-\u0447\u0438\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/em><\/p>\n<pre><code class=\"python\">from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup from webdriver_manager.chrome import ChromeDriverManager import json import pytesseract as image_engine from pytesseract import Output from PIL import Image, ImageFilter import io import numpy as np  HTML_SOURCE = \"https:\/\/10fastfingers.com\/anticheat\"   class MonkeyWorker:     def __init__(self, url, login, password):         self.__URL = url         self.driver = webdriver.Chrome(ChromeDriverManager(version=\"92.0.4515.107\").install())         self.action = webdriver.ActionChains(self.driver)         self.driver.maximize_window()         #   Login         self.driver.get(\"https:\/\/10fastfingers.com\/login\")         time.sleep(2)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][email]\"]').send_keys(login)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][password]\"]').send_keys(password)         time.sleep(1)         #   Bad way is about using execute java script         self.driver.find_element_by_xpath('\/\/button[@class = \\                                                 \"CybotCookiebotDialogBodyButton\"]').click()    # Apply cookies         self.driver.find_element_by_xpath('\/\/button[@class = \"btn btn-info\" and @id = \"login-form-submit\"]').click()         time.sleep(1)   # Little sleep in case after login script redirect to another page          #   Go to anti-cheat page         self.driver.get(self.__URL)         time.sleep(1)         self.driver.find_element_by_xpath('\/\/a[@href= \"\/anticheat\/view\/1\/1\" and @class = \"btn btn-info\" \\                                             and text() = \"Start Test \"]').click()         time.sleep(5)          #   Button has specific form - so in my opinion the best way to click it - use execute script         self.driver.execute_script(\"$(arguments[0]).click();\", self.driver.find_element_by_xpath('\/\/button[@class = \\                                     \"btn btn-large btn-info\" and @id = \"start-btn\"]'))         time.sleep(1)         self.soup = BeautifulSoup(self.driver.page_source, 'html.parser')         self.words_list = list()          #   Save element with form where we need to put Keys         self.input_form = self.driver.find_element_by_xpath('\/\/textarea[@id = \"word-input\"]')         self.getting_image()      def getting_image(self):         element = self.driver.find_element_by_xpath('\/\/div[@id = \"word-img\"]')         location = element.location_once_scrolled_into_view         size = element.size         area = (location[\"x\"] * 2, location[\"y\"] * 2, location[\"x\"] * 2 + size[\"width\"] * 2,                 location[\"y\"] * 2 + size[\"height\"] * 2)          self.image = self.driver.get_screenshot_as_png()         self.image = Image.open(io.BytesIO(self.image))         self.image = self.image.crop(area)         self.__image_preprocessing()          def not_working():             \"\"\"             Function to get image by opening new tab. Doesn't work because 10fastfingers have smart text genearator             :return:             \"\"\"             #   Getting image             IMAGE_URL = str(self.soup.find('div', attrs={\"id\": \"word-img\"}).find_all('img')[0]['src'])             self.driver.execute_script(\"window.open('');\")             self.driver.switch_to.window(self.driver.window_handles[1])             self.driver.get(IMAGE_URL)             #   Convert selenium screenshot to Image             self.image = Image.open(io.BytesIO(self.driver.get_screenshot_as_png()))    # Creating Image             #   self.driver.close()             self.driver.switch_to.window(self.driver.window_handles[0])              self.image.show()             self.__image_preprocessing()       def __image_preprocessing(self):         \"\"\"         Apply SHARPEN filter to make words detecting little better         :return:         \"\"\"         self.image.show()         self.image = self.image.filter(ImageFilter.SHARPEN)         self.image.show()         self.image = self.image.filter(ImageFilter.SHARPEN)         self.image.show()      def __old_image_preprocessing(self):         image = self.image.convert('RGB')         numpy_image = np.array(image)         original = numpy_image.copy()         image = image.filter(ImageFilter.MedianFilter(3))          # Find X,Y coordinates of all white pixels         whiteY, whiteX = np.where(np.all(numpy_image == [255, 255, 255], axis=2))         top, bottom = whiteY[0], whiteY[-1]         left, right = whiteX[0], whiteX[-1]          # Crop white solid         ROI = original[top:bottom, left:right]         final = Image.fromarray(ROI)         final.show()         self.image = final      def get_words(self):          words = image_engine.image_to_data(self.image, lang=\"eng\", output_type=Output.DICT)         clean_words = list(filter(lambda x: x != '', words[\"text\"]))         self.words_list = clean_words      def input_words(self):         for word in self.words_list:             for symbol in word:                 self.input_form.send_keys(symbol)             self.input_form.send_keys(Keys.SPACE)         self.input_form.send_keys(Keys.TAB, Keys.ENTER)      def close(self):         self.driver.quit()   with open('config.txt') as file:     conf = json.load(file)   monkey = MonkeyWorker(HTML_SOURCE, conf[\"login\"], conf[\"password\"]) monkey.get_words() monkey.input_words() char = input() monkey.close() <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/573072\/\"> https:\/\/habr.com\/ru\/articles\/573072\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<h3>\u041a\u0430\u043a \u0432\u0441\u0435 \u043d\u0430\u0447\u0430\u043b\u043e\u0441\u044c<\/h3>\n<p>\u041d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0440\u0443\u0441\u0441\u043a\u043e\u044f\u0437\u044b\u0447\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 \u043f\u0435\u0447\u0430\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u0435\u0442\u0440\u0438\u043a\u0430 CPM, \u043d\u0430\u0442\u043a\u043d\u0443\u0432\u0448\u0438\u0441\u044c \u043d\u0430 <a href=\"https:\/\/www.youtube.com\/watch?v=mMLmCViaFKI&amp;ab_channel=Beluga\" rel=\"noopener noreferrer nofollow\">\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u0432\u0438\u0434\u0435\u043e<\/a>, \u043c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0430 \u0441\u0432\u043e\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043c\u0435\u0442\u0440\u0438\u043a\u0438 WPM.<\/p>\n<p>\u041f\u043e \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435. \u0418 \u043c\u043d\u0435 \u043e\u043d\u0430 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043d\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439.<\/p>\n<figure class=\"full-width\"><figcaption>\u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043e\u0431\u0438\u0434\u043d\u043e<\/figcaption><\/figure>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0430\u0432\u0442\u043e\u043d\u0430\u0431\u043e\u0440\u0430 \u0434\u043b\u044f \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0436\u0438\u043c\u0430<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0441\u043e\u0437\u0434\u0430\u044e\u0442 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0443\u0447\u0430\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u043a\u0442\u043e \u0443\u0433\u043e\u0434\u043d\u043e, \u0432\u044b\u0431\u043e\u0440 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 &#171;\u043a\u043e\u043c\u043d\u0430\u0442\u044b&#187; \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u0440\u0430\u0437\u043e\u043c<\/p>\n<figure class=\"full-width\"><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0440\u0435\u0432\u043d\u043e\u0432\u0430\u043d\u0438\u0439<\/figcaption><\/figure>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e:<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u043b\u043e\u0432\u0430 \u0438 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430<\/figcaption><\/figure>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 \u0441\u043e \u0441\u043b\u043e\u0432\u0430\u043c\u0438 \u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u043e \u043c\u0435\u0440\u0435 \u0432\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432, \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u044f \u0434\u0443\u043c\u0430\u043b \u0447\u0442\u043e \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432\u0435\u0442 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043e\u0434\u043d\u0430\u043a\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u0447\u0442\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u0441\u043b\u043e\u0432 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c. \u041a\u043e\u0434 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044f<\/figcaption><\/figure>\n<p>\u0418\u0437 \u0442\u0430\u043a\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u0432\u044b\u0432\u043e\u0434\u0430: \u043f\u0435\u0440\u0432\u044b\u0439 &#8212; \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432 \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e \u0438 \u0434\u043b\u0438\u043d\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 291 \u0441\u043b\u043e\u0432\u043e, \u0432\u0442\u043e\u0440\u043e\u0439 &#8212; \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0432\u0441\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u0431\u043e\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">from bs4 import BeautifulSoup soup = BeautifulSoup(page_source, 'html.parser') words_list = list() boundaries = soup.find(attrs={'id': 'row1', 'style': \"top: 1px;\"}) for span in boundaries.find_all('span'): words_list.append(span.text)<\/code><\/pre>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e\u0449\u0435. \u042f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u043b\u0430\u0441\u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\/\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f\/\u0432\u0432\u043e\u0434\u0430 \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b \u0435\u0433\u043e \u043d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0438:<\/p>\n<pre><code class=\"python\">from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup from webdriver_manager.chrome import ChromeDriverManager import json  HTML_SOURCE = \"https:\/\/10fastfingers.com\/competition\/611216d69046c\"   class MonkeyWorker:     def __init__(self, url, login, password):         self.__URL = url         #   Create actual driver         self.driver = webdriver.Chrome(ChromeDriverManager(version=\"92.0.4515.107\").install())         self.driver.maximize_window()         #   Login         self.driver.get(\"https:\/\/10fastfingers.com\/login\")         time.sleep(2)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][email]\"]').send_keys(login)         self.driver.find_element_by_xpath('\/\/input[@name = \"data[User][password]\"]').send_keys(password)         time.sleep(1)         self.driver.find_element_by_xpath('\/\/button[@class = \"CybotCookiebotDialogBodyButton\"]').click()         self.driver.find_element_by_xpath('\/\/button[@class = \"btn btn-info\" and @id = \"login-form-submit\"]').click()         time.sleep(3)         #   Open input Link         self.driver.get(self.__URL)         time.sleep(5)         self.soup = BeautifulSoup(self.driver.page_source, 'html.parser')         self.words_list = list()         self.input_form = self.driver.find_element_by_xpath('\/\/input[@class = \"form-control\" and @id = \"inputfield\"]')      def get_words(self):         boundaries = self.soup.find(attrs={'id': 'row1', 'style': \"top: 1px;\"})         for span in boundaries.find_all('span'):             self.words_list.append(span.text)      def input_words(self):         for word in self.words_list:             for symbol in word:                 self.input_form.send_keys(symbol)             self.input_form.send_keys(Keys.SPACE)      def close(self):         self.driver.quit()   with open('config.txt') as file:     conf = json.load(file)  monke = MonkeyWorker(HTML_SOURCE, conf[\"login\"], conf[\"password\"]) monke.get_words() monke.input_words() char = input() monke.close()<\/code><\/pre>\n<p>\u041c\u0435\u0442\u043e\u0434 <strong>input_words<\/strong> \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u0430\u043c \u0432 \u0441\u043b\u043e\u0432\u0435 \u0441 \u0446\u0435\u043b\u044c\u044e \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u0432\u043e\u0434\u043e\u043c \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u041f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0434\u0430\u043b\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u043c\u0435\u043d\u0442\u0430 \u0438 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u043f\u043e\u0441\u0442\u0430.<\/p>\n<h3>\u0412\u0441\u0442\u0440\u0435\u0447\u0430 \u0441 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442\u043e\u043c<\/h3>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u044f \u044f \u0437\u0430\u043c\u0435\u0442\u0438\u043b \u0447\u0442\u043e \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439, \u0438 \u0432\u043e\u0442 \u0432 \u0447\u0435\u043c \u0431\u044b\u043b\u0430 \u043f\u0440\u0438\u0447\u0438\u043d\u0430<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0430\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430. \u0418\u0437 \u043d\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0447\u0442\u043e \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a \u043d\u0430 &#171;\u0441\u0434\u0430\u0447\u0443 \u044d\u043a\u0437\u0430\u043c\u0435\u043d\u0430&#187;, \u0438 \u0447\u0442\u043e \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c \u043f\u043e\u0441\u043b\u0443\u0436\u0438\u043b \u0430\u043d\u043e\u043c\u0430\u043b\u044c\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c WPM. \u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u043e\u0431\u0445\u043e\u0434\u0430 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d \u0432 \u043a\u043e\u043d\u0446\u0435 \u043f\u043e\u0441\u0442\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 <strong>Start Test<\/strong> \u0441\u0440\u0430\u0437\u0443 \u043f\u043e\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u0435\u0440\u0432\u0430\u044f \u0438\u0437 \u043d\u0438\u0445 \u043f\u0440\u043e\u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0430 \u043d\u0438\u0436\u0435:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u043d\u0430\u0436\u0430\u0442\u044c \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0441\u0430\u043c\u044b\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c, \u0438 \u043a\u0430\u043a \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043e\u043d \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439. \u041f\u043e\u0441\u043b\u0435 \u043d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u043a\u043d\u043e\u043f\u043a\u0438 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u043a\u043b\u0438\u043a\u0430. \u0412 Selenium \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u043c:<\/p>\n<pre><code class=\"python\">driver.execute_script(\"$(arguments[0]).click();\", self.driver.find_element_by_xpath('\/\/button[@class = \\                                     \"btn btn-large btn-info\" and @id = \"start-btn\"]'))<\/code><\/pre>\n<p>\u0411\u044b\u043b\u043e \u0432\u043f\u043e\u043b\u043d\u0435 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e, \u0447\u0442\u043e \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u0430 \u043c\u0435\u043d\u044f \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0431\u0438\u0440\u0430\u0442\u044c. \u041c\u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u043b\u043e\u0432. \u041c\u043e\u044f \u0438\u0434\u0435\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u043b\u0430\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u044b\u0441\u043a\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0438 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>requests<\/code> . \u0412\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c: <\/p>\n<pre><code class=\"python\">IMAGE_URL = str(self.soup.find('div', attrs={\"id\": \"word-img\"}).find_all('img')[0]['src']) image = requests.get(IMAGE_URL).content()<\/code><\/pre>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u043f\u0440\u0438 \u043f\u043e\u043f\u044b\u0442\u043a\u0435 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0431\u0435\u043b\u044b\u0439 \u0444\u043e\u043d. \u042f \u043d\u0435 \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u0447\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043e\u0431\u0443\u0441\u043b\u043e\u0432\u043b\u0435\u043d\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u0435 \u0431\u044b\u043b\u043e \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u0435 \u043d\u0435 \u043f\u043e\u043c\u043e\u0436\u0435\u0442. \u041f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u043d\u044b\u043c \u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c \u043c\u043d\u0435 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430 Selenium. \u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0432\u0441\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430\u043c\u0438 ChromeDriver. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u044d\u0442\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c:<\/p>\n<pre><code class=\"python\">def img_getter():     \"\"\"     Function to get image by opening new tab. Doesn't work because 10fastfingers have smart text genearator     :return:     \"\"\"     #   Getting image     IMAGE_URL = str(self.soup.find('div', attrs={\"id\": \"word-img\"}).find_all('img')[0]['src'])     self.driver.execute_script(\"window.open('');\")     self.driver.switch_to.window(self.driver.window_handles[1])     self.driver.get(IMAGE_URL)     #   Convert selenium screenshot to Image     self.image = Image.open(io.BytesIO(self.driver.get_screenshot_as_png()))    # Creating Image     #   self.driver.close()     self.driver.switch_to.window(self.driver.window_handles[0])      self.image.show()     self.__image_preprocessing()<\/code><\/pre>\n<p>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0430 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e. \u0415\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0432 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0431\u0435\u043b\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043b \u0432 \u0441\u0435\u0431\u0435 \u043e\u0431\u0448\u0438\u0440\u043d\u0443\u044e \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0447\u0435\u0440\u043d\u043e\u0439 \u0437\u0430\u043b\u0438\u0432\u043a\u0438:<\/p>\n<figure class=\"full-width\"><figcaption>\u041c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0435\u043b\u044b\u0439 \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a<\/figcaption><\/figure>\n<pre><code>def __old_image_preprocessing(self):     image = self.image.convert('RGB')     numpy_image = np.array(image)     original = numpy_image.copy()     image = image.filter(ImageFilter.MedianFilter(3))      # Find X,Y coordinates of all white pixels     whiteY, whiteX = np.where(np.all(numpy_image == [255, 255, 255], axis=2))     top, bottom = whiteY[0], whiteY[-1]     left, right = whiteX[0], whiteX[-1]      # Crop white solid     ROI = original[top:bottom, left:right]     final = Image.fromarray(ROI)     final.show()     self.image = final<\/code><\/pre>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u044b\u0439 \u0432\u0437\u0433\u043b\u044f\u0434 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u043e\u0434\u043d\u0430\u043a\u043e \u0432\u0441\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0435 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e. \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u043c\u0438! <\/p>\n<figure class=\"full-width\"><figcaption>\u0422\u043e \u0447\u0442\u043e \u043c\u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0432\u043e\u0434\u0438\u0442\u044c<\/figcaption><\/figure>\n<figure class=\"full-width\"><figcaption>\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u044f \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435<\/figcaption><\/figure>\n<p>\u041f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u043f\u043e\u043b\u0443\u0447\u0430\u043b\u043e\u0441\u044c \u044f \u0442\u0430\u043a \u0438 \u043d\u0435 \u043f\u043e\u043d\u044f\u043b, \u043d\u043e \u0443\u0431\u0435\u0434\u0438\u0432\u0448\u0438\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u043e \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u044f \u043d\u0430\u0447\u0430\u043b \u0438\u0441\u043a\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431. \u0418\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0445\u043e\u0434. \u042f \u0437\u0430\u043c\u0435\u0442\u0438\u043b, \u0447\u0442\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 \u0441\u0430\u0439\u0442\u0435 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u043e \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u0447\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u0447\u0442\u043e \u044f \u043c\u043e\u0433\u0443 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u043e\u043b\u044f, \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0432 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0432\u043a\u043b\u0430\u0434\u043a\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043a\u0440\u043e\u043f \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<pre><code class=\"python\">def getting_image(self):     element = self.driver.find_element_by_xpath('\/\/div[@id = \"word-img\"]')     location = element.location_once_scrolled_into_view     size = element.size     area = (location[\"x\"] * 2, location[\"y\"] * 2, location[\"x\"] * 2 + size[\"width\"] * 2,             location[\"y\"] * 2 + size[\"height\"] * 2)      self.image = self.driver.get_screenshot_as_png()     self.image = Image.open(io.BytesIO(self.image))     self.image = self.image.crop(area)     self.__image_preprocessing()      def __image_preprocessing(self):     \"\"\"     Apply SHARPEN filter to make words detecting little better     :return:     \"\"\"     self.image.show()     self.image = self.image.filter(ImageFilter.SHARPEN)     self.image.show()     self.image = self.image.filter(ImageFilter.SHARPEN)     self.image.show()<\/code><\/pre>\n<p>\u0418 \u044d\u0442\u043e \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e! \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f OCR Tesseract \u0438 \u0434\u0435\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e. <\/p>\n<pre><code class=\"python\">import pytesseract as image_engine from pytesseract import Output  def get_words(self):      words = image_engine.image_to_data(self.image, lang=\"eng\", output_type=Output.DICT)     clean_words = list(filter(lambda x: x != '', words[\"text\"]))     self.words_list = clean_words<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0432 \u0434\u0438\u0441\u0442\u043e\u0440\u0441\u0438\u044e \u0441\u043b\u043e\u0432, \u043c\u043e\u0436\u043d\u043e \u043b\u0443\u0447\u0448\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c Tesseract, \u043c\u043e\u0436\u043d\u043e \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u043b\u043e\u0432 \u0447\u0435\u043c-\u0442\u043e \u0432 \u0434\u0443\u0445\u0435: <a href=\"https:\/\/github.com\/courao\/ocr.pytorch\" rel=\"noopener noreferrer nofollow\">https:\/\/github.com\/courao\/ocr.pytorch<\/a><\/p>\n<p>\u042f \u0436\u0435 \u0445\u043e\u0442\u0435\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418 \u043e\u043d \u043c\u0435\u043d\u044f \u043d\u0435 \u0440\u0430\u0437\u043e\u0447\u0430\u0440\u043e\u0432\u0430\u043b:<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0422\u0430\u043a \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b \u0441\u043f\u043e\u0441\u043e\u0431 \u043e\u0431\u043e\u0439\u0442\u0438 \u0430\u043d\u0442\u0438-\u0447\u0438\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043d\u0430 <a href=\"https:\/\/10fastfingers.com\/\" rel=\"noopener noreferrer nofollow\">https:\/\/10fastfingers.com\/<\/a>. \u041f\u043e\u043d\u044f\u0442\u043d\u043e\u0435 \u0434\u0435\u043b\u043e \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0432\u0441\u0435 \u043b\u0438\u0448\u044c \u0434\u043b\u044f \u0432\u0435\u0441\u0435\u043b\u044c\u044f \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0432\u0441\u043f\u043e\u043c\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Selenium. \u041d\u0430\u0434\u0435\u044e\u0441\u044c \u043c\u043e\u0439 \u043f\u043e\u0441\u0442 \u0412\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u0441\u044f. \u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/p>\n<p><em>\u0410\u043d\u0442\u0438-\u0447\u0438\u0442 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c<\/em><\/p>\n<pre><code class=\"python\">from selenium import webdriver from selenium.webdriver.common.keys import Keys import time from bs4 import BeautifulSoup from webdriver_manager.chrome import ChromeDriverManager import json import pytesseract as image_engine from pytesseract import Output from PIL import Image, ImageFilter import io import numpy as np  HTML_SOURCE = \"https:\/\/10fastfingers.com\/anticheat\"   class MonkeyWorker:     def __init__(self, url, login, password):         self.__URL = url         self.driver = webdriver.Chrome(ChromeDriverManager(version=\"92.0.4515.107\").install())         self.action =<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-393759","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393759","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=393759"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/393759\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=393759"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=393759"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=393759"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}