рд╕реНрдХреНрд░реИрдкреА рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдирд╛

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

scrapy







рд╕реНрдерд╛рдкрдирд╛



рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: рдЕрдЬрдЧрд░ 2.5+ (рддреАрд╕рд░реА рд╢рд╛рдЦрд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ), рдореБрдбрд╝, lxml рдпрд╛ libxml2, simplejson, pyopenssl (HTTPS рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП)

рдореИрдВрдиреЗ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рдЙрдмрдВрдЯреВ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ред рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдЧрд╛рдЗрдб рдкреГрд╖реНрда рдЕрдиреНрдп рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдореИрдХ рдУрдПрд╕ рдПрдХреНрд╕ рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рднреА рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдХрд╛рд░реНрдп



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

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

рд╣рдо рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреЗрдЬрд┐рдВрдЧ рд▓рд┐рдВрдХ рдХреЗ рд╕рд╛рде рдПрдХ рдкреЗрдЬ рд╣реИ, рдкреНрд░рддрд┐ рдкреЗрдЬ 15 рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╣реИрдВред рдлрд╝рд┐рд▓реНрдЯрд░ рдкреИрд░рд╛рдореАрдЯрд░ GET рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рдкреГрд╖реНрда рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрдиред

рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ:

  1. Abitur.nica.ru/new/www/search.php?region=77&town=0&opf=0&type=0&spec=0&ed_level=0&ed_form=0&qualif=&substr=&page=1 рдкрд░ рдЬрд╛рдПрдВ
  2. рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВ, рдкреГрд╖реНрда рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рддреЗ рд╣реБрдП
  3. рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рдХреЗ рд╡рд┐рд╡рд░рдг abitur.nica.ru/new/www/vuz_detail.php?code=486┬оion=77&town=0&opf=0&type=0&spec=0&sp_level=0&ed_form=0&qualif=&substr=&page=1 рдкрд░ рдЬрд╛рдПрдВред
  4. рд╕реАрдПрд╕рд╡реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдп рд╡рд┐рд╡рд░рдг рд╕рд╣реЗрдЬреЗрдВ


рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг



рд╣рдо рдЙрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реНрдерд┐рдд рд╣реЛрдЧреА, рдЗрд╕реЗ рдмрдирд╛рдПрдВ:

scrapy startproject abitur cd abitur 


рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдЕрдмрд┐рддреНрд░ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ:



рдордХрдбрд╝реА



рдирд┐рд░реНрдорд┐рдд рдордХрдбрд╝рд┐рдпреЛрдВ / abitur_spider.py рдлрд╝рд╛рдЗрд▓ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдордХрдбрд╝реА рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ

 class AbiturSpider(CrawlSpider): name = "abitur" allowed_domains = ["abitur.nica.ru"] start_urls = ["http://abitur.nica.ru/new/www/search.php?region=77&town=0&opf=0&type=0&spec=0&ed_level=0&ed_form=0&qualif=&substr=&page=1"] rules = ( Rule(SgmlLinkExtractor(allow=('search\.php\?.+')), follow=True), Rule(SgmlLinkExtractor(allow=('vuz_detail\.php\?.+')), callback='parse_item'), ) "..." 


рд╣рдорд╛рд░реА рдХрдХреНрд╖рд╛ рдХреНрд░реЙрд▓рд╕реНрдкрд╛рдЗрдбрд░ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реА рд╣реИ, рдЬреЛ рд╣рдореЗрдВ рд▓рд┐рдВрдХ рдкреИрдЯрд░реНрди рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдХрд┐ рдордХрдбрд╝реА рдЙрдирдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдирд┐рдХрд╛рд▓реЗрдЧреА рдФрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдЧреАред

рдХреНрд░рдо рдореЗрдВ:



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

рддрддреНрд╡реЛрдВ



рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдЖрдЗрдЯрдореНрд╕рд╣реЛрдо рдореЗрдВ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВ рдЬреЛ рдПрдХрддреНрд░ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдбреЗрдЯрд╛ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреА рд╣реИрдВред
рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 class AbiturItem(Item): name = Field() state = Field() "..." 


рдирд┐рд░реНрдпрд╛рдд рд╕реЗ рдкрд╣рд▓реЗ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╢реИрдХреНрд╖рд┐рдХ рд╕рдВрд╕реНрдерд╛рди "рд░рд╛рдЬреНрдп" рдФрд░ "рдЧреИрд░-рд░рд╛рдЬреНрдп" рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕ рдореВрд▓реНрдп рдХреЛ рдмреВрд▓рд┐рдпрди рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рджрд┐рдирд╛рдВрдХ "1 рдЬрдирд╡рд░реА, 2011" рдХреЛ "01.01.2011" рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВрдбрд▓рд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рд░рд╛рдЬреНрдп рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЕрд▓рдЧ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:

 class AbiturItem(Item): name = Field() state = Field(input_processor=MapCompose(lambda s: not re.match(u'\s*', s))) "...." 


MapCompose рд░рд╛рдЬреНрдп рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИред

рдХрд┐рд╕реА рдкреГрд╖реНрда рдкрд░ рдЖрдЗрдЯрдо рдЦреЛрдЬреЗрдВ



рд╡рд╛рдкрд╕ рд╣рдорд╛рд░реЗ parse_item рдкрджреНрдзрддрд┐ рдкрд░ред

рдЖрдк рдкреНрд░рддреНрдпреЗрдХ рдЖрдЗрдЯрдо рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реЗ рднреА рдЬреБрдбрд╝рд╛ рд╣реИред

 class AbiturLoader(XPathItemLoader): default_input_processor = MapCompose(lambda s: re.sub('\s+', ' ', s.strip())) default_output_processor = TakeFirst() class AbiturSpider(CrawlSpider): "..." def parse_item(self, response): hxs = HtmlXPathSelector(response) l = AbiturLoader(AbiturItem(), hxs) l.add_xpath('name', '//td[@id="content"]/h1/text()') l.add_xpath('state', '//td[@id="content"]/div/span[@class="gray"]/text()') "..." return l.load_item() 


рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рд╕реЗ рдЪрд░рдо рдФрд░ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕реНрдерд╛рди рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЖрдк рд▓реЛрдбрд░ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдирд┐рдпрдо рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рд╣рдордиреЗ AbiturItem рд╡рд░реНрдЧ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛:

 class AbiturLoader(XPathItemLoader): "..." state_in = MapCompose(lambda s: not re.match(u'\s*', s)) 


рдЗрд╕рд▓рд┐рдП, рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡реИрд╕рд╛ рдХрд░реЗрдВред

Parse_item () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЖрдЗрдЯрдо рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдкрд╛рдЗрдкрд▓рд╛рдЗрди (рдкрд╛рдЗрдкрд▓рд╛рдЗрдирд▓рд╛рдЗрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд) рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╣рд╛рдВ рдЖрдк рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдбреЗрдЯрд╛ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдХрдХреНрд╖рд╛рдПрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдорд╛рдирдХ рд╕реНрдХреНрд░реИрдкреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЛрдВрдЧреЙрдбрдм рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВред

рдЗрд╕ рддрддреНрд╡ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ XPath рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣рд╛рдБ рдпрд╛ рдпрд╣рд╛рдБ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк FirePath рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЕрдВрджрд░ tbody рдЯреИрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИред XPath рдкрдереЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХрдВрд╕реЛрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдФрд░ рдПрдХ рдЯрд┐рдкреНрдкрдгреАред рдЬрдм рдЖрдк XPath рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдПрдХ рд╕реВрдЪреА рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЯреЗрдХрдлрд╝рд░реНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЬреЛ рдЗрд╕ рд╕реВрдЪреА рдХрд╛ рдкрд╣рд▓рд╛ рддрддреНрд╡ рд▓реЗрддрд╛ рд╣реИред

рд▓рд╛рдВрдЪ



рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рд▓рд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ

 scrapy crawl abitur --set FEED_URI=scraped_data.csv --set FEED_FORMAT=csv 


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореИрдВрдиреЗ рд╕рдм рдХреБрдЫ рдмрддрд╛рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдХреНрд░реЗрдкреА рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ :


рдПрдХ рд▓реЗрдЦ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдкреНрд░рд╢реНрди рдкреВрдЫреЗрдВ, рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдкрдврд╝реЗрдВ, рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдЭрд╛рд╡ рджреЗрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг GitHub рдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ред

Source: https://habr.com/ru/post/In115710/


All Articles