рдкрд╛рдпрдерди рдХреЗ рд╕рд╛рде рдХрд┐рд░рд╛рдпреЗ рдХреА рдХреАрдордд рд╕реЗ рдорд╛рд╕реНрдХреЛ рдЬрд┐рд▓реЛрдВ рдХреА рд░реИрдВрдХрд┐рдВрдЧ

рдЕрдм рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЬреАрд╡рди рдХреЗ рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЧрд╣рд░рд╛ рдФрд░ рдЧрд╣рд░рд╛ рдкреНрд░рд╡реЗрд╢ рдХрд░рддреА рд╣реИред рдФрд░ рд╢рд╛рдпрдж рдпрд╣ рдЕрдм рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж рдмрди рдЧрдпрд╛ред рдпрджрд┐ 5 рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдкреВрд░реЗ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдерд╛: C # рдЙрддрд╛рд░рдиреЗ (рдпрд╛ рдкреЗрди), рдПрдХреНрд╕реЗрд▓, рдореИрдЯрд▓реИрдм, рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд▓рд┐рдП, рдФрд░ рд╡рд╣рд╛рдВ рд▓рдЧрд╛рддрд╛рд░ "рдХреВрдж" рдХрд░реЗрдВ, рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдлрд╝, рд╕рддреНрдпрд╛рдкрд┐рдд рдФрд░ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░реЗрдВред рдЕрдм рдЕрдЬрдЧрд░, рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдФрд░ рдореЙрдбреНрдпреВрд▓ рдХреА рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ рдЗрди рд╕рднреА рдЙрдкрдХрд░рдгреЛрдВ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдПрд╕рдХреНрдпреВрдПрд▓ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ, "рдкрд╣рд╛рдбрд╝реЛрдВ рдХреЛ рд▓реБрдврд╝рдХрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ"ред

рддреЛ рдореИрдВ рдХреНрдпрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдореБрдЭреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдЕрдЬрдЧрд░ рдХреЛ рд╕реАрдЦрдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реБрдИред рдФрд░ рдХреБрдЫ рд╕реАрдЦрдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рдЕрднреНрдпрд╛рд╕ рд╣реИред рдФрд░ рдореБрдЭреЗ рд░рд┐рдпрд▓ рдПрд╕реНрдЯреЗрдЯ рдореЗрдВ рднреА рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдФрд░ рдореБрдЭреЗ рдореЙрд╕реНрдХреЛ рдореЗрдВ рдЕрдЪрд▓ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдорд╕реНрдпрд╛ рд╕рд╛рдордиреЗ рдЖрдИ: рдорд╛рд╕реНрдХреЛ рдЬрд┐рд▓реЛрдВ рдХреЛ рдФрд╕рдд рдУрдбрдиреБрд╖реНрдХрд╛ рдХреЗ рдХрд┐рд░рд╛рдпреЗ рдХреА рдФрд╕рдд рд▓рд╛рдЧрдд рд╕реЗ рд░реИрдВрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП? рдкрд┐рддрд╛, рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛, рдпрд╣рд╛рдБ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЬрд┐рдпреЛрд▓реЛрдХреЗрд╢рди рд╣реИ, рдФрд░ рд╕рд╛рдЗрдЯ рд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рдПрдХ рдорд╣рд╛рди рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдХрд╛рд░реНрдп рд╣реИред

рд╣реИрдмреЗ рдкрд░ рдЕрджреНрднреБрдд рд▓реЗрдЦреЛрдВ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░ (рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рдореИрдВ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝реВрдВрдЧрд╛), рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!

рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдЕрдЬрдЧрд░ рдХреЗ рдЕрдВрджрд░ рдореМрдЬреВрджрд╛ рд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реИ, рддрдХрдиреАрдХ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реИ - рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд░реЗрдВ рдФрд░ рдЖрдирдВрдж рдХреЗ рд╕рд╛рде рд╕рдордп рдмрд┐рддрд╛рдПрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рд▓рд╛рдн рдХреЗ рд╕рд╛рдеред

  1. рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рд╕рд┐рдпрд╛рди
  2. рдПрдХрд▓ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо
  3. рдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
  4. рдкрд░рд┐рдгрд╛рдо
  5. рдЬрд┐рдпреЛрдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛

рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рд╕рд┐рдпрд╛рди


рдорд╛рд░реНрдЪ 2020 рдХреЗ рдордзреНрдп рдореЗрдВ, рд╕рд┐рдпрд╛рди рдкрд░ рдореЙрд╕реНрдХреЛ рдореЗрдВ 1-рдХрдорд░реЗ рд╡рд╛рд▓реЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЛ рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рдЧрднрдЧ 9 рд╣рдЬрд╛рд░ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛, рд╕рд╛рдЗрдЯ рдХреБрдЫ рдкреЗрдЬ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИред рд╣рдо рдЬреНрдпреВрдкрд┐рдЯрд░-рдиреЛрдЯрдмреБрдХ 6.0.1, рдкрд╛рдпрдерди 3.7 рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рд╣рдо рд╕рд╛рдЗрдЯ рд╕реЗ рдбреЗрдЯрд╛ рдЕрдкрд▓реЛрдб рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВ ред

рддрд╛рдХрд┐ рд╕рд╛рдЗрдЯ рд╣рдореЗрдВ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рди рдХрд░реЗ, рд╣рдо рдЕрдиреБрд░реЛрдзреЛрдВ рдореЗрдВ рджреЗрд░реА рдЬреЛрдбрд╝рдХрд░ рдФрд░ рдПрдХ рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рдХреЗ рдЦреБрдж рдХреЛ рдПрдХ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рдЪреНрдЫрдиреНрди рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╕рд╛рдЗрдЯ рдХреЗ рдХрд┐рдирд╛рд░реЗ рд╕реЗ рд╣рдо рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реНрдорд╛рд░реНрдЯ рд╡реНрдпрдХреНрддрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдВ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░ рд░рд╣рд╛ рд╣реИред рд╣рд░ рдмрд╛рд░ рд╕рд╛рдЗрдЯ рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЕрдиреНрдпрдерд╛ рд╣рдо рдЕрдЪрд╛рдирдХ рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рд╣реИрдВред рдЖрдк рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддреГрдд рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдВ: рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реЗрдм рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ ред

рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдФрд░ рд▓реЙрдЧрд┐рдВрдЧ рдХреА рдЧрддрд┐ рдХрд╛ рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рднреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рд╕реЗрдЯрд┐рдВрдЧ рд╕реНрддрд░ = logging.INFO рдЖрдкрдХреЛ рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЖрдк рдХрд┐рд╕реА рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЙрдЧ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИред

рдХреЛрдб
def timer(f):
    def wrap_timer(*args, **kwargs):
        start = time.time()
        result = f(*args, **kwargs)
        delta = time.time() - start
        print (f'   {f.__name__}  {delta} ')
        return result
    return wrap_timer

def log(f):
    def wrap_log(*args, **kwargs):
        logging.info(f"  {f.__doc__}")
        result = f(*args, **kwargs)
        logging.info(f": {result}")
        return result
    return wrap_log
logging.basicConfig(level=logging.INFO)

@timer
@log
def requests_site(N):
    headers = ({'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Safari/605.1.15'})
    pages = [106 + i for i in range(N)]
    n = 0
    for i in pages:
        s = f"https://www.cian.ru/cat.php?deal_type=rent&engine_version=2&page={i}&offer_type=flat&region=1&room1=1&type=-2"
        response = requests.get(s, headers = headers)
        if response.status_code == 200:
            name = f'sheets/sheet_{i}.txt'
            with open(name, 'w') as f:
                f.write(response.text)
            n += 1
            logging.info(f"  {i}")
        else:
            print(f"  {i}   response.status_code = {response.status_code}")
        time.sleep(np.random.randint(7,13))
    return f"  {n} "
requests_site(300)


рдПрдХрд▓ рдбреЗрдЯрд╛ рдлреНрд░реЗрдо


рдкреГрд╖реНрдареЛрдВ рд╕реНрдХреНрд░реИрдк рдХреЗ рд▓рд┐рдП, рдЪреБрдиреЗрдВ BeautifulSoup рдФрд░ lxml ред рд╣рдо "рд╕реБрдВрджрд░ рд╕реВрдк" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЗрд╕рдХреЗ рд╢рд╛рдВрдд рдирд╛рдо рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ lxml рддреЗрдЬ рд╣реИред

рдЖрдк рдЗрд╕реЗ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдУрдПрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЙрди рдПрдХреНрд╕рдЯреЗрдВрд╢рдиреЛрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реИ рдФрд░ рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рдирд╛ред рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдлрд╛рдЗрд▓реЛрдВ рдХреА рд╕рд╣реА рд╕рдВрдЦреНрдпрд╛ рдФрд░ рдЙрдирдХреЗ рд╕рдЯреАрдХ рдирд╛рдореЛрдВ рдХреЛ рдЬрд╛рдирддреЗ рд╣реИрдВред рдЬрдм рддрдХ рд╣рдо tqdm рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдЬрд╛рд╡рдЯ рдирд╣реАрдВ рдЬреЛрдбрд╝рддреЗ

рдХреЛрдб

from bs4 import BeautifulSoup
import re
import pandas as pd
from dateutil.parser import parse
from datetime import datetime, date, time

def read_file(filename):
    with open(filename) as input_file:
        text = input_file.read()
    return text

import tqdm

site_texts = []
pages = [1 + i for i in range(309)]
        
for i in tqdm.tqdm(pages):
    name = f'sheets/sheet_{i}.txt'
    site_texts.append(read_file(name))
    
print(f" {len(site_texts)} .")

def parse_tag(tag, tag_value, item):
    key = tag
    value = "None"
    if item.find('div', {'class': tag_value}):
        if key == 'link':
            value = item.find('div', {'class': tag_value}).find('a').get('href')
        elif (key == 'price' or key == 'price_meter'):
            value = parse_digits(item.find('div', {'class': tag_value}).text, key)
        elif key == 'pub_datetime':
            value = parse_date(item.find('div', {'class': tag_value}).text)
        else:
            value = item.find('div', {'class': tag_value}).text
    return key, value


def parse_digits(string, type_digit):
    digit = 0
    try:
        if type_digit == 'flats_counts':
            digit = int(re.sub(r" ", "", string[:string.find("")]))
        elif type_digit == 'price':
            digit = re.sub(r" ", "", re.sub(r"тВ╜", "", string))
        elif type_digit == 'price_meter':
            digit = re.sub(r" ", "", re.sub(r"тВ╜/┬▓", "", string))
    except:
        return -1
    return digit

def parse_date(string):
    now = datetime.strptime("15.03.20 00:00", "%d.%m.%y %H:%M")
    s = string
    if string.find('') >= 0:
        s = "{} {}".format(now.day, now.strftime("%b"))
        s = string.replace('', s)
    elif string.find('') >= 0:
        s = "{} {}".format(now.day - 1, now.strftime("%b"))
        s = string.replace('',s) 
    if (s.find('') > 0):
        s = s.replace('','mar')
    if (s.find('') > 0):
        s = s.replace('','feb')
    if (s.find('') > 0):
        s = s.replace('','jan')
    return parse(s).strftime('%Y-%m-%d %H:%M:%S')
    
    
def parse_text(text, index):
    
    tag_table = '_93444fe79c--wrapper--E9jWb'
    tag_items = ['_93444fe79c--card--_yguQ', '_93444fe79c--card--_yguQ']
    tag_flats_counts = '_93444fe79c--totalOffers--22-FL'
    tags = {
        'link':('c6e8ba5398--info-section--Sfnx- c6e8ba5398--main-info--oWcMk','undefined c6e8ba5398--main-info--oWcMk'),
        'desc': ('c6e8ba5398--title--2CW78','c6e8ba5398--single_title--22TGT', 'c6e8ba5398--subtitle--UTwbQ'),
        'price': ('c6e8ba5398--header--1df-X', 'c6e8ba5398--header--1dF9r'),
        'price_meter': 'c6e8ba5398--term--3kvtJ',
        'metro': 'c6e8ba5398--underground-name--1efZ3',
        'pub_datetime': 'c6e8ba5398--absolute--9uFLj',
        'address': 'c6e8ba5398--address-links--1tfGW',
        'square': ''
    }
    
    res = []
    flats_counts = 0
    soup = BeautifulSoup(text)  
    if soup.find('div', {'class': tag_flats_counts}):
        flats_counts = parse_digits(soup.find('div', {'class': tag_flats_counts}).text, 'flats_counts')
   
    flats_list = soup.find('div', {'class': tag_table}) 
    if flats_list:
        items = flats_list.find_all('div', {'class': tag_items})         
        for i, item in enumerate(items):
            
            d = {'index': index}
            index += 1
            for tag in tags.keys():
                tag_value = tags[tag]
                key, value = parse_tag(tag, tag_value, item)
                d[key] = value
            results[index] = d
        
    return flats_counts, index

from IPython.display import clear_output

sum_flats = 0
index = 0
results = {}
for i, text in enumerate(site_texts):
    flats_counts, index = parse_text(text, index)    
    sum_flats = len(results)
    clear_output(wait=True)
    print(f"  {i + 1} flats = {flats_counts},   {sum_flats} ")
print(f" sum_flats ({sum_flats}) = flats_counts({flats_counts})")


рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдпрд╣ рдереА рдХрд┐ рдкреГрд╖реНрда рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рджрд░реНрд╢рд╛рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛ рдФрд░ рдЕрдиреБрд░реЛрдз рдкрд░ рдкрд╛рдП рдЧрдП рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдХреБрд▓ рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рдкреГрд╖реНрда рд╕реЗ рдкреГрд╖реНрда рдкрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЫрд╛рдВрдЯреЗ рдЧрдП 5,402 рд╡рд╛рдХреНрдп 5343 рд╕реЗ 5402 рддрдХ рдХреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреБрд░реЛрдз рдХреА рдкреГрд╖реНрда рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рдзреАрд░реЗ-рдзреАрд░реЗ рдХрдо рд╣реЛ рд░рд╣реЗ рд╣реИрдВ (рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рд┐рдд рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдирд╣реАрдВ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рд╛рдЗрдЯ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд┐рдП рдЧрдП рдкреГрд╖реНрдареЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдирд╛ рд╕рдВрднрд╡ рдерд╛ред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рдЗрдЯ рдкрд░ рдХреЗрд╡рд▓ 54 рдкреГрд╖реНрдареЛрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХреА рдЧрдИ рдереА, рд▓реЗрдХрд┐рди рд╣рдо рдХреБрд▓ 8640 рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреБрд░рд╛рдиреЗ рд╡рд┐рдЬреНрдЮрд╛рдкрдиреЛрдВ рдХреЗ рд╕рд╛рде 309 рдкреГрд╖реНрдареЛрдВ рдХреЛ рдЙрддрд╛рд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред

рдЗрд╕ рддрдереНрдп рдХреА рдПрдХ рдЬрд╛рдВрдЪ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣ рдЬрд╛рдПрдЧреАред

рдбрд╛рдЯрд╛ рдлреНрд░реЗрдо рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ


рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 8640 рдСрдлрд╝рд░ рдкрд░ рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХрд▓ рдбреЗрдЯрд╛ рдлрд╝реНрд░реЗрдо рд╣реИред рд╣рдо рдЬрд┐рд▓реЛрдВ рдореЗрдВ рдФрд╕рдд рдФрд░ рдФрд╕рдд рдХреАрдорддреЛрдВ рдХрд╛ рдПрдХ рд╕рддрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ, рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдФрд╕рдд рдХрд┐рд░рд╛рдпреЗ рдХреА рдХреАрдордд рдФрд░ рдЬрд┐рд▓реЗ рдореЗрдВ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреА рдХреАрдордд рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ "рдФрд╕рдд"ред

рд╣рдо рдЕрдкрдиреЗ рдЕрдзреНрдпрдпрди рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреНрдпрддрд╛рдУрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ:

  • рджреЛрд╣рд░рд╛рд╡ рдХреА рдХрдореА: рд╕рднреА рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рд╣реИрдВред рдкрд╣рд▓реЗ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдкрддреЗ рдФрд░ рдХреНрд╡рд╛рдбрд░реЗрдЪрд░ рдкрд░ рджреЛрд╣рд░рд╛рдП рдЧрдП рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЛ рдЦрддреНрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рдХреНрд╡рд╛рдбрд░реЗрдЪрд░ рдпрд╛ рдкрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдорд╛рдирддреЗ рд╣реИрдВред
  • тАФ .
    тАФ ┬л┬╗ ? ( ) , , , , . , , , . ┬л┬╗ : . ┬л┬╗ ( ) , .

рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:

price_per_month - rubles
square -
okrug рдХреНрд╖реЗрддреНрд░ - рдЬрд┐рд▓реЗ рдореЗрдВ рдорд╛рд╕рд┐рдХ рдореВрд▓реНрдп рдХрд┐рд░рд╛рдпрд╛ , рдЗрд╕ рдЕрдзреНрдпрдпрди рдореЗрдВ рдкреВрд░рд╛ рдкрддрд╛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ
price_meter - рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдХрд┐рд░рд╛рдпрд╛ рдореВрд▓реНрдп

рдХреЛрдб
df['price_per_month'] = df['price'].str.strip('/.').astype(int) #price_int
new_desc = df["desc"].str.split(",", n = 3, expand = True) 
df["square"]= new_desc[1].str.strip(' ┬▓').astype(int)
df["floor"]= new_desc[2]
new_address = df['address'].str.split(',', n = 3, expand = True)
df['okrug'] = new_address[1].str.strip(" ")
df['price_per_meter'] = (df['price_per_month'] / df['square']).round(2) #price_std

df = df.drop(['index','metro', 'price_meter','link', 'price','desc','address','pub_datetime','floor'], axis='columns')


рдЕрдм рд╣рдо рд╢реЗрдбреНрдпреВрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЙрддреНрд╕рд░реНрдЬрди рдХреА "рджреЗрдЦрднрд╛рд▓" рдХрд░реЗрдВрдЧреЗред рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рддреАрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВ: matplotlib , seaborn рдФрд░ plotly ред

рдбреЗрдЯрд╛ рдХрд╛ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо ред Matplotlib рдЖрдкрдХреЛ рдЙрди рдбреЗрдЯрд╛ рд╕рдореВрд╣реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА рдЪрд╛рд░реНрдЯ рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реА рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдЗрд╕рдХреА рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЖрдВрдХрдбрд╝рд╛, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдорд┐рдЯрд┐рдиреЛ рдореЗрдВ рдХреЗрд╡рд▓ 1 рдкреНрд░рд╕реНрддрд╛рд╡ рдФрд╕рдд рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдЧреБрдгрд╛рддреНрдордХ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рджрдХреНрд╖рд┐рдгреА рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдУрдХреНрд░рдЧ рдореЗрдВ рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рддрд╕реНрд╡реАрд░: 1000 рд░реВрдмрд▓ рд╕реЗ рдиреАрдЪреЗ рдХреЗ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдСрдлрд╝рд░ рдХрд╛ рдмрд╣реБрдордд (500 рд╕реЗ рдЕрдзрд┐рдХ рдЗрдХрд╛рдЗрдпрд╛рдВ), рдФрд░ 1700 рд░реВрдмрд▓ рдкреНрд░рддрд┐ рд╡рд░реНрдЧ рдореАрдЯрд░ рдХреА рджрд░ рд╕реЗ рдСрдлрд░ (рд▓рдЧрднрдЧ 300 рдпреВрдирд┐рдЯ) рдореЗрдВ рд╡реГрджреНрдзрд┐ред рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ - рдЗрди рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕рдВрдХреЗрддрдХреЛрдВ рдореЗрдВ рдЕрдлрд╡рд╛рд╣ред

рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рдПрдХ рдкрдВрдХреНрддрд┐ рд╕рдореВрд╣рд┐рдд рдбреЗрдЯрд╛ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рд╡рд╣рд╛рдВ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рджреЗрддреА рд╣реИ:

hists = df['price_per_meter'].hist(by=df['okrug'], figsize=(16, 14), color = "tab:blue", grid = True)



рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдмрд┐рдЦрд░рд╛рд╡ ред рдиреАрдЪреЗ рд╕рднреА рддреАрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░реЗрдЦрд╛рдВрдХрди рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реАрдмреЙрд░реНрди рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рдФрд░ рдЙрдЬреНрдЬреНрд╡рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╛рдЙрд╕ рдХреЛ рдШреБрдорд╛рддреЗ рд╕рдордп рдЖрдк рддреБрд░рдВрдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВ , рдЬреЛ рдХрд┐ "рдЖрдЙрдЯрд▓реЗрд░" рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╣рдЯрд╛ рджреЗрдВрдЧреЗред

matplotlib

fig, axes = plt.subplots(nrows=4,ncols=3,figsize=(15,15))

for i, (name, group) in enumerate(df_copy.groupby('okrug')):
    axes = axes.flatten()
    axes[i].scatter(group['price_per_meter'],group['square'], color ='blue')
    axes[i].set_title(name)
    axes[i].set(xlabel='  1 ..', ylabel=', 2')
    #axes[i].label_outer()
    
fig.tight_layout()  



seaboarn

sns.pairplot(vars=["price_per_meter","square"], data=df_copy, hue="okrug", height=5)



plotly

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд╣рд╛рдБ рдПрдХ рдЬрд┐рд▓реЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЙрджрд╛рд╣рд░рдг рд╣реЛрдЧрд╛ред

import plotly.express as px

for i, (name, group) in enumerate(df_copy.groupby('okrug')):
    fig = px.scatter(group, x="price_per_meter", y="square", facet_col="okrug",
                 width=400, height=400)
    fig.update_layout(
        margin=dict(l=20, r=20, t=20, b=20),
        paper_bgcolor="LightSteelBlue",
    )
    fig.show()



рдкрд░рд┐рдгрд╛рдо


рдЗрд╕рд▓рд┐рдП, рдбреЗрдЯрд╛ рдХреЛ рд╕рд╛рдл рдХрд░рддреЗ рд╣реБрдП, рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рдЙрддреНрд╕рд░реНрдЬрди рдХреЛ рд╣рдЯрд╛рддреЗ рд╣реБрдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 8602 "рд╕реНрд╡рдЪреНрдЫ" рдСрдлрд░ рд╣реИрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдореБрдЦреНрдп рдЖрдВрдХрдбрд╝реЛрдВ рдХреА рдЧрдгрдирд╛: рдФрд╕рдд, рдордВрдЭрд▓рд╛, рдорд╛рдирдХ рд╡рд┐рдЪрд▓рди, рд╣рдо рдХрдо рд╣реЛ рдЬрд╛рддреА рд╣реИ рдПрдХ рдФрд╕рдд рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдФрд╕рдд рдХрд┐рд░рд╛рдП рдкрд░ рд▓реЗрдиреЗ рдХреА рд▓рд╛рдЧрдд рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рд╕реНрдХреЛ рдЬрд┐рд▓реЛрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд░реНрдЬрд╝рд╛ рдкреНрд░рд╛рдкреНрдд:



рддреБрдореНрд╣реЗрдВ рдкрддрд╛ рд╣реИ, рдХреА рддреБрд▓рдирд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрдВрджрд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдФрд╕рдд рдФрд░ рдЬрд┐рд▓реЗ рдореЗрдВ рдордВрдЭрд▓рд╛ рдХреАрдорддреЛрдВ рдХреЗ рд▓рд┐рдП:



рдХреНрдпрд╛ рдХрд┐рд╕реА рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд┐рд░рд╛рдпреЗ рдХреЗ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдХреЗ рдкреНрд░рд╕реНрддрд╛рд╡реЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХрд╣реЗрдВ:

  • , , , . тАЬтАЭ , ( ). , , , , , , тАЬтАЭ . , , .
  • . . ┬л ┬╗. , ┬л┬╗ тАФ . . . , , , , , - , , . . .
  • , тАЬтАЭ , . , , тАФ .


рдПрдХ рдЕрд▓рдЧ, рдЕрд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░реВрдк рд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд╕реБрдВрджрд░ рдЕрдзреНрдпрд╛рдп рдЬрд┐рдпреЛрдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИ, рдЬреЛ рдорд╛рдирдЪрд┐рддреНрд░ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╣рдорд╛рд░реЗ рдбреЗрдЯрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рд╣реИред рддреБрдо рдмрд╣реБрдд рд╡рд┐рд╕реНрддрд╛рд░ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдирд┐рдореНрди рд▓реЗрдЦ рдореЗрдВ:
рдореЙрд╕реНрдХреЛ рдореЗрдВ рдПрдХ Jupyter рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдПрдХ рдирдХреНрд╢реЗ рдкрд░ рдЪреБрдирд╛рд╡ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рджреГрд╢реНрдп
рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдЯреЛрдЧреНрд░рд╛рдлрд┐рдХ рдЕрдиреБрдорд╛рдиреЛрдВ рдкрд░ Likbez
OpenStreetMap рдЫрд╡рд┐рдпреЛрдВ geodata рдХреЗ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, OpenStreetMap рд╣реИ рд╣рдорд╛рд░реЗ рд╕рдм рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╕рд╛рдзрди: geopandas , cartoframes (рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╣реИ рдорд░ рдЧрдпрд╛?) рдФрд░ рдлреЛрд▓рд┐рдпрдо , рдЬрд┐рд╕рдХрд╛ рд╣рдо рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдпрд╣рд╛рдВ рдПрдХ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдорд╛рдирдЪрд┐рддреНрд░ рдкрд░ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛ред



рд▓реЗрдЦ рдкрд░ рдХрд╛рдо рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА:


рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реА рддрд░рд╣ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗред

рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕реНрд░реЛрдд рдФрд░ рдбреЗрдЯрд╛рд╕реЗрдЯ рдпрд╣рд╛рдБ github рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ ред

All Articles