Jelajahi Sumber

БД ссылок краулера

Pavel Yakushenko 3 tahun lalu
induk
melakukan
da692bc3e3
3 mengubah file dengan 759 tambahan dan 62 penghapusan
  1. TEMPAT SAMPAH
      all.db
  2. 55 62
      crauler.py
  3. 704 0
      habr.html

TEMPAT SAMPAH
all.db


+ 55 - 62
crauler.py

@@ -6,11 +6,12 @@ activate_this = os.path.join(virtual_env, 'bin/activate_this.py')
 exec(open(activate_this).read(), dict(__file__=activate_this))
 """
 
-import os, urllib.parse, traceback
+import os, traceback
 from bs4 import BeautifulSoup
 import random, time, datetime
 import requests
 from requests.exceptions import ProxyError
+from urllib.parse import urlparse
 
 #декларативное определение
 from sqlalchemy import Column, Integer, String, Text, create_engine
@@ -64,26 +65,30 @@ out_s = ""
 basedir = os.path.abspath(os.path.dirname(__file__))
 SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'all.db')
 engine = create_engine(SQLALCHEMY_DATABASE_URI, pool_pre_ping=True)
-
-
 Base = declarative_base()
+
+# класс БД собранной информации
 class Links(Base):
     __tablename__ = 'links'
     id = Column(Integer, primary_key=True, autoincrement=True)
+    donor = Column(String(255))
     title = Column(String(512))
     href = Column(String(512))
-    donor = Column(String(255))
-    donor_link_id = Column(Integer) #внутренний идентификатор для донора, https://habr.com/ru/company/skillfactory/blog/578014/ -> 578014
     parse_date = Column(Integer)
+    html = Column(Text)
     text = Column(Text)
+    level = Column(Integer) # уровень вложенности ссылки от корня сайта
+    status = Column(Integer) # 0 - не загружена,  1 - загружена, ключевика нет; 2 - ключевик есть, уведомление не отправлено; 3 - уведомление не отправлено
 
-    def __init__(self, title, href, donor, donor_link_id, parse_date, text):
+    def __init__(self, donor, title, href, parse_date, html, text, level, status):
+        self.donor = donor
         self.title = title
         self.href = href
-        self.donor = donor
-        self.donor_link_id = donor_link_id
         self.parse_date = parse_date
+        self.html = html
         self.text = text
+        self.level = level
+        self.status = status
 
     def __repr__(self):
         return "<Link('%s', '%s')>" % (self.title, self.href)
@@ -114,44 +119,39 @@ Session = sessionmaker(bind=engine)
 sqllite_session = Session()
 
 
-#"""
-#формируем запрос
-user_agent = random.choice(user_agents)
-url = "https://habr.com/ru/all/"
-referer = "https://habr.com/ru/all/"
-
-headers = {
-        "Host": str("habr.com"),
-        'User-Agent': str(user_agent),
-        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
-        'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
-        'Accept-Encoding': 'gzip, deflate, br',
-        'Referer': str(referer),
-        'Upgrade-Insecure-Requests': '1',
-        'Connection': 'keep-alive'}
-
-
-response = requests.get(url, headers=headers)
-post_html = response.text
-
-with open(os.path.join(basedir, 'habr.html'), 'w', encoding="utf-8") as f:
-    f.write(post_html)
-
-#Парсим ссылки habr.com
-soup = BeautifulSoup(post_html, "lxml")
-vacancies = soup.find_all('div', {'class': 'tm-article-snippet'})
-for vacancy in vacancies:
-    try:
-        link_title = str(vacancy.find('h2', {'class': 'tm-article-snippet__title_h2'}).text).strip()
+for donor in donors:
+    print("Парсим ", donor)
+    #формируем запрос
+    user_agent = random.choice(user_agents)
+    donor_parsed = urlparse(donor)
+    
+    headers = {
+            "Host": str(donor_parsed.hostname),
+            'User-Agent': str(user_agent),
+            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
+            'Accept-Language': 'ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3',
+            'Accept-Encoding': 'gzip, deflate, br',
+            'Referer': str(donor),
+            'Upgrade-Insecure-Requests': '1',
+            'Connection': 'keep-alive'}
+
+
+    response = requests.get(donor, headers=headers)
+    post_html = response.text
+
+    with open(os.path.join(basedir, 'habr.html'), 'w', encoding="utf-8") as f:
+        f.write(post_html)
+
+    #Парсим ссылки habr.com
+    soup = BeautifulSoup(post_html, "lxml")
+    all_links = soup.find_all('a')
+    for link in all_links:
+        print(link)
+        """
+        link_parsed = 
         link_href = str(vacancy.find('a', {'class': 'tm-article-snippet__title-link'}).get('href')).strip()
         link_href = "https://habr.com" + link_href
 
-        #donor_link_id - предпоследнее число из link_href
-        donor_link_ids = link_href.split("/")
-        donor_link_id = donor_link_ids[len(donor_link_ids)-2]
-
-        out_s += str(link_title) + "<br>"
-        out_s += str(link_href + " :: " + str(donor_link_id)) + "<br>"
 
         #уникальность ссылки
         out_s += "Проверяем уникальность\n" + "<br>"
@@ -170,24 +170,17 @@ for vacancy in vacancies:
             sqllite_session.add(new_link)
         else:
             out_s += "В базе ссылка есть" + "<br>"
-
-        out_s += "<br>"
-        status = 'Ok'
-
-    except Exception as e:
-        out_s += str(traceback.format_exc())
-        status = str(traceback.format_exc())
-
-new_log = Log(
-    action = "parse", 
-    status = status, 
-    time = int(time.time()),
-    donor = 'habr.ru', 
-    )
-sqllite_session.add(new_log)
-
-sqllite_session.commit()
-out_s += "<br>success"
-b = out_s.encode('utf-8')
+        """
+
+    """
+    new_log = Log(
+        action = "parse", 
+        status = status, 
+        time = int(time.time()),
+        donor = 'habr.ru', 
+        )
+    sqllite_session.add(new_log)
+    """
+    sqllite_session.commit()
 
 

+ 704 - 0
habr.html

@@ -0,0 +1,704 @@
+<!DOCTYPE html>
+<html lang='en'>
+<head>
+<meta charset='UTF-8'>
+<meta content='width=device-width, initial-scale=1' name='viewport'>
+<script src='/assets/html5.js' type='text/javascript'></script>
+<link href="/assets/main_2-b3fe0fd7afb0e5ed82ce5fcf0154ee6038df1c35ed098d7586446a8c719652dd.css" media="all" rel="stylesheet" />
+<link href="/assets/facebox-3fa68ac8a58e0381c960ebbb77ed418cf257aec7d82b8382ace0fc18c0b02947.css" media="all" rel="stylesheet" />
+<link href="/assets/style2-aa3aec01307adcbcfa6ac749171fc9484dd769546e7f49987ad5677963d6d08e.css" media="all" rel="stylesheet" />
+<link href='https://microformats.org/profile/hcalendar' rel='profile'>
+<link href='https://microformats.org/profile/hcard' rel='profile'>
+<link href='/favicon.ico' rel='shortcut icon'>
+<link href='/favicon.ico' rel='icon'>
+<script src="/assets/application-0d53042e3b090fc73e0777990a7331548a0e0d576857f684df5682bb6b2c4e4b.js"></script>
+<script src="https://vkontakte.ru/js/api/openapi.js"></script>
+
+<meta content="authenticity_token" name="csrf-param" />
+<meta content="cVWxCGR1kgtNo7gYb5RBc83epweaPykvF37EMcbgRp4=" name="csrf-token" />
+<meta content='' name='description'>
+<meta content='' name='keywords'>
+<meta content='' http-equiv='Refresh'>
+<meta content='ru' http-equiv='Content-Language'>
+<meta content='3f755deafd202b07' name='yandex-verification'>
+<meta content='article' name='og:type'>
+<meta content='it-events.com' name='og:site_name'>
+<meta content='100004779883759' name='fb:admins'>
+<!-- Yandex.Metrika counter -->
+<script>
+  (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
+    m[i].l=1*new Date();k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
+    (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
+  
+    ym(49985536, "init", {
+      clickmap:true,
+      trackLinks:true,
+      accurateTrackBounce:true
+    });
+</script>
+<noscript>
+<div>
+<img alt='' src='https://mc.yandex.ru/watch/49985536' style='position:absolute; left:-9999px;'>
+</div>
+</noscript>
+<!-- /Yandex.Metrika counter -->
+<script async='' src='https://www.googletagmanager.com/gtag/js?id=UA-122843848-1'></script>
+<script>
+  window.dataLayer = window.dataLayer || [];
+  function gtag(){dataLayer.push(arguments);}
+  gtag('js', new Date());
+  
+  gtag('config', 'UA-122843848-1');
+</script>
+
+<title></title>
+</head>
+<body class='body'>
+<header class='header js-header'>
+<div class='container'>
+<div class='row'>
+<div class='col-8 col-lg-7'>
+<a class='header__logo' href='http://it-events.com'></a>
+<ul class='header-navigation'>
+<li class='header-navigation__item header-navigation__item_active'>
+<a class='header-navigation__link' href='http://it-events.com'>
+IT-Events
+</a>
+</li>
+</ul>
+</div>
+<div class='col-4 col-lg-5'>
+<script>
+  var i18n = {}
+  i18n.login_string = "";
+  i18n.authorized_event = false;
+</script>
+<script src="/assets/loginform-31681f7fe563f947b13fe3fbd49b0fab6168c7f3c4e0f48251cc2d1328fddac2.js"></script>
+<div class='header__menu hidden-md-down' id='profileControls'>
+<a class="header__item" href="/en">EN</a>
+<div class='header__item' id='edit-profile-button' style='display:none'>
+<a class='button button_text_pink' href='/users/edit'>
+<i class='button__icon'></i>
+<span id='logged-in-string'>
+Мой профиль
+</span>
+</a>
+</div>
+<div id='logout-button' style='display:none'>
+<a class="header__item" data-remote="true" href="/logout" title="Выйти из системы">Выход</a>
+</div>
+<div class='header__item' id='login-button' style=''>
+<a class='button button_text_pink' href='#' rel='facebox' title='Войти в систему'>
+<i class='button__icon'></i>
+Войти
+</a>
+</div>
+<div id='register-button' style=''>
+<a class="header__item" href="/users/sign_up" title="Зарегистрироваться в системе">Регистрация</a>
+</div>
+</div>
+<div class='header__menu hidden-lg-up'>
+<div class='header__burger' onclick="var t = document.querySelector('.js-header'); t.classList.contains('header_menu') ? t.classList.remove('header_menu') : t.classList.add('header_menu')"></div>
+<div class='header__big'>
+<a class="header__item" href="/en">EN</a>
+<div class='header__item' style='display:none'>
+<a class='button button_text_pink' href='/users/edit'>
+<i class='button__icon'></i>
+<span id='logged-in-string'>
+Мой профиль
+</span>
+</a>
+</div>
+<div class='header__item' style='display:none'>
+<a class="header__item" data-remote="true" href="/logout" title="Выйти из системы">Выход</a>
+</div>
+<div class='header__item' style=''>
+<a class='button button_text_pink' href='#' rel='facebox' title='Войти в систему'>
+<i class='button__icon'></i>
+Войти
+</a>
+</div>
+<div class='header__item' style=''>
+<a class="header__item" href="/users/sign_up" title="Зарегистрироваться в системе">Регистрация</a>
+</div>
+</div>
+</div>
+</div>
+</div>
+</div>
+</header>
+<div class='nav-search'>
+<div class='container'>
+<div class='row'>
+<div class='col-12'>
+<div class='nav-search__wrapper'>
+<form accept-charset="UTF-8" action="/search" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><input name='_usec' type='hidden' value='119770' />
+<input id="full_search" name="full_search" type="hidden" value="false" />
+<input autocomplete="off" class="nav-search__input" id="search" name="q" placeholder="Найти" type="text" />
+</form>
+
+</div>
+</div>
+</div>
+</div>
+</div>
+
+<div class='container'>
+<div class='row'>
+<div class='col-12'>
+<ul class='nav-tabs'>
+<li class='nav-tabs-item nav-tabs-item_active nav-tabs-item_main'>
+Предстоящие события
+<span class='nav-tabs-item__count'>
+59
+</span>
+</li>
+<li class='nav-tabs-item nav-tabs-item_main'>
+<a class='nav-tabs-item__link' href='https://it-events.com/?type=past'>Прошедшие события</a>
+<span class='nav-tabs-item__count'>
+16177
+</span>
+</li>
+</ul>
+</div>
+</div>
+<div class='row'>
+<div class='col-10'>
+<section class='section'>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23017' style='background-image: url(/system/events/logos/000/023/017/original/%D0%9B%D0%BE%D0%B3%D0%BE-%D0%A4%D0%9D%D0%9A-%D1%80%D1%83%D1%81-1_%281%29.png?1648553297)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Митап / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/23017'>
+IT-девичник ФКН НИУ ВШЭ
+</a>
+<div class='event-list-item__info'>
+12 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Москва, Россия
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22651' style='background-image: url(/system/events/logos/000/022/651/original/evrone-meetup_1080x1080.png?1643127767)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Митап / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22651'>
+Python meetup (Online)
+</a>
+<div class='event-list-item__info'>
+13 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23034' style='background-image: url(/system/events/logos/000/023/034/original/800x600.jpg?1649160064)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Вебинар / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/23034'>
+Как обеспечить видеоконференцсвязь в современных реалиях
+</a>
+<div class='event-list-item__info'>
+14 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23024' style='background-image: url(/system/events/logos/000/023/024/original/%D0%90%D0%BD%D0%BE%D0%BD%D1%81_1404_%D0%BA%D0%BE%D0%BF%D0%B8%D1%8F.jpg?1648632919)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Вебинар / Платное
+</div>
+<a class='event-list-item__title' href='/events/23024'>
+Импортозамещение: резервное копирование и хранение данных с Киберпротект
+</a>
+<div class='event-list-item__info'>
+14 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22994' style='background-image: url(/system/events/logos/000/022/994/original/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0_2022-03-25_%D0%B2_13.15.55.png?1648208642)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Хакатон / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22994'>
+OVISION HACK
+</a>
+<div class='event-list-item__info'>
+15 - 17 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22950' style='background-image: url(/system/events/logos/000/022/950/original/%D0%92%D0%9A_-_1_1.png?1647449089)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Хакатон / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22950'>
+Хакатон Tender Hack Санкт-Петербург
+</a>
+<div class='event-list-item__info'>
+15 - 17 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Санкт-Петербург, Россия
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22552' style='background-image: url(/system/events/logos/000/022/552/original/1200-628_1_%281%29.jpg?1640336286)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Фестиваль / Платное
+</div>
+<a class='event-list-item__title' href='/events/22552'>
+WEGAME 7.0
+</a>
+<div class='event-list-item__info'>
+16 - 17 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Киев, Украина
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23018' style='background-image: url(/system/events/logos/000/023/018/original/%D0%9B%D0%BE%D0%B3%D0%BE-%D0%A4%D0%9D%D0%9A-%D1%80%D1%83%D1%81-1_%281%29.png?1648553757)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Лекция / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/23018'>
+«Айти-суббота Вышки» в КЦ ЗИЛ
+</a>
+<div class='event-list-item__info'>
+16 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Москва
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22556' style='background-image: url(/system/events/logos/000/022/556/original/it-874x512.jpg?1640683069)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Курс / Платное
+</div>
+<a class='event-list-item__title' href='/events/22556'>
+ Онлайн-курс «IT-директор»
+</a>
+<div class='event-list-item__info'>
+18 - 22 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/17868' style='background-image: url(/system/events/logos/000/017/868/original/OTUS_logo_OTUS-COMP-LOGO.png?1584603100)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Вебинар / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/17868'>
+Мотивация команды в кризис
+</a>
+<div class='event-list-item__info'>
+19 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22977' style='background-image: url(/system/events/logos/000/022/977/original/%D0%B2_%D0%BA_%D0%BB%D0%BE%D0%B3%D0%BE_%D0%B8%D0%BA%D0%BE%D0%BD%D0%BA%D0%B0.png?1648040881)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Конференция / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22977'>
+Семинар TrueConf о видеоконференцсвязи, удалённой работе и AV оборудовании в Оренбурге
+</a>
+<div class='event-list-item__info'>
+20 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Оренбург, Россия
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22652' style='background-image: url(/system/events/logos/000/022/652/original/evrone-meetup_1080x1080.png?1643128004)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Митап / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22652'>
+GO meetup (Online)
+</a>
+<div class='event-list-item__info'>
+20 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22853' style='background-image: url(/system/events/logos/000/022/853/original/BD_22_250_250.png?1645618132)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Форум / Платное
+</div>
+<a class='event-list-item__title' href='/events/22853'>
+Форум BIG DATA&amp;AI 2022
+</a>
+<div class='event-list-item__info'>
+21 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Москва
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22997' style='background-image: url(/system/events/logos/000/022/997/original/Group_5257.png?1648230834)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Курс / Платное
+</div>
+<a class='event-list-item__title' href='/events/22997'>
+Frontend-разработчик 
+</a>
+<div class='event-list-item__info'>
+21 апреля 2022 - 10 июня 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23039' style='background-image: url(/system/events/logos/000/023/039/original/28103.png?1649166182)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Конференция / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/23039'>
+Конференция Caleo для дизайнеров и монтажников
+</a>
+<div class='event-list-item__info'>
+21 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/23037' style='background-image: url(/system/events/logos/000/023/037/original/%D0%9B%D0%B0%D0%B9%D0%B2_21.04.22.jpg?1649163827)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Вебинар / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/23037'>
+Как выучить JavaScript с нуля: интервью с автором курса Игорем Антоновым
+</a>
+<div class='event-list-item__info'>
+21 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22558' style='background-image: url(/system/events/logos/000/022/558/original/thumb.jpg?1640683837)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Вебинар / Платное
+</div>
+<a class='event-list-item__title' href='/events/22558'>
+ Онлайн курс &quot;Mini MBA: IT&quot;
+</a>
+<div class='event-list-item__info'>
+22 апреля 2022 - 23 декабря 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22995' style='background-image: url(/system/events/logos/000/022/995/original/ux_logo_marafon.jpg?1648216476)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Конференция / Платное
+</div>
+<a class='event-list-item__title' href='/events/22995'>
+UX-исследования в новой реальности. UX-Марафон #28
+</a>
+<div class='event-list-item__info'>
+22 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22979' style='background-image: url(/system/events/logos/000/022/979/original/ucheba_logo_1.jpg?1648044730)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Мастер-класс / Бесплатное
+</div>
+<a class='event-list-item__title' href='/events/22979'>
+День открытых дверей в IT-колледже IThub
+</a>
+<div class='event-list-item__info'>
+24 апреля 2022
+</div>
+<div class='event-list-item__info event-list-item__info_location'>
+Москва
+</div>
+</div>
+</div>
+</div>
+<div class='event-list-item'>
+<div class='row'>
+<div class='col-2'>
+<a class='event-list-item__image' href='/events/22996' style='background-image: url(/system/events/logos/000/022/996/original/%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA_%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B0_2022-03-25_%D0%B2_19.56.03.jpeg?1648227448)'></a>
+</div>
+<div class='col-10'>
+<div class='event-list-item__type'>
+Курс / Платное
+</div>
+<a class='event-list-item__title' href='/events/22996'>
+«Backend-разработчик на Python»
+</a>
+<div class='event-list-item__info'>
+26 апреля 2022 - 26 июня 2022
+</div>
+<div class='event-list-item__info event-list-item__info_online'>
+Онлайн-трансляция
+</div>
+</div>
+</div>
+</div>
+
+<div class='paging'>
+
+<a class="paging__item paging__item_active" href="/">1</a>
+
+<a class="paging__item" href="/?page=2" rel="next">2</a>
+
+<a class="paging__item" href="/?page=3">3</a>
+
+<a class="paging__item" href="/?page=2" rel="next">Следующая</a>
+
+</div>
+
+</section>
+</div>
+<div class='col-2'>
+</div>
+</div>
+</div>
+
+
+<footer class='footer'>
+<div class='container'>
+<div class='row'>
+<div class='col-md-3'>
+<div>
+© 2022, IT-Events, LTD
+</div>
+<div class='footer__contact'>
+<a class='footer__link' href='mailto:admin@it-events.com'>
+admin@it-events.com
+</a>
+</div>
+</div>
+<div class='col-md-offset-1 col-md-8'>
+<div class='footer-subscribe subscription'>
+<div class='footer-subscribe__title'>
+Подпишитесь на новости IT-Events
+</div>
+<form accept-charset="UTF-8" action="/subscriptions/new" class="footer-subscribe__form" data-remote="true" id="new_subscription" method="get"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></div><input name='_usec' type='hidden' value='120509' /><div class='control-group'>
+<div class='control-group__item'>
+<input class="footer-subscribe__email" id="subscription_email" name="subscription[email]" placeholder="Введите эл. почту" required="required" type="email" />
+<span class='field-validation-error' data-valmsg-for='news' data-valmsg-replace='true'>
+<span for='restore_pass' generated='true'></span>
+</span>
+</div>
+<div class='control-group__item'>
+<input class="button" name="commit" type="submit" value="Подписаться" />
+</div>
+</div>
+</form>
+
+</div>
+<div class='footer-social'>
+<div class='footer-social__title'>
+IT-Events в социальных сетях:
+</div>
+<a class='social-icon social-icon_footer' href='https://twitter.com/it_events_com' target='new' title='twitter'></a>
+<a class='social-icon social-icon_footer social-icon_vk' href='https://vk.com/iteventscom' target='new' title='vk'></a>
+<a class='social-icon social-icon_footer social-icon_fb' href='https://www.facebook.com/iteventscom' target='new' title='facebook'></a>
+<a class='social-icon social-icon_footer social-icon_youtube' href='https://www.youtube.com/itsobytie' target='new' title='youtube'></a>
+<a class='social-icon social-icon_footer social-icon_linkedin' href='https://www.linkedin.com/company/it-sobytie' target='new' title='linkedin'></a>
+</div>
+</div>
+</div>
+</div>
+</footer>
+<div class='g-hidden alert-message'>
+<div class='success'>
+<p>
+<strong>Поздравляем!</strong>
+</p>
+Вы успешно подписались на нашу рассылку.
+</div>
+</div>
+<div style='visibility:hidden;height:0'>
+<script src="/assets/liveinternet-b2f4114f80341ebc350583a674983bcaa89c10f08704c5fdb07dcf6d977eb02a.js"></script>
+</div>
+
+<div class='overlay-container' id='login-box' style='display:none'>
+<div class='form_login'>
+<h2 class='login_string'>Вход в систему</h2>
+<form accept-charset="UTF-8" action="/ru/login" class="simple_form new_user" id="new_user" method="post" novalidate="novalidate"><div style="margin:0;padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="cVWxCGR1kgtNo7gYb5RBc83epweaPykvF37EMcbgRp4=" /></div><input name='_usec' type='hidden' value='123027' /><p class='errors invisible'>
+
+</p>
+<div class='form-group'>
+<div class="input string required user_email"><label class="string required control-label form-group__label" for="user_email">e-mail <abbr title="required">*</abbr></label><input class="string required form-control form-control_size_full" id="user_email" name="user[email]" placeholder="user@domain.ru" type="text" value="" /></div>
+</div>
+<div class='form-group'>
+<div class="input password required user_password"><label class="password required control-label form-group__label" for="user_password">Пароль <abbr title="required">*</abbr></label><input class="password required form-control form-control_size_full" id="user_password" name="user[password]" type="password" /></div>
+</div>
+<div class='form-group'>
+<label class='form-group__label'>
+<input name="user[remember_me]" type="hidden" value="0" /><label class="checkbox"><input class="boolean optional" id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" /></label>
+ Запомнить меня?
+</label>
+</div>
+<input class="button_blue button button_bold button_pink" name="commit" type="submit" value="Войти" />
+<button class='button button_ghost' onclick='$.facebox.close()'>
+Отмена
+</button>
+<p>
+<a class="recover_link" href="/profile/recover">Забыли пароль?</a>
+<a class="recover_link" href="/users/sign_up" title="Зарегистрироваться в системе">Регистрация</a>
+</p>
+<br>
+<br>
+</form>
+
+</div>
+
+</div>
+</body>
+</html>