ЁЯОп рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдпреЛрдЧреНрдп, рдбрд┐рдЯреЗрдХреНрд╢рди-рдкреНрд░рддрд┐рд░реЛрдзреА рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдЬреЛ рд╕реНрд╡-рд╡рд┐рдХрд╕рд┐рдд Chromium рджреНрд╡рд╛рд░рд╛ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реИ, рд╡реЗрдм рдХреНрд░реЙрд▓рд░ рдФрд░ рдПрдЖрдИ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ред ЁЯСЙрдЕрднреА рдЖрдЬрд╝рдорд╛рдПрдВ
рд╡рд╛рдкрд╕ рдмреНрд▓реЙрдЧ рдкрд░

рдХреНрдпреЛрдВ рдЖрдкрдХрд╛ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рд╕реНрдХреНрд░реЗрдкрд░ рдмреНрд▓реЙрдХ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдХреИрд╕реЗResidential Proxies + Cloud Browser рдЗрд╕реЗ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ

James Thompson
James Thompson

Scraping and Proxy Management Expert

03-Jun-2026

рдореБрдЦреНрдп рдирд┐рд╖реНрдХрд░реНрд╖:

  • Elixir рд╕рдорд╡рд░реНрддреА рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред BEAM рд░рдирдЯрд╛рдЗрдо рд╣рдЬрд╛рд░реЛрдВ рд╣рд▓реНрдХреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдПрдХ рдиреЛрдб рдкрд░ рдмреБрдирддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд▓ рдЬреЛ рд╕реИрдХрдбрд╝реЛрдВ URL рдХреЗ рдмреАрдЪ рдлреИрд▓рддрд╛ рд╣реИ, рдЙрд╕реЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг Task.async_stream рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдмрдЬрд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЖрдкрдХреЛ рдПрдХ рдереНрд░реЗрдб рдкреВрд▓ рдХреА рджреЗрдЦрднрд╛рд▓ рдХрд░рдиреА рдкрдбрд╝реЗред
  • Req рдФрд░ HTTPoison рдлреЗрдЪ рдХрд░рддреЗ рд╣реИрдВ, Floki рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред Req рдЖрдзреБрдирд┐рдХ, рдмреИрдЯрд░реА рд╕реЗ рднрд░рд╛ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИ; HTTPoison рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╣реИрдХрдиреА-рдмреИрдХ рд╡рд┐рдХрд▓реНрдк рд╣реИ; Floki рдХрдЪреНрдЪреЗ HTML рдХреЛ рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк CSS рд╕реЗрд▓реЗрдХреНрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рдорд┐рд▓рдХрд░ рд╡реЗ рдХрд┐рд╕реА рднреА рдкреЗрдЬ рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдкреНрд░рд╕реНрддреБрдд рдорд╛рд░реНрдХрдЕрдк рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдЧрдпрд╛ рд╣реИред
  • Crawly рд╕рдВрдкреВрд░реНрдг рдХреНрд░реЙрд▓рд┐рдВрдЧ рдврд╛рдВрдЪрд╛ рд╣реИред рдпрд╣ рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реИ, рдлреЙрд▓реЛ-рдЕрдк рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреГрд╖реНрдард╛рдВрдХрди рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рд░реЛрдЯреЗрд╢рди рдФрд░ рдЕрдиреБрд░реЛрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рдиреАрдЪреЗ рдзрдХреЗрд▓рддрд╛ рд╣реИ тАФ Scrapy рдХреА рддрд░рд╣, рд▓реЗрдХрд┐рди BEAM рдкрд░ред
  • Scrapeless рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░реЙрдХреНрд╕реА рдлреЗрдЪ рдХреЛ рд░реВрдЯ рдХрд░рддреА рд╣реИрдВред рдПрдХрд▓ рдкреНрд░реЙрдХреНрд╕реА рд╣реЛрд╕реНрдЯ, рдкреЛрд░реНрдЯ, рдФрд░ рдмреБрдирд┐рдпрд╛рджреА рдСрде рд╣реЗрдбрд░ рд╕реАрдзреЗ Req рдХреЗ connect_options, HTTPoison рдХреЗ :proxy / :proxy_auth, рдпрд╛ Crawly рдХреЗ RequestOptions рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдкреНрд▓рдЧ рд╣реЛрддреЗ рд╣реИрдВ, рд╣рд░ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓ рдЖрдИрдкреА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реБрдП рдФрд░ рдмрд╛рд╣рд░реА рднреВрдЧреЛрд▓ рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • JS-рднрд╛рд░реА рдФрд░ рдПрдВрдЯреАрдмрд╛рдЯ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП Scrapeless рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмрдврд╝рддреЗ рд╣реИрдВред Elixir Chrome DevTools рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ Node рдпрд╛ Python рдХреА рддрд░рд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдП рдЧрдП рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреЗ рд▓рд┐рдП Scrapeless рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░реЙрдХреНрд╕рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ HTTP рдЕрдиреБрд░реЛрдз, рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб-рдкреНрд░рд╕реНрддреБрдд рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЙрд▓-рдЖрдЙрдЯред
  • рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлреНрд░реАред рдирдП Scrapeless рдЦрд╛рддреЛрдВ рдореЗрдВ рдореБрдлреНрдд рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд░рдирдЯрд╛рдЗрдо рд╢рд╛рдорд┐рд▓ рд╣реИ тАФ app.scrapeless.com рдкрд░ рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВред

рдкрд░рд┐рдЪрдп: Elixir рдХреНрдпреЛрдВ, рдФрд░ рдЬрд╣рд╛рдБ рдШрд░реНрд╖рдг рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ

Elixir BEAM рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рд╡рд╣реА рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдЬрд┐рд╕рдиреЗ рджрд╢рдХреЛрдВ рд╕реЗ Erlang рдЯреЗрд▓реАрдХреЙрдо рд╕реНрд╡рд┐рдЪ рдХреЛ рдСрдирд▓рд╛рдЗрди рд░рдЦрд╛ рд╣реИред рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреБрдг рд╕рд╕реНрддрд╛ рд╕рдорд╡рд░реНрддреАрддрд╛ рд╣реИ: рджрд╕ рд╣рдЬрд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдкреИрджрд╛ рдХрд░рдирд╛ рд╕рд╛рдорд╛рдиреНрдп рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдПрдХрд▓, рдкреНрд░рддреНрдпреЗрдХ рдПрдХ рд╕рдХреНрд╖рдо HTTP рдЕрдиреБрд░реЛрдз рдХреЛ рдмрд┐рдирд╛ рдЕрдиреНрдп рдХреЛ рд░реЛрдХреЗ рд╣реЛрд▓реНрдб рдХрд░ рд╕рдХрддреА рд╣реИред рдПрдХ рдХреНрд░реЙрд▓ рдЬрд┐рд╕реЗ рджреВрд╕рд░реА рднрд╛рд╖рд╛ рдореЗрдВ рдПрдХ рдЕрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдлреНрд░реЗрдорд╡рд░реНрдХ рдФрд░ рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдкреВрд▓ рдЯреНрдпреВрдирд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, Elixir рдореЗрдВ Task.async_stream рдХреЗ рд╕рд╛рде max_concurrency рдХреИрдк рд╣реЛрддреА рд╣реИред

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдХрд╣рд╛рдиреА рдкрд░рд┐рдкрдХреНрд╡ рд╣реИред Req рдФрд░ HTTPoison рдкреГрд╖реНрда рдлреЗрдЪ рдХрд░рддреЗ рд╣реИрдВ, Floki рдЙрдиреНрд╣реЗрдВ CSS рд╕реЗрд▓реЗрдХреНрдЯрд░реНрд╕ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ, рдФрд░ Crawly рдкреВрд░реЗ рд▓реВрдк рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ тАФ рдЕрдиреБрд╕реВрдЪрд┐, рдбрд┐рдбреБрдкреНрд▓реАрдХреЗрд╢рди, рдкреГрд╖реНрдард╛рдВрдХрди, рдФрд░ рдЖрдЗрдЯрдо рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдПрдХ Scrapy-рд╢реИрд▓реА рдврд╛рдВрдЪреЗ рдореЗрдВ рдЬреЛ рдЕрднреА рднреА рдкреНрд░рд╡реГрддреНрддрд╛рддреНрдордХ Elixir рдЬреИрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИред рд╕реНрдереИрддрд┐рдХ рд╢реНрд░реЗрдгрд┐рдпреЛрдВ, рд╕рд╛рдЗрдЯрдореИрдк, рдФрд░ рд╕рд░реНрд╡рд░-рдирд┐рд░реНрдорд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП, рд╡рд╣ рд╕реНрдЯреИрдХ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдкреВрд░реНрдг рд╣реИред

рджреЛ рдЪреАрдЬрд╝реЗрдВ рдЗрд╕реЗ рддреЛрдбрд╝рддреА рд╣реИрдВред рдкрд╣рд▓рд╛, рдЖрдИрдкреА рдкреНрд░рддрд┐рд╖реНрдард╛: рдПрдХ рд╕рд╛рдлрд╝ рдбреЗрдЯрд╛рдХреЗрдВрджреНрд░ рдкрддрд╛ рдЙрд╕ рдкрд▓ рдЭрдВрдбрд╛ рдЙрдард╛ рд▓реЗрддрд╛ рд╣реИ рдЬрдм рд▓рдХреНрд╖рд┐рдд рд╕реНрдерд╛рди рдпрд╣рд╛рдВ рддрдХ рдХрд┐ рдПрдХ рдореВрд▓ рдмреЙрдЯ рдкреНрд░рдмрдВрдзрдХ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЛрдИ рднреА рд╣реЗрдбрд░ рдЯреНрдпреВрдирд┐рдВрдЧ рд░реЛрдХрдиреЗ рд╡рд╛рд▓реЗ рдЖрдИрдкреА рдХреЛ рдареАрдХ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рджреВрд╕рд░рд╛, рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд░реЗрдВрдбрд░рд┐рдВрдЧ: рдПрдХ рдПрдХрд▓-рдкреГрд╖реНрда рдРрдк HTTP 200 рдХреЛ рдПрдХ рдЦрд╛рд▓реА <div id="app"> рдХреЗ рд╕рд╛рде рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ Floki рдареАрдХ рд╡рд╣реА рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЖрдпрд╛ тАФ рдХреБрдЫ рдирд╣реАрдВред рдкреГрд╖реНрда рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдкреВрд░реНрдг рджрд┐рдЦрддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреНрд░реИрдкрд░ рдХреЗ рд▓рд┐рдП рдЦрд╛рд▓реА рд╣реЛрддрд╛ рд╣реИред

рдпрд╣ рдЧрд╛рдЗрдб Elixir рд╕реНрдЯреИрдХ рдХреЛ рд╕реНрддрд░реЛрдВ рдореЗрдВ рдмрдирд╛рддреА рд╣реИред HTTP рд╕реНрддрд░ Req, HTTPoison, рдФрд░ Crawly рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдЬреЛ Scrapeless рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓ рдкреНрд░реЙрдХреНрд╕рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ 195+ рджреЗрд╢реЛрдВ рдореЗрдВ рд░реВрдЯреЗрдб рд╣реИред рд░реЗрдВрдбрд░рдб-JS рд╕реНрддрд░ Scrapeless рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдкрд░ рдмрдврд╝рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Elixir рд╕реЗ рдмрд┐рдирд╛ BEAM рдХреЛ рд╕реАрдбреАрдкреА рд╕реАрдзреЗ рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрди рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓-рдкреНрд░реЙрдХреНрд╕реА рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЬреЛ рдЗрди рдлрд╝реЗрдЪреЛрдВ рдХреЛ рд░реВрдЯ рдХрд░рддреА рд╣реИрдВ, SSL рдкреНрд░реЙрдХреНрд╕реА рдХреНрдпрд╛ рд╣реИ? рджреЗрдЦреЗрдВред


рдЖрдк рдХреНрдпрд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ

рджреЛ-рд╕реНрддрд░реАрдп рдкреИрдЯрд░реНрди тАФ Elixir рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рд╛рдордиреЗ, Scrapeless рд╡реГрджреНрдзрд┐ рдХреЗ рдкреАрдЫреЗ тАФ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рдзрд╛рд░рдг HTTP рд╕реНрдХреНрд░реИрдкрд░ рдХреЛ рд╣рд░рд╛рддреЗ рд╣реИрдВ:

  • рд╕рдорд╡рд░реНрддреА рд╕реВрдЪреА рдХреНрд░реЙрд▓ред рд╕рд╛рдЗрдЯрдореИрдк, рд▓реЗрдЦ рдЖрд░реНрдХрд╛рдЗрд╡, рдЙрддреНрдкрд╛рдж рд╕реВрдЪреА тАФ Task.async_stream URL рд╕реЗрдЯ рдХреЗ рдХреНрд░реЙрд╕ рдлреИрд▓рддреА рд╣реИ рд▓рд┐рдорд┐рдЯреЗрдб рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдФрд░ рд╣рд░ рдкреГрд╖реНрда рдХреЛ Floki рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрд╛рд░реНрд╕ рдХрд░рддреА рд╣реИред
  • Crawly рдХреЗ рд╕рд╛рде рдЕрдиреБрд╕реВрдЪрд┐рдд рдореЙрдирд┐рдЯрд░рд┐рдВрдЧред рдПрдХ рдмрд╛рд░ рдПрдХ рдордХрдбрд╝реА рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ, рдЗрд╕реЗ рдПрдХ рд╢реЗрдбреНрдпреВрд▓ рдкрд░ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреГрд╖реНрда рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВ, рдФрд░ рдкрд╛рд░реНрд╕ рдХрд┐рдП рдЧрдП рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдорд╛рдиреНрдпрддрд╛ рдФрд░ рднрдВрдбрд╛рд░рдг рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдзрдХреЗрд▓реЗрдВред
  • рднреМрдЧреЛрд▓рд┐рдХ-рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдиреИрдкрд╢реЙрдЯред Scrapeless рдкреНрд░реЙрдХреНрд╕реА рджреЗрд╢ рдХреЛ рдкрд┐рди рдХрд░реЗрдВ рддрд╛рдХрд┐ рдХреАрдорддреЗрдВ, рдЙрдкрд▓рдмреНрдзрддрд╛, рдФрд░ рд╕рд╣рдорддрд┐ рджреАрд╡рд╛рд░реЗрдВ рд╡рд╣реА рджрд┐рдЦрд╛рдПрдВ рдЬреЛ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреЗрдЦрддрд╛ рд╣реИ, рди рдХрд┐ рдЬреЛ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛ рдЖрдИрдкреА рд╣рд▓ рдХрд░рддрд╛ рд╣реИред
  • рдмреЙрдЯ рдкреНрд░рдмрдВрдзрдХреЛрдВ рдХреЗ рдкреАрдЫреЗ рдордЬрдмреВрдд рдирд┐рд╖реНрдХрд░реНрд╖рдгред Residential egress рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЗрдЪ рдХреЛ рд░реВрдЯ рдХрд░реЗрдВ рддрд╛рдХрд┐ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдШрд░реЗрд▓реВ рдЖрдИрдкреА, рди рдХрд┐ рдбреЗрдЯрд╛рдХреЗрдВрджреНрд░ рд░реЗрдВрдЬ, рдЕрдиреБрд░реЛрдз рдХрд░реЗред
  • RAG рдФрд░ LLM рд╕реЗрд╡рдиред рдкреНрд░рдХрд╛рд╢рдХ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реЛрдВ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рдкрд╛рда рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ, рдлрд┐рд░ рдирд┐рдХрд╛рд▓реЗ рдЧрдП рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ рдПрдиреНрд╡реЗрдбрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдбрд╛рд▓реЗрдВред
  • SPA рдФрд░ рдЕрдирдВрдд-рд╕реНрдХреНрд░реЙрд▓ рдкреГрд╖реНрдаред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб-рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЛ Scrapeless рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдмрдврд╝рд╛рдПрдВ, рдЬреЛ JavaScript рдХреЛ рдХреНрд▓рд╛рдЙрдб-рд╕рд╛рдЗрдб рдЪрд▓рд╛рддрд╛ рд╣реИ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдкрд░рд┐рдгрд╛рдо рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░реЗрдВред

Scrapeless рдХреЗ рд╕рд╛рде Elixir рдХреНрдпреЛрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдП

Elixir рдЖрдкрдХреЛ рд╕рдорд╡рд░реНрддреАрддрд╛, рдкрд╛рд░реНрд╕рд┐рдВрдЧ, рдФрд░ рдПрдХ рдХреНрд░реЙрд▓рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ рджреЗрддрд╛ рд╣реИ; Scrapeless Scraping Browser рд╡рд╣ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдФрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкреНрд▓рдВрдмрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рджреЛрдиреЛрдВ рдПрдХ рд╕рд╛рде рдЬреБрдбрд╝рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдПрдХ рдорд╛рдирдХ HTTP рдкреНрд░реЙрдХреНрд╕реА рдкрд░ рдПрдХ рддрд░рдл рдФрд░ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд┐рдд рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╣реНрдорд╛ рдПрдВрдбрдкреЙрдЗрдВрдЯ рджреВрд╕рд░реА рддрд░рдл рд╣реЛрддрд╛ рд╣реИред

  • 195+ рджреЗрд╢реЛрдВ рдореЗрдВ рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕реАред рдПрдХрд▓ рдкреНрд░реЙрдХреНрд╕реА рд╣реЙрд╕реНрдЯ, рдкреЛрд░реНрдЯ, рдФрд░ рдмреЗрд╕рд┐рдХ-рдСрде рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ тАФ рд╕реАрдзреЗ Req, HTTPoison, рдпрд╛ Crawly рдХреЗ RequestOptions рдорд┐рдбрд▓рд╡реЗрдпрд░ рдореЗрдВ рдбрд╛рд▓реЗрдВред
  • рдкреНрд░рддрд┐-рдирд┐рд╡реЗрджрди рднреВрдЧреЛрд▓ рдкрд┐рдирд┐рдВрдЧред рдкреНрд░реЙрдХреНрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдореЗрдВ рдПрдХ рджреЗрд╢ рдХреЛрдб рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╣реИрдВрдбрд╢реЗрдХ рдХреЗ рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рдХреА рднреВрдЧреЛрд▓ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╣реА рдХреЛрдб US, GB, DE, рдпрд╛ JP рджреГрд╢реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдПрдХ рдЦрдВрдб рдХреЛ рдмрджрд▓рдХрд░ред
  • рдПрдВрдЯреА-рдбрд┐рдЯреЗрдХреНрд╢рди рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ред рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб-рд░реЗрдиреНрдбрд░реНрдб рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП, Scrapeless Scraping Browser рдПрдХ рд╕реНрд╡рдпрдВ-рд╡рд┐рдХрд╕рд┐рдд Chromium рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреВрд░реНрдг рдХреНрд▓рд╛рдЙрдб-рд╕рд╛рдЗрдб рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рдкреНрд░рддрд┐-рд╕реЗрд╢рди рдлрд┐рдВрдЧрд░рдкреНрд░рд┐рдВрдЯ рдпрд╛рджреГрдЪреНрдЫрд┐рдХрдХрд░рдг рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП SPA рдФрд░ рд▓реЗрдЬрд╝реА-рд▓реЛрдбреЗрдб рдкреИрдирд▓ рдирд┐рдХрд╛рд╕реА рд╕реЗ рдкрд╣рд▓реЗ рд╣рд╛рдЗрдбреНрд░реЗрдЯ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред
  • рджреЛрдиреЛрдВ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ API рдХреБрдВрдЬреАред рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕реА рдФрд░ Scraping Browser рдПрдХ рд╣реА Scrapeless рдЦрд╛рддреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдмрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП HTTP рд╕реНрддрд░ рдФрд░ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╕реНрддрд░ рдПрдХ рд╣реА рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВред
  • рд╕реНрдЯрд┐рдХреА-рд╕реЗрд╢рди рд╡рд┐рдХрд▓реНрдкред рдЬрдм рдкреНрд░рд╡рд╛рд╣ рдХреЛ рдирд┐рд░рдВрддрд░рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рддреЛ рдХрдИ рдЪрд░рдгреЛрдВ рдореЗрдВ рдПрдХ рд╣реА рдЖрд╡рд╛рд╕реАрдп IP рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ, рдпрд╛ рдЕрдиреНрдп рд╕рднреА рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдШреБрдорд╛рдПрдВред

рд░рдирдЯрд╛рдЗрдо рдореБрдлреНрдд рдореЗрдВ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧ рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓ рдХрд░рддрд╛ рд╣реИ тАФ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП Scrapeless рдореВрд▓реНрдп рдирд┐рд░реНрдзрд╛рд░рдг рджреЗрдЦреЗрдВ, рдФрд░ app.scrapeless.com рдкрд░ рдореБрдлреНрдд рдпреЛрдЬрдирд╛ рдкрд░ рдЕрдкрдиреА API рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред


рдкреВрд░реНрд╡рд╛рдкреЗрдХреНрд╖рд╛рдПрдБ

  • Elixir 1.16+ рдФрд░ Erlang/OTP 26+ тАФ elixir --version рдХреЗ рд╕рд╛рде рдЬрд╛рдВрдЪреЗрдВред
  • рдПрдХ Scrapeless рдЦрд╛рддрд╛ рдФрд░ API рдХреБрдВрдЬреА тАФ app.scrapeless.com рдкрд░ рдореБрдлреНрдд рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ, рдлрд┐рд░ рдЕрдкрдиреА рдХреБрдВрдЬреА Settings тЖТ API Key Management рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
  • рдЖрд╡рд╛рд╕реАрдп-рдкреНрд░реЙрдХреНрд╕реА рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ тАФ app.scrapeless.com рдкрд░ Proxies тЖТ Residential рдХреЗ рддрд╣рдд рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред
  • mix, CSS рд╕реЗрд▓реЗрдХреНрдЯрд░реНрд╕, рдФрд░ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рд╕рд╛рде рдмреБрдирд┐рдпрд╛рджреА рдкрд░рд┐рдЪрдпред

рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ: рдорд┐рдХреНрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдФрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗрдЯ рдХрд░реЗрдВ

рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЬреЛрдбрд╝реЗрдВред mix new рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрдХреИрдлреЛрд▓реНрдб рдХрд░рддрд╛ рд╣реИ; рдЪрд╛рд░ ╨╖╨░╨▓╨╕╤Б╨╕╨╝╨╛╤Б╤В╨╡╨╣ рдбреЗрдЯрд╛ рдЦреАрдВрдЪрдиреЗ (req, httpoison), рдкрд╛рд░реНрд╕рд┐рдВрдЧ (floki), рдФрд░ рдкреВрд░реНрдг рдХреНрд░реЙрд▓рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ (crawly) рдХреЛ рдХрд╡рд░ рдХрд░рддреЗ рд╣реИрдВ:

bash Copy
mix new elixir_scraper --sup
cd elixir_scraper

mix.exs рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЬреЛрдбрд╝реЗрдВ:

elixir Copy
# mix.exs
defp deps do
  [
    {:req, "~> 0.5"},        # рдЖрдзреБрдирд┐рдХ HTTP рдХреНрд▓рд╛рдЗрдВрдЯ (рдлрд┐рдиреНрдЪ/рдорд┐рдВрдЯ рдХреЗ рддрд╣рдд)
    {:httpoison, "~> 2.2"},  # рд╣реИрдХрдиреА-рдмреИрдХ рдХрд┐рдП рдЧрдП HTTP рдХреНрд▓рд╛рдЗрдВрдЯ, рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд╡рд┐рдХрд▓реНрдк
    {:floki, "~> 0.36"},     # CSS-рд╕реЗрд▓реЗрдХреНрдЯрд░ рдХреНрд╡реЗрдпрд░рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде HTML рдкрд╛рд░реНрд╕рд░
    {:crawly, "~> 0.17"}     # рдкреВрд░реНрдг рдХреНрд░реЙрд▓рд┐рдВрдЧ рдлреНрд░реЗрдорд╡рд░реНрдХ, Scrapy-рд╢реИрд▓реА
  ]
end

рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдЦреАрдВрдЪреЗрдВ:

bash Copy
mix deps.get

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


рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ: рдЕрдкрдиреЗ Scrapeless рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВ

рдЕрдкрдиреЗ API рдХреБрдВрдЬреА рдФрд░ рдЖрд╡рд╛рд╕реАрдп-рдкреНрд░реЙрдХреНрд╕реА рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдХреЛ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░реЗрдВ рддрд╛рдХрд┐ рд╡реЗ рд╕реНрд░реЛрдд рдирд┐рдпрдВрддреНрд░рдг рд╕реЗ рджреВрд░ рд░рд╣реЗрдВред рдбреИрд╢рдмреЛрд░реНрдб рдореЗрдВ Proxies тЖТ Residential рдХреЗ рддрд╣рдд, Generate рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдкреИрдирд▓ рдПрдХ рдХреЙрд▓рди-рдкреНрд░рддрд┐рднрд╛рдЬрд┐рдд рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ рдЗрд╕ рд░реВрдк рдореЗрдВ <GATEWAY>:<PORT>:<CHANNEL_ID>-proxy-country_US-r_10m-s_<SESSION_ID>:<PASSWORD>:

bash Copy
export SCRAPELESS_API_KEY="your_api_token_here"
export SCRAPELESS_CHANNEL_ID="your_channel_id"          # рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛
export SCRAPELESS_PROXY_PASS="your_channel_password"
export SCRAPELESS_PROXY_GATEWAY="gw-us.scrapeless.io"   # рдиреАрдЪреЗ рдХреНрд╖реЗрддреНрд░реАрдп рдЧреЗрдЯрд╡реЗ рджреЗрдЦреЗрдВ

рдХреНрд╖реЗрддреНрд░реАрдп рдЧреЗрдЯрд╡реЗ: gw-us.scrapeless.io (рдЕрдореЗрд░рд┐рдХрд╛), gw-eu.scrapeless.io (рдпреВрд░реЛрдк), gw-ap.scrapeless.io (рдПрд╢рд┐рдпрд╛-рдкреНрд░рд╢рд╛рдВрддрд┐)ред рдЕрдкрдиреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдирд┐рдХрдЯрддрдо рдЧреЗрдЯрд╡реЗ рдЪреБрдиреЗрдВ рддрд╛рдХрд┐ рд╣реИрдВрдбрд╢реЗрдХ рд╡рд┐рд▓рдВрдмрддрд╛ рдХрдо рд╣реЛ; рдмрд╛рд╣рд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рджреЗрд╢ рдЕрднреА рднреА country_<CC> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЦрдВрдб рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдЪрд╛рд╣реЗ рдЖрдк рдХрд┐рд╕реА рднреА рдЧреЗрдЯрд╡реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдкреЛрд░реНрдЯ рд╕рднреА рдХреЗ рд▓рд┐рдП 8789 рд╣реИред

рдЖрд╡рд╛рд╕реАрдп-рдкреНрд░реЙрдХреНрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЪрд╛рд░ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

  • <CHANNEL_ID> тАФ рдЖрдкрдХрд╛ рдЪреИрдирд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдбреИрд╢рдмреЛрд░реНрдб рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкреНрд░рд┐рдВрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛)ред
  • country_<CC> тАФ рджреЛ-рд▓реЗрдЯрд░ ISO рдХреЛрдб рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрд╢ рдкрд┐рди: country_US, country_GB, country_DE, country_JP, рдЖрджрд┐ (рдбреИрд╢рдмреЛрд░реНрдб рд╕реНрдерд╛рди рдЪрдпрдирдХрд░реНрддрд╛ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ)ред
  • r_<duration> тАФ рд╕реНрдЯрд┐рдХреА-рд╕реЗрд╢рди рд░реЛрдЯреЗрд╢рди рдЕрдВрддрд░рд╛рд▓ (рдЬреИрд╕реЗ r_10m 10 рдорд┐рдирдЯ рдХреЗ рд▓рд┐рдП рд╡рд╣реА IP рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдлрд┐рд░ рд░реЛрдЯреЗрдЯ рдХрд░рддрд╛ рд╣реИ)ред
  • s_<SESSION_ID> тАФ рд╕реНрдерд╛рдпреА-рд╕рддреНрд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛; рдЪрдХреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реА s_<id> рдХреЛ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

r_ рдФрд░ s_ рдЦрдВрдбреЛрдВ рдХреЛ рдПрдХ рдирдП рдЖрд╡рд╛рд╕реАрдп рдЖрдИрдкреА рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреЗрдВ; рдЬрдм рдкреГрд╖реНрдардмрджреНрдз рдпрд╛рддреНрд░рд╛ рдХреЛ рдПрдХ рд╣реА рдЖрдИрдкреА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд░рдЦреЗрдВред


рдореВрд▓: рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Req рдХреЗ рд╕рд╛рде рдлрд╝реЗрдЪ рдХрд░реЗрдВ, Floki рдХреЗ рд╕рд╛рде рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ

Req рдПрдХ HTTP рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ :connect_options рдХреБрдВрдЬреА рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдпрд╣ рдиреАрдЪреЗ рдлрд╝рд┐рдиреНрдЪ рдФрд░ рдорд┐рдВрдЯ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреЛ :proxy_headers рдореЗрдВ рдПрдХрд▓ рдмреЗрд╕рд┐рдХ-рдСрде рд╣реЗрдбрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ тАФ рдорд┐рдВрдЯ рдЗрд╕реЗ рдХрдиреЗрдХреНрдЯ рдЕрдиреБрд░реЛрдз рдореЗрдВ рдорд┐рд▓рд╛ рджреЗрддрд╛ рд╣реИред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рджреЗрд╢ рдХрд╛ рдкрд┐рди рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рд▓рд╛рдЗрди рд╕реНрд╡рдпрдВ рдирд┐рдХрд╛рд╕реА рднреВрдЧреЛрд▓ рдХрд╛ рдЪрдпрди рдХрд░рддреА рд╣реИ:

elixir Copy
defmodule ElixirScraper.ReqClient do
  @gateway System.get_env("SCRAPELESS_PROXY_GATEWAY") || "gw-us.scrapeless.io"
  @port 8789

  # рджреЗрд╢ рдХреЗ рдкрд┐рди рдХреЗ рд╕рд╛рде рдЖрд╡рд╛рд╕реАрдп-рдкреНрд░реЙрдХреНрд╕реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдмрдирд╛рдПрдВред
  defp proxy_username(country) do
    channel = System.fetch_env!("SCRAPELESS_CHANNEL_ID")
    "#{channel}-proxy-country_#{country}"
  end

  defp proxy_auth_header(country) do
    user = proxy_username(country)
    pass = System.fetch_env!("SCRAPELESS_PROXY_PASS")
    "Basic " <> Base.encode64("#{user}:#{pass}")
  end

  @doc "`country` рдореЗрдВ Scrapeless рдЖрд╡рд╛рд╕реАрдп рдирд┐рдХрд╛рд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ URL рдлрд╝реЗрдЪ рдХрд░реЗрдВред"
  def fetch(url, country \\ "US") do
    Req.get(url,
      connect_options: [
        proxy: {:http, @gateway, @port, []},
        proxy_headers: [{"proxy-authorization", proxy_auth_header(country)}]
      ],
      headers: [{"user-agent", "Mozilla/5.0 (compatible; ElixirScraper/1.0)"}]
    )
  end
end

рдЗрд╕реЗ рдХреЙрд▓ рдХрд░реЗрдВ рдФрд░ рдмреЙрдбреА рдХреЛ рд╕реАрдзреЗ Floki рдХреЛ рд╕реМрдВрдк рджреЗрдВред Floki.parse_document/1 HTML рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдПрдХ рдкреЗрдбрд╝ рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ; Floki.find/2 рдЗрд╕реЗ CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реИ; Floki.text/1 рдФрд░ Floki.attribute/2 рдореВрд▓реНрдп рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ:

elixir Copy
{:ok, resp} = ElixirScraper.ReqClient.fetch("https://books.toscrape.com/")
{:ok, document} = Floki.parse_document(resp.body)

titles =
  document
  |> Floki.find("article.product_pod h3 a")
  |> Floki.attribute("title")

prices =
  document
  |> Floki.find("article.product_pod p.price_color")
  |> Floki.text()

IO.inspect(Enum.zip(titles, prices), label: "рдкрд╣рд▓рд╛ рдкреГрд╖реНрда")

рдпрд╣ рддреАрди рдЪреАрдЬреЗрдВ рдЬрд▓реНрджреА рд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ:

  • рдкреНрд░реЙрдХреНрд╕реА рдХреЛ рд╣рд░ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдирд╣реАрдВред рдпрд╣ рдПрдХ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╡рд┐рднрд┐рдиреНрди рджреЗрд╢реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдХреНрдд рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рд╡рд╣ рдПрдХ рдЕрд▓рдЧ country рддрд░реНрдХ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред
  • рдмреЗрд╕рд┐рдХ-рдСрде рд╣реЗрдбрд░ рд▓реЛрдб-рдмрд┐рдпрд░рд┐рдВрдЧ рд▓рд╛рдЗрди рд╣реИред рдмрд┐рдирд╛ proxy_headers рдХреЗ, рдЖрд╡рд╛рд╕реАрдп рдЧреЗрдЯрд╡реЗ рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрдЯ рдЯрдирд▓ рдХреЛ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЗ рдЕрднрд╛рд╡ рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • Floki рдкрд╛рд░реНрд╕ рдХреА рдЧрдИ рдкреЗрдбрд╝ рдкрд░ рдХреНрд╡реЗрд░реА рдХрд░рддрд╛ рд╣реИ, рдХрдЪреНрдЪреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд░ рдирд╣реАрдВред рд╣рдореЗрд╢рд╛ рдкрд╣рд▓реЗ parse_document/1, рдлрд┐рд░ find/2 тАФ рдЪрдпрдирдХрд░реНрддрд╛ рдкреЗрдбрд╝ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрд▓рд╛рддреЗ рд╣реИрдВред

рдЙрдиреНрдирдд 1: HTTPoison рд╕рдВрд╕реНрдХрд░рдг

HTTPoison Req рд╕реЗ рдкрд╣рд▓реЗ рдХрд╛ рд╣реИ рдФрд░ рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░рд╣рддрд╛ рд╣реИред рдпрд╣ рд╣реИрдХрдиреА рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдЬреЛ рджреЛ рдЕрдиреБрд░реЛрдз рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЙрдХреНрд╕реА рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ: :proxy рдЬреИрд╕реЗ рдПрдХ {host, port} рдпреБрдЧреНрдо рдФрд░ :proxy_auth рдЬреИрд╕реЗ рдПрдХ {user, password} рдпреБрдЧреНрдоред рдореИрдиреНрдпреБрдЕрд▓ рдмреЗрд╕64 рдирд╣реАрдВ тАФ рд╣реИрдХрдиреА рд╣реЗрдбрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ:

elixir Copy
defmodule ElixirScraper.HTTPoisonClient do
  @gateway System.get_env("SCRAPELESS_PROXY_GATEWAY") || "gw-us.scrapeless.io"
  @port 8789

  defp proxy_username(country) do
    channel = System.fetch_env!("SCRAPELESS_CHANNEL_ID")
    "#{channel}-proxy-country_#{country}"
  end

  def fetch(url, country \\ "US") do
    opts = [
      proxy: {@gateway, @port},
      proxy_auth: {proxy_username(country), System.fetch_env!("SCRAPELESS_PROXY_PASS")},
      recv_timeout: 30_000
    ]

    headers = [{"User-Agent", "Mozilla/5.0 (compatible; ElixirScraper/1.0)"}]

    case HTTPoison.get(url, headers, opts) do
      {:ok, %HTTPoison.Response{status_code: 200, body: body}} -> {:ok, body}
      {:ok, %HTTPoison.Response{status_code: code}} -> {:error, {:http, code}}
      {:error, reason} -> {:error, reason}
    end
  end
end

рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЖрдзрд╛ рднрд╛рдЧ рд╕рдорд╛рди рд╣реИ тАФ HTTPoison рдПрдХ рдмреЙрдбреА рд╕реНрдЯреНрд░рд┐рдВрдЧ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдФрд░ Floki рдмрд╛рдХреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП Req рдЪреБрдиреЗрдВ (рдпрд╣ JSON рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯреНрд╕, рдФрд░ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ рдХреЛ рдмрдХреНрд╕реЗ рд╕реЗ рдмрд╛рд╣рд░ рд▓рд╛рддрд╛ рд╣реИ) рдФрд░ HTTPoison рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВред


рдЙрдиреНрдирдд 2: рдкреГрд╖реНрдардмрджреНрдзрддрд╛ рдФрд░ рдкреНрд░реЙрдХреНрд╕реА рдирд┐рдХрд╛рд╕реА рдХреЗ рд╕рд╛рде Crawly рдордХрдбрд╝реА

рдХрд┐рд╕реА рднреА рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдЬреЛ URLs рдХреА рдЫреЛрдЯреА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, Crawly рд╣рд╛рде рд╕реЗ рд░реЛрд▓ рдХреА рдЧрдИ рд▓реВрдк рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдПрдХ рдордХрдбрд╝реА рдЕрдкрдиреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ URLs рдФрд░ рдПрдХ parse_item/1 рдХреЙрд▓рдмреИрдХ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреА рд╣реИ; Crawly рдХрд╛рд░реНрдпрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмреАрдЪ рдЕрдиреБрд░реЛрдз рд╢реЗрдбреНрдпреВрд▓ рдХрд░рддрд╛ рд╣реИ, рдирдП рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓рдмреИрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИ (рдпрд╣реА рдкреГрд╖реНрдардмрджреНрдзрддрд╛ рдХрд╛ рддрд░реАрдХрд╛ рд╣реИ), рдФрд░ parsed рдЖрдЗрдЯрдореЛрдВ рдХреЛ рдПрдХ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдзрдХреЗрд▓рддрд╛ рд╣реИред

рдкреНрд░реЙрдХреНрд╕реА рдХреЛ RequestOptions рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рд╕реАрдзреЗ рдирд┐рдЪрд▓реЗ HTTPoison рдлрд╝реЗрдЪ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдХреАрд╡рд░реНрдб рд╕реВрдЪреА рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП HTTPoison рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╡рд╣реА :proxy рдФрд░ :proxy_auth рд╡рд┐рдХрд▓реНрдк рдордХрдбрд╝реА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдП рдЧрдП рд╣рд░ рдЕрдиреБрд░реЛрдз рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ:

elixir Copy
# config/config.exs
import Config

config :crawly,
  closespider_itemcount: 200,
  concurrent_requests_per_domain: 3,
  middlewares: [
    Crawly.Middlewares.DomainFilter,
    Crawly.Middlewares.UniqueRequest,
    {Crawly.Middlewares.UserAgent,

рдпреВрдЬрд░_рдПрдЬреЗрдВрдЯ: ["Mozilla/5.0 (рд╕рдВрдЧрдд; ElixirScraper/1.0)"]},
{Crawly.Middlewares.RequestOptions,
[
рдкреНрд░реЙрдХреНрд╕реА: {System.get_env("SCRAPELESS_PROXY_GATEWAY", "gw-us.scrapeless.io"), 8789},
рдкреНрд░реЙрдХреНрд╕реА_рдкреНрд░рд╛рдзрд┐рдХрд░рдг:
{"#{System.fetch_env!("SCRAPELESS_CHANNEL_ID")}-proxy-country_US",
System.fetch_env!("SCRAPELESS_PROXY_PASS")},
рд░рд┐рд╕реАрд╡_рдЯрд╛рдЗрдордЖрдЙрдЯ: 30_000
]}
],
рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреНрд╕: [
Crawly.Pipelines.Validate,
{Crawly.Pipelines.DuplicatesFilter, item_id: :title},
Crawly.Pipelines.JSONEncoder,
{Crawly.Pipelines.WriteToFile, extension: "jl", folder: "./output"}
]

Copy
рд╕реНрдкрд╛рдЗрдбрд░ рд╕реНрд╡рдпрдВ рддреАрди рдХреЙрд▓рдмреИрдХ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред `parse_item/1` рджреЛ рдХрд╛рдо рдПрдХ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рд╡рд░реНрддрдорд╛рди рдкреГрд╖реНрда рдкрд░ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЕрдЧрд▓реЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдлреЙрд▓реЛ-рдЕрдк рдЕрдиреБрд░реЛрдз рдмрдирд╛рддрд╛ рд╣реИ - рд╡рд╣ рджреВрд╕рд░рд╛ рд╕реВрдЪреА рдкреГрд╖реНрдареАрдХрд░рдг рдХреЛ рдЪрд╛рд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ:

```elixir
defmodule BooksSpider do
  use Crawly.Spider

  @impl Crawly.Spider
  def base_url, do: "https://books.toscrape.com/"

  @impl Crawly.Spider
  def init, do: [start_urls: ["https://books.toscrape.com/"]]

  @impl Crawly.Spider
  def parse_item(response) do
    {:ok, document} = Floki.parse_document(response.body)

    # рдЗрд╕ рдкреГрд╖реНрда рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдЙрддреНрдкрд╛рдж рдХрд╛рд░реНрдб рд╕реЗ рдПрдХ рдЖрдЗрдЯрдо рдирд┐рдХрд╛рд▓реЗрдВред
    рдЖрдЗрдЯрдо =
      document
      |> Floki.find("article.product_pod")
      |> Enum.map(fn рдХрд╛рд░реНрдб ->
        %{
          рд╢реАрд░реНрд╖рдХ: рдХрд╛рд░реНрдб |> Floki.find("h3 a") |> Floki.attribute("title") |> List.first(),
          рдХреАрдордд: рдХрд╛рд░реНрдб |> Floki.find("p.price_color") |> Floki.text()
        }
      end)

    # рдЕрдЧрд▓реЗ рдкреГрд╖реНрда рдХреЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ: рдпрд╣ рд╕реВрдЪреА Crawly рдХреЛ рдкреГрд╖реНрдареАрдХреГрдд рдХрд░рддреА рд╣реИред
    рдЕрдЧрд▓реЗ_рдЕрдиреБрд░реЛрдз =
      document
      |> Floki.find("li.next a")
      |> Floki.attribute("href")
      |> Enum.map(fn href ->
        href
        |> Crawly.Utils.build_absolute_url(response.request_url)
        |> Crawly.Utils.request_from_url()
      end)

    %Crawly.ParsedItem{items: рдЖрдЗрдЯрдо, requests: рдЕрдЧрд▓реЗ_рдЕрдиреБрд░реЛрдз}
  end
end

рдЗрд╕реЗ iex -S mix рд╕реЗ рдЪрд▓рд╛рдПрдБ:

elixir Copy
Crawly.Engine.start_spider(BooksSpider)

Crawly рд╣рд░ рдкреГрд╖реНрда рдХреЛ li.next a рд▓рд┐рдВрдХ рджреНрд╡рд╛рд░рд╛ рдЪрд▓рд╛рддрд╛ рд╣реИ рдЬреЛ рдХреЙрд▓рдмреИрдХ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдиреНрдп, рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд░рд╣рд┐рдд рдЖрдЗрдЯрдо рдХреЛ ./output/BooksSpider.jl рдореЗрдВ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдФрд░ closespider_itemcount рдкрд░ рд░реБрдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз Scrapeless рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ RequestOptions рдорд┐рдбрд▓рд╡реЗрдпрд░ рдиреЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрд╣рд▓реЗ fetcher рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ :proxy рдФрд░ :proxy_auth рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдХрд┐рдпрд╛ рдерд╛ред

рдЕрдкрдиреА API рдХреБрдВрдЬреА рдореБрдлреНрдд рдпреЛрдЬрдирд╛ рдкрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ: app.scrapeless.com


╪и┘Д╪з┌й╪│ ╪│█Т ╪и┌Ж┘Ж╪з: ╪▒█Б╪з╪ж╪┤█М ╪з█М┌п╪▓┘╣╪М ╪м╪║╪▒╪з┘Б█М╪з╪ж█М ┘╛┘Ж┘Ж┌п╪М ╪з┘И╪▒ ╪и█М┌й ┘╛╪▒█М╪┤╪▒

╪з█М┌й ╪з╪│┌й╪▒┘╛╪▒ ┌й┘И ┘В╪з╪и┘Д ┘╛█М╪┤ ┌п┘И╪ж█М ┘И╪м┘И█Б╪з╪к ┌й█М ╪и┘Ж╪з╪б ┘╛╪▒ ╪и┘Д╪з┌й ┌й█М╪з ╪м╪з╪к╪з █Б█Т╪М ╪з┘И╪▒ ╪з┘Ж ┘Е█М┌║ ╪│█Т ╪▓█М╪з╪п█Б ╪к╪▒ ╪в┘╛ ┌й█Т ┘╛╪з╪│ ┘╛█Б┘Д█Т ╪│█Т ┘Е┘И╪м┘И╪п ╪к╪▒╪к█М╪и ╪│█Т ╪н┘Д █Б┘И ╪│┌й╪к█Т █Б█М┌║:

  • ┌И█М┘╣╪з ╪│█М┘Ж┘╣╪▒ ╪в╪ж█М ┘╛█М ┌й█М ╪┤█Б╪▒╪к█Ф ╪│╪▒┘И╪▒ ┌й█М ╪в╪ж█М ┘╛█М ╪▒█М┘Ж╪м ┘И█Б ┘╛█Б┘Д╪з ╪з╪┤╪з╪▒█Б █Б█Т ╪м┘И ╪з█М┌й ╪и┘И┘╣ ┘Е┘Ж█М╪м╪▒ ┌Ж█М┌й ┌й╪▒╪к╪з █Б█Т█Ф Scrapeless ╪▒█Б╪з╪ж╪┤█М ┘╛╪▒┘И┌й╪│█М ┌й█Т ╪░╪▒█М╪╣█Т ╪▒╪з╪д┘╣┘Ж┌п ┌й┘И ╪п╪▒╪о┘И╪з╪│╪к ┌й█М ╪╖╪▒╪н ╪з█М┌й ╪╣╪з┘Е ┌п┌╛╪▒ ┌й█Т ┌й┘Ж█М┌й╪┤┘Ж ┌й█М ╪╖╪▒╪н ╪п┌й┌╛╪з╪к╪з █Б█Т╪М ╪м┘И ╪в╪ж█М ┘╛█М-╪┤█Б╪▒╪к ╪и┘Д╪з┌й╪│ ┌й█Т ╪о┘Д╪з┘Б ╪│╪и ╪│█Т ╪и┌С╪з ┘Д█М┘И╪▒ █Б█Т█Ф
  • ╪з█М┌п╪▓┘╣ ╪м╪║╪▒╪з┘Б█М█Б█Ф ╪╡┘Б╪н╪з╪к ┘Е┘Д┌й ┌й█Т ┘Д╪н╪з╪╕ ╪│█Т ┘Е┘И╪з╪п ┌й┘И ┌п█М┘╣ ┌й╪▒╪к█Т █Б█М┌║ - ┘В█М┘Е╪к█М┌║╪М ╪з╪│┘╣╪з┌й╪М ╪▒╪╢╪з┘Е┘Ж╪п┌п█М ┌й█М ╪п█М┘И╪з╪▒█М┌║█Ф country_<CC> ╪╡╪з╪▒┘Б ┘Ж╪з┘Е ┌й█Т ╪н╪╡█Т ┌й█Т ╪│╪з╪к┌╛ ┘Е┘Д┌й ┌й┘И ┘╛┘Ж ┌й╪▒█М┌║ ╪к╪з┌й█Б ┘Ж╪к█М╪м█Б ╪з╪│ ┘Е┘В╪з┘Е█М ╪╣┘Д╪з┘В█Т ┌й█Т ╪│╪з╪к┌╛ ┘Е┘Д╪к╪з █Б┘И ╪м╪│█Т ╪в┘╛ ┘╛┌С┌╛┘Ж█Т ┌й╪з ╪з╪▒╪з╪п█Б ╪▒┌й┌╛╪к█Т █Б█М┌║█Ф
  • ╪н┘Е┘Д█Т ┌й█М ╪╖╪▒╪н ┘Д┌п╪к╪з █Б█Т█Ф ╪к┘Е╪з┘Е ╪п╪▒╪о┘И╪з╪│╪к┘И┌║ ┌й█М ╪▓█М╪з╪п█Б ╪│█Т ╪▓█М╪з╪п█Б ┘Е╪к┘И╪з╪▓█М ╪к╪╣╪п╪з╪п тЙд3 ╪п╪▒╪о┘И╪з╪│╪к█М┌║ ┘Б█М ┘Е█М╪▓╪и╪з┘Ж ┘╛╪▒ ╪▒┌й┌╛█М┌║█Ф Task.async_stream ┌й█Т ╪│╪з╪к┌╛╪М █М█Б max_concurrency: 3 █Б█Т╪Ы Crawly ┌й█Т ╪│╪з╪к┌╛╪М █М█Б concurrent_requests_per_domain: 3 █Б█Т█Ф ╪з╪│ ╪│█Т ╪▓█М╪з╪п█Б╪М ╪з█М┌й ╪к┘Ж┌п ╪з┘Ж ┘Б┘Д╪з╪ж┘╣ ┘╛┘И┘Д ╪▓╪▒╪з╪╣╪к ╪│█Т ╪и█Т ╪н╪п ┘Е╪┤╪з╪и█Б █Б█Т█Ф
  • ┌Ирж┐ржл╪з┘Д┘╣ ╪╡╪з╪▒┘Б ╪з█М╪м┘Ж┘╣█Ф Req ╪з┘И╪▒ HTTPoison ╪з█М┌й ┘Д╪з╪ж╪и╪▒█М╪▒█М-┌И█М┘Б╪з┘Д┘╣ UA ╪и┌╛█М╪м╪к█Т █Б█М┌║╪М ╪м╪│█Т ┘Б┘Д┘╣╪▒ ┌й╪▒┘Ж╪з ╪в╪│╪з┘Ж █Б┘И╪к╪з █Б█Т█Ф ╪з█М┌й ╪н┘В█М┘В█М ╪и╪▒╪з╪д╪▓╪▒ ╪╡╪з╪▒┘Б ╪з█М╪м┘Ж┘╣ ┘Е╪▒╪к╪и ┌й╪▒█М┌║ (╪м█М╪│█Т ╪з┘И┘╛╪▒ ┌й█Т ┘Ж┘Е┘И┘Ж┘И┌║ ┘Е█М┌║) █М╪з Crawly ┌й█Т UserAgent ┘Е┌И┘Д ┘И█М╪ж╪▒ ┌й█Т ╪░╪▒█М╪╣█Т ┘Б█Б╪▒╪│╪к ┌й┘И ┌п┌╛┘Е╪з╪ж█М┌║█Ф
  • ┘╛█М╪з╪│╪з ┌й╪▒┘Ж╪з█Ф ╪║█М╪▒-Crawly ┘Д┘И┘╛╪│ ┌й█Т ┘Д╪ж█Т╪М ╪и█М┌Ж┘И┌║ ┌й█Т ╪п╪▒┘Е█М╪з┘Ж ┌Ж┌╛┘И┘╣█Т Process.sleep/1 ┌й█Т ╪│╪з╪к┌╛ ╪п╪▒╪о┘И╪з╪│╪к┘И┌║ ┌й█М ╪м┌п█Б ┌й╪▒█М┌║ ╪и╪м╪з╪ж█Т ╪з╪│ ┌й█Т ┌й█Б ┘╛┘И╪▒█Т ╪│█М┘╣ ┌й┘И ╪з█М┌й ╪│╪з╪к┌╛ ┘Б╪з╪ж╪▒ ┌й╪▒█М┌║█Ф Crawly ╪в┘╛ ┌й█Т ┘Д╪ж█Т ╪з┘╛┘Ж█Т ╪┤█М┌И┘И┘Д╪▒ ┌й█Т ╪░╪▒█М╪╣█Т ╪п╪▒╪о┘И╪з╪│╪к┘И┌║ ┌й█М ╪▒┘Б╪к╪з╪▒ ╪п█М╪к╪з █Б█Т█Ф

█М█Б ┌й┘И╪ж█М ╪╡┘Б╪н█Б ╪и┌Ж╪з┘Ж█Т ┌й█Т ┘Д╪ж█Т ┘Ж█Б█М┌║ █Б█Т ╪м╪│ ┌й╪з ┘Е┘И╪з╪п ┘╛█Б┘Д█Т ┘╛█М┘Ж┘╣ ┌й█Т ╪и╪╣╪п ╪м╪з┘И╪з ╪з╪│┌й╪▒┘╛┘╣ ┌й█Т ╪░╪▒█М╪╣█Б ╪в╪к╪з █Б█Т - █М█Б ╪з┌п┘Д╪з ╪│█М┌й╪┤┘Ж █Б█Т█Ф


JS-█Б█М┘И█М ╪з┘И╪▒ ╪з█М┘Ж┘╣█М-╪и┘И┘╣ ╪з█Б╪п╪з┘Б: Scrapeless Scraping Browser ┌й█Т ╪░╪▒█М╪╣█Т ╪▒╪з╪│╪к█Б ╪и┘Ж╪з┘Ж╪з

Req╪М HTTPoison╪М ╪з┘И╪▒ Crawly ╪к┘Е╪з┘Е ╪з╪╡┘Д ╪│█Т ╪в┘Ж█Т ┘И╪з┘Д█Т ╪и╪з╪ж┘╣╪│ ┌й┘И ┘И╪з┘╛╪│ ┌й╪▒╪к█Т █Б█М┌║█Ф ╪з█М┌й React╪М Vue╪М █М╪з Next.js ╪з█М┘╛ ┌й█Т ┘Д╪ж█Т╪М ┘И█Б ╪и╪з╪ж┘╣╪│ ╪з█М┌й ╪о╪з┘Д█М ╪┤█М┘Д ┌й█Т ╪│╪з╪к┌╛ ╪│╪з╪к┌╛ ╪з█М┌й ╪з╪│┌й╪▒┘╛┘╣ ┘╣█М┌п █Б█М┌║ - ┘Е┘И╪з╪п ┌й┘Д╪з╪ж┘Ж┘╣ ┌й█Т ╪│╪з╪ж█М┌И ┘╛╪▒ ┘╛█М┘Ж┘╣ █Б┘И╪к╪з █Б█Т╪М ╪з┘И╪▒ Floki ╪з█М┌й ╪о╪з┘Д█М ╪п╪▒╪о╪к ┌й┘И ╪к╪м╪▓█М█Б ┌й╪▒╪к╪з █Б█Т█Ф ╪з█М┌й ╪│╪▒┘И╪▒ ╪│╪з╪ж█М┌И HTTP ┌й┘Д╪з╪ж┘Ж┘╣ ╪з╪│ ╪м╪з┘И╪з ╪з╪│┌й╪▒┘╛┘╣ ┌й┘И ┘Ж█Б█М┌║ ┌Ж┘Д╪з ╪│┌й╪к╪з╪Ы ╪з█М┌й ┌й┘Д╪з╪д┌И ╪и╪▒╪з╪д╪▓╪▒ ┌й╪▒ ╪│┌й╪к╪з █Б█Т█Ф

╪з█М┘Д█М┌й╪│█М╪▒ ╪│█Т Scrapeless Scraping Browser ╪к┌й ┘╛█Б┘Ж┌Ж┘Ж█Т ┌й█Т ╪п┘И ╪╖╪▒█М┘В█Т █Б█М┌║╪М ╪з┘И╪▒ ┘И█Б ╪з█М┌й ╪н┘В█М┘В█М ┘И╪▒┌й ┘Д┘И┌И ┌й█Т ╪п┘И ┘Ж╪╡┘Б┘И┌║ ╪│█Т ┘Е┘Д╪к█Т █Б█М┌║█Ф

(a) Scrapeless ╪▒█Б╪з╪ж╪┤█М ┘╛╪▒┘И┌й╪│█М ┌й█Т ╪░╪▒█М╪╣█Т HTTP ╪п╪▒╪о┘И╪з╪│╪к█М┌║ тАФ ╪к█М╪з╪▒ ┌й╪▒╪п█Б ╪з┌й╪л╪▒█М╪к

рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рд╛рдЗрдЯреЛрдВ рдкрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреГрд╖реНрда рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП HTML рдХреЗ ╪│╪з╪к┌╛ рдЖрддреЗ рд╣реИрдВред рдЙрдирдХреЗ рд▓рд┐рдП, рдКрдкрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓-рдкреНрд░реЙрдХреНрд╕реА рд╕реНрддрд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЙрддреНрддрд░ рд╣реИ: Req рдФрд░ HTTPoison рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рд░реЗрдЬрд┐рдбреЗрдВрд╢рд┐рдпрд▓ рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╛рд╣рд░ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдЖрдИрдкреА-рдкреНрд░рддрд┐рд╖реНрдард╛ рдЧреЗрдЯ рдФрд░ рднреВ-рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд╕рд╛рдл рдХрд░рддрд╛ рд╣реИред рдЙрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЗрд╕ рд╕реНрддрд░ рдХреЛ рдмрдирд╛рдП рд░рдЦреЗрдВ рдЬреЛ рд╕реАрдзреЗ рд╕рд╛рдордЧреНрд░реА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ тАФ рдпрд╣ рд╕рдмрд╕реЗ рд╕рд╕реНрддрд╛ рд░рд╛рд╕реНрддрд╛ рд╣реИ, рдФрд░ рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдХреА рд╕рдорд╡рд░реНрддреАрддрд╛ рдЗрд╕реЗ рддреЗрдЬ рдмрдирд╛рддреА рд╣реИред

(рдмреА) рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ тАФ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб-рд░реЗрдВрдбрд░ рдХреА рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ

рдПрд▓рд┐рдХреНрд╕рд┐рд░ Chrome DevTools рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдиреЛрдб рдпрд╛ рдкрд╛рдпрдерди рдХреА рддрд░рд╣ рд╕рд╛рдл рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд░реЗрдВрдбрд░ рдХреА рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЗ рд▓рд┐рдП рдЖрджрд░реНрд╢ рдХрджрдо рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдХреЛ рд╕рдВрдпреЛрдЬрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рдПрдХ рдЫреЛрдЯреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рд╣рд╛рдпрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Scrapeless Scraping Browser рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реИред рдПрд▓рд┐рдХреНрд╕рд┐рд░ рд╕рд╣рд╛рдпрдХ рдХреЛ System.cmd/3 рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╛рд╣рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдкреЙрди рдХрд░рддрд╛ рд╣реИ, рд╕рд╣рд╛рдпрдХ рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝рд┐рдд WebSocket рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рдХрдиреЗрдХреНрдЯ рд╣реЛрддрд╛ рд╣реИ, рдкреГрд╖реНрда рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдФрд░ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ HTML рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдХреЛ рд╡рд╛рдкрд╕ рдкреНрд░рд┐рдВрдЯ рдХрд░рддрд╛ рд╣реИ - рдЬреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдХреА рддрд░рд╣ рдлреНрд▓реЛрдХреА рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред

рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдВрдбрдкреЙрдЗрдВрдЯ рдПрдХрд▓ WebSocket URL рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХрд╛ API рдХреБрдВрдЬреА рдФрд░ рд╕рддреНрд░ рдкреИрд░рд╛рдореАрдЯрд░ рдХреНрд╡реЗрд░реА рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рд╣реИрдВред рдПрдХ рдиреНрдпреВрдирддрдо рдкрд╛рдпрдерди рд░реЗрдВрдбрд░рд░ (рдЬрд┐рд╕реЗ render.py рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ) рдЗрд╕реЗ Playwright рдХреЗ рд╕рд╛рде рдХрдиреЗрдХреНрдЯ рдХрд░рддрд╛ рд╣реИ:

python Copy
# render.py тАФ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд░реЗрдВрдбрд░ рдХреА рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЗ рд▓рд┐рдП ELixir рджреНрд╡рд╛рд░рд╛ System.cmd/3 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ред
import os
import sys
from urllib.parse import urlencode
from playwright.sync_api import sync_playwright

def scraping_browser_url(proxy_country="US", session_ttl=240):
    params = urlencode({
        "token": os.environ["SCRAPELESS_API_KEY"],
        "sessionTTL": session_ttl,
        "proxyCountry": proxy_country,
    })
    return f"wss://browser.scrapeless.com/api/v2/browser?{params}"

def render(url, country="US"):
    with sync_playwright() as p:
        browser = p.chromium.connect_over_cdp(scraping_browser_url(country))
        context = browser.contexts[0] if browser.contexts else browser.new_context()
        page = context.pages[0] if context.pages else context.new_page()
        # рдкрд╣рд▓реЗ рд╣реЛрдордкреЗрдЬ рдХреЛ рд╡рд╛рд░реНрдо рдХрд░реЗрдВ, рдлрд┐рд░ рд▓рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдПрдВред
        page.goto("https://quotes.toscrape.com/", wait_until="load")
        page.goto(url, wait_until="networkidle")
        html = page.content()
        browser.close()
        return html

if __name__ == "__main__":
    sys.stdout.write(render(sys.argv[1], sys.argv[2] if len(sys.argv) > 2 else "US"))

рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреНрд▓рд╛рдЙрдб-рд╕рд╛рдЗрдб Scrapeless рдХреЗ рдПрдВрдЯреА-рдбрд┐рдЯреЗрдХреНрд╢рди рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЪрд▓рддреА рд╣реИ; рд▓реЛрдХрд▓ Playwright рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди рдХреЗрд╡рд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИред рд▓рдХреНрд╖рд┐рдд рдкреГрд╖реНрда рдкрд░ рдЬрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реЛрдордкреЗрдЬ рдХреЛ рд╡рд╛рд░реНрдо рдХрд░рдирд╛ рдХреБрдХреАрдЬрд╝ рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреЛ рдмреАрдЬ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рд░ рдЖрдЧрдВрддреБрдХреЛрдВ рдкрд░ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд╛рдлрд╝ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓рддреА рд╣реИред

рдПрд▓рд┐рдХреНрд╕рд┐рд░ рд╕реЗ, рдХреЙрд▓-рдЖрдЙрдЯ рдФрд░ рдкрд╛рд░реНрд╕ рдПрдХ рд╣реА рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВред System.cmd/3 рдХреЙрд▓рд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рд╕рд╣рд╛рдпрдХ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯрддрд╛ тАФ Task рдХреЗ рдЕрдВрджрд░ рдареАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдмреАрдо рд╣рд░ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ:

elixir Copy
defmodule ElixirScraper.CloudBrowser do
  @doc """
  Scrapeless Scraping Browser рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ JS-рднрд╛рд░реА `url` рд░реЗрдВрдбрд░ рдХрд░реЗрдВ рдФрд░
  рдлреНрд▓реЛрдХреА рдХреЗ рд▓рд┐рдП рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ-рдкреЗрдВрдЯ HTML рд▓реМрдЯрд╛рдПрдВред
  """
  def render(url, country \\ "US") do
    case System.cmd("python", ["render.py", url, country], stderr_to_stdout: true) do
      {html, 0} -> {:ok, html}
      {output, code} -> {:error, {:render_failed, code, output}}
    end
  end

  def quotes(url) do
    with {:ok, html} <- render(url),
         {:ok, document} <- Floki.parse_document(html) do
      texts = document |> Floki.find("span.text") |> Floki.text()
      authors = document |> Floki.find("small.author") |> Floki.text()
      {:ok, %{quotes: texts, authors: authors}}
    end
  end
end

рдкрд╣рд▓реЗ/рдмрд╛рдж рдореЗрдВ рд╕рд╛рд░рд╛ рдореБрджреНрджрд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг Req.get рдкрд░ https://quotes.toscrape.com/js/ 0 рдХреЛрдЯ рддрддреНрд╡ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ HTTP рдкреГрд╖реНрда рдХреЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред ElixirScraper.CloudBrowser.render/2 рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╣реА URL рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд░реЗрдВрдбрд░ рдХреА рдЧрдИ DOM рдХреЗ рд╕рд╛рде рд╕рднреА 10 рдХреЛрдЯреНрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдиреЗ рдкрд╣рд▓реЗ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪрд▓рд╛рдпрд╛ред рдпрд╣ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡реНрдпрд╡рд╣рд╛рд░ рд╣реИ, рди рдХрд┐ рдПрдХ рдЯреНрдпреВрдирд┐рдВрдЧ рдЯреНрд░рд┐рдХред

рдПрдХ рд╕реНрддрд░рд┐рдд рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ Req рдХреЗ рд╕рд╛рде рдлрд╝реЗрдЪ рдХрд░реЗрдВ, рдЙрди рддрддреНрд╡реЛрдВ рдХреА рдЧрд┐рдирддреА рдХрд░реЗрдВ рдЬрд┐рдирдХреА рдЖрдк рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рдЙрди рдкреГрд╖реНрдареЛрдВ рдХреЛ CloudBrowser.render/2 рдкрд░ рд▓реЗ рдЬрд╛рдПрдБ рдЬреЛ рдЦрд╛рд▓реА рд▓реМрдЯрддреЗ рд╣реИрдВред рдПрд▓рд┐рдХреНрд╕рд┐рд░ рдХрд╛ Task.async_stream HTTP рд╕реНрддрд░ рдХреЛ рдЪреМрдбрд╝рд╛ рдФрд░ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрддрд░ рдХреЛ рд╕рдВрдХрд░рд╛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕рддреНрд░ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рджреБрд░реНрд▓рдн рд╣реЛрддреЗ рд╣реИрдВ тАФ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрддрд░ рдХреЛ max_concurrency: 3 рдкрд░ рд░рдЦреЗрдВред


рд╕рдорд╕реНрдпрд╛ рдирд┐рд╡рд╛рд░рдг

рд▓рдХреНрд╖рдг рд╕рдВрднрд╛рд╡рд┐рдд рдХрд╛рд░рдг рд╕реБрдзрд╛рд░
рдлреНрд▓реЛрдХреА рдПрдХ рдЪрдпрдирдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП [] рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдореМрдЬреВрдж рд╣реИ рдкреГрд╖реНрда рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ; HTTP рдиреЗ рдПрдХ рдРрдк рд╢реЗрд▓ рд▓реМрдЯрд╛рдпрд╛ URL рдХреЛ CloudBrowser.render/2 рдкрд░ рдмрдврд╝рд╛рдПрдВ; рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ HTML рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ
рдкреНрд░реЙрдХреНрд╕реА рдХрдиреЗрдХреНрдЯ рдЕрд╕реНрд╡реАрдХреГрдд / 407 рдЧреЗрдЯрд╡реЗ рд╕реЗ рдореВрд▓-рдмреБрдирд┐рдпрд╛рджреА рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓реНрд╕ рдЧрд╛рдпрдм рдпрд╛ рдЧрд▓рдд proxy_headers (Req) рдпрд╛ :proxy_auth (HTTPoison) рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╣реЛ
Floki.parse_document {:error, ...} рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдмреЙрдбреА HTML рдирд╣реАрдВ рд╣реИ (JSON API, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдкреГрд╖реНрда, рдпрд╛ рдЦрд╛рд▓реА) resp.status рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ; JSON рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рд╢рд░реАрд░ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдбрд┐рдХреЛрдб рдХрд░реЗрдВ
рдХрд┐рд╕реА рднреА country_<CC> рдХреЗ рдмрд╛рд╡рдЬреВрдж рд╕рдорд╛рди рд╕рд╛рдордЧреНрд░реА рдпрд╣ рдкреГрд╖реНрда рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реИ, рдпрд╛ рджреЗрд╢ рдЦрдВрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЦрдВрдб рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ; рдХреБрдЫ рдкреГрд╖реНрда рдкреВрд░реА рддрд░рд╣ рд╕реЗ рднреМрдЧреЛрд▓рд┐рдХ рд░реВрдк рд╕реЗ рдмрдВрдж рдирд╣реАрдВ рд╣реИрдВ
рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрдЬрд╛рдп рдкрд╣реБрдВрдЪ-рд╡рд┐рд░реЛрдзреА рдпрд╛ рдЪреБрдиреМрддреА рдЗрдВрдЯрд░рд╕реНрдЯрд┐рд╢рд┐рдпрд▓ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ рдирд┐рдХрд╛рд╕реА рдпрд╛ рдкрд╣рд▓реЗ рджреМрд░реЗ рдХрд╛ рдЧреЗрдЯ рдЖрд╡рд╛рд╕реАрдп рдИрдЧреНрд░рд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд░реЗрдВ рдФрд░ рд▓рдХреНрд╖реНрдп рдкреГрд╖реНрда рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕реА рд╕рддреНрд░ рдореЗрдВ рд╕рд╛рдЗрдЯ рдХреЗ рд╣реЛрдордкреЗрдЬ рдХреЛ рдЧрд░реНрдо рдХрд░реЗрдВ
Crawly рдПрдХ рдкреГрд╖реНрда рдХреЗ рдмрд╛рдж рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ parse_item/1 рдиреЗ рдХреЛрдИ рдлреЙрд▓реЛ-рдЕрдк рдЕрдиреБрд░реЛрдз рдирд╣реАрдВ рд▓реМрдЯрд╛рдП рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВ рдХрд┐ рдЕрдЧрд▓реА рдкреГрд╖реНрда рдЪрдпрдирдХрд░реНрддрд╛ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдФрд░ Crawly.Utils.request_from_url/1 рдкреНрд░рддреНрдпреЗрдХ рдкреВрд░реНрдг URL рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИ
System.cmd рдХреЗ рд╕рд╛рде :enoent рддреНрд░реБрдЯрд┐рдпрд╛рдВ python рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп PATH рдкрд░ рдирд╣реАрдВ рд╣реИ рдкреВрд░реНрдг рд╡реНрдпрд╛рдЦреНрдпрд╛рдХрд╛рд░ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдпрд╛ рдЗрд╕реЗ рдПрдХ рд╢реЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ рдЬреЛ рдЗрд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ

рдЪрдпрдирдХрд░реНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдПрдХ рдиреЛрдЯ: рдЬрдм рдПрдХ рд▓рдХреНрд╖реНрдп рд╕рд╛рдЗрдЯ рдЕрдкрдиреЗ рдорд╛рд░реНрдХрдЕрдк рдХреЛ рдкреБрдирд░реНрд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рддреА рд╣реИ, рддреЛ рдЖрдкрдХреА Floki.find/2 рдХреЙрд▓ рдЪреБрдкрдЪрд╛рдк рдЦрд╛рд▓реА рд╕реВрдЪрд┐рдпреЛрдВ рдХреЛ рд▓реМрдЯрд╛рддреА рд╣реИрдВ рдмрдЬрд╛рдп рдЙрдард╛рдиреЗ рдХреЗред рдЬрдм рдХреЛрдИ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕реНрдХреНрд░реИрдкрд░ рдЦрд╛рд▓реА рд▓реМрдЯ┘Ж█Т рд▓рдЧрддрд╛ рд╣реИ рддреЛ рдирдП DOM рдХреЗ рдЦрд┐рд▓рд╛рдл рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рдХрд╕реЗрдВ - рдЦрд╛рд▓реА рд╕реВрдЪреА рдХреЛ рдирд┐рд░реАрдХреНрд╖рдг рдХрд╛ рд╕рдВрдХреЗрдд рдорд╛рдиреЗрдВ, рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВред


рдирд┐рд╖реНрдХрд░реНрд╖: рдЖрдкрдХрд╛ Elixir рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рд╕реНрдХреЗрд▓ рдХрд░реЗрдВ

Elixir рдкреИрдЯрд░реНрди рдЪрд╛рд░ рдХрджрдореЛрдВ рдореЗрдВ рд╕рд┐рдордЯрддрд╛ рд╣реИред Scrapeless рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕рд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Req рдпрд╛ HTTPoison (рдпрд╛ Crawly рдХреЛ рдлреЗрдЪрд┐рдВрдЧ рдХрд╛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рджреЗрдВ) рдХреЗ рд╕рд╛рде рдлреЗрдЪ рдХрд░реЗрдВ; Floki рдХреЗ CSS рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдкрд╛рд░реНрд╕ рдХрд░реЗрдВ; parse_item/1 рд╕реЗ рдлреЙрд▓реЛ-рдЕрдк рдЕрдиреБрд░реЛрдз рд▓реМрдЯрд╛рдХрд░ рдкреГрд╖реНрдард╛рдВрдХрди рдХрд░реЗрдВ; рдФрд░ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ-рд░реЗрдВрдбрд░реНрдб рдЕрд▓реНрдкрд╕рдВрдЦреНрдпрдХ рдХреЛ Scrapeless рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рддрдХ рдмрдврд╝рд╛рдПрдБ, рдЬрд┐рд╕реЗ Elixir рд╕реЗ рдПрдХ рдмрд╛рд╣рд░реА рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЙрд▓-рдЖрдЙрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣реБрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ BEAM рд╕реЗ рд╕реАрдзреЗ CDP рдмреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣реЗрдВред

рдпрд╣рд╛рдВ рд╕реЗ рд╡рд╣реА рдЖрдХрд╛рд░ рдмрдбрд╝реЗ рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЖрд╡рд╛рд╕реАрдп-рдкреНрд░реЙрдХреНрд╕реА рдкрд░рдд рдХреА рдЧрд╣рд░рд╛рдИ рдХреЗ рд▓рд┐рдП, рджреЗрдЦреЗрдВ SSL рдкреНрд░реЙрдХреНрд╕реА рдХреНрдпрд╛ рд╣реИ?ред рдЬрд╣рд╛рдЬ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ: рднреМрдЧреЛрд▓рд┐рдХ рдмрдВрдзрд┐рдд рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рд┐рдП country_<CC> рдХреЛ рдкрд┐рди рдХрд░реЗрдВ, рдкреНрд░рддрд┐ рдореЗрдЬрд╝рдмрд╛рди тЙд3 рдкрд░ рд╕рдорд╛рдВрддрд░рддрд╛ рдмрдирд╛рдП рд░рдЦреЗрдВ, рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рдПрдЬреЗрдВрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдЕрдиреБрдкрд╕реНрдерд┐рдд рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдирд▓ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдорд╛рдиреЗрдВ, рдФрд░ HTTP рд╕реНрддрд░ рдХреЛ рдЪреМрдбрд╝рд╛ рдФрд░ рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрддрд░ рдХреЛ рд╕рдВрдХреАрд░реНрдг рд░рдЦреЗрдВред


рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ AI-рд╕рдХреНрд╖рдо рдбреЗрдЯрд╛ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ?

рд╣рдорд╛рд░реЗ рд╕рдореБрджрд╛рдп рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ, рдПрдХ рдореБрдлреНрдд рдпреЛрдЬрдирд╛ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░реЗрдВ рдФрд░ Elixir рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдЬреБрдбрд╝реЗрдВ: Discord ┬╖ Telegramред

рдлреНрд░реА рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП app.scrapeless.com рдкрд░ рд╕рд╛рдЗрди рдЕрдк рдХрд░реЗрдВ рдФрд░ рдКрдкрд░ рджрд┐рдП рдЧрдП рдкреИрдЯрд░реНрди рдХреЛ рдЙрди рдкреГрд╖реНрдареЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рдореЗрдВ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рдирдХреА рдЖрдкрдХреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЛ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреВрд░реНрдг рд╕рдВрджрд░реНрдн docs.scrapeless.com рдкрд░ред


рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ Elixir рдХреЗ рд╕рд╛рде рд╡реЗрдм рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХрд╛рдиреВрдиреА рд╣реИ?

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

рдкреНрд░рд╢реНрди: рдХреНрдпрд╛ рдореБрдЭреЗ Elixir рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдкреНрд░реЙрдХреНрд╕реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

рдХреБрдЫ рднреА рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рд╛рдБред рдХрд┐рд╕реА рд╕рд░реНрд╡рд░ рдХрд╛ рдбреЗрдЯрд╛ рд╕реЗрдВрдЯрд░ IP рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣реИ рдЬрд┐рд╕реЗ рдПрдХ рдмреЙрдЯ рдкреНрд░рдмрдВрдзрдХ рдЭрдВрдбрд╛ рд▓рдЧрд╛рддрд╛ рд╣реИ, рдФрд░ рдЖрд╡рд╛рд╕реАрдп рдИрдЧреНрд░рд╕ рдЙрди рдмреНрд▓реЙрдХреЛрдВ рдХреЛ рддреЗрдЬрд╝реА рд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЬрдм рднреА рдПрдХ рдкреГрд╖реНрда рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ рдкреНрд░реЙрдХреНрд╕реА рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред Scrapeless 195+ рджреЗрд╢реЛрдВ рдореЗрдВ рдЖрд╡рд╛рд╕реАрдп рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ - country_<CC> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдЦрдВрдб рд╕реЗрдЯ рдХрд░реЗрдВ рдФрд░ Req, HTTPoison, рдпрд╛ Crawly рдХреЛ рдЧреЗрдЯрд╡реЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд░реЗрдВ, рддрд╛рдХрд┐ рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ IPs рдХреЛ рд╕реНрд░реЛрдд рдФрд░ рдШреБрдорд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рдкрдбрд╝реЗред

рдкреНрд░рд╢реНрди: рдореБрдЭреЗ Req рдпрд╛ HTTPoison рдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП, Req: рдпрд╣ JSON рдбрд┐рдХреЛрдбрд┐рдВрдЧ, рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдлреЙрд▓реЛрдЗрдВрдЧ, рдФрд░ рдлрд┐рдиреНрдЪ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрдиреЗрдХреНрд╢рди рдкреВрд▓рд┐рдВрдЧ рдХреЛ рд╢рд┐рдк рдХрд░рддрд╛ рд╣реИ, рдХрдо рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд╕рд╛рдеред рдЬрдм рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реЛрдВ рдпрд╛ рдпрджрд┐ рдЖрдк рд╣реИрдХрдиреА рдХреЗ :proxy / :proxy_auth рдЯреНрдпреВрдкрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ HTTPoison рдЪреБрдиреЗрдВред рджреЛрдиреЛрдВ Floki рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдкрд╛рд░реНрд╕ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЪреБрдирд╛рд╡ рдЧреНрд░рд╛рд╣рдХ рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ, рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВред

рдкреНрд░рд╢реНрди: рдореБрдЭреЗ рд╕рд╛рдзрд╛рд░рдг HTTP рдХреА рдмрдЬрд╛рдп Scrapeless рд╕реНрдХреНрд░реИрдкрд┐рдВрдЧ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдм рдЪрд╛рд╣рд┐рдП?

рдЬрдм рдЖрдкрдХреЗ рдЧреНрд░рд╛рд╣рдХ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ HTML рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдРрдк рд╢реЗрд▓ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЛрдИ рд╕рд╛рдордЧреНрд░реА рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рд╕рдВрдХреЗрдд: рдПрдХ рдЪрдпрдирдХрд░реНрддрд╛ рдЬрд┐рд╕реЗ рдЖрдк рдПрдХ рдЕрд╕рд▓реА рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ Floki рд╕реЗ рдЦрд╛рд▓реА рд╕реВрдЪреА рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╡рд╣ рдкреГрд╖реНрда рдЧреНрд░рд╛рд╣рдХ-рдкрдХреНрд╖реАрдп рд░реВрдк рд╕реЗ рд░реЗрдВрдбрд░ рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд╕рд░реНрд╡рд░-рдкрдХреНрд╖реАрдп HTTP рдХреНрд▓рд╛рдЗрдВрдЯ рдХрднреА рднреА рдбреЗрдЯрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддрд╛ред рдЙрди URLs рдХреЛ рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реВрдЯ рдХрд░реЗрдВ, рдЬреЛ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рддрд╛ рд╣реИ - рдФрд░ рдЙрди рдкреГрд╖реНрдареЛрдВ рдкрд░ рд╕рд╛рдзрд╛рд░рдг HTTP рд░рдЦреЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рд╛рдордЧреНрд░реА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред

рдкреНрд░рд╢реНрди: Elixir рд╕реЗ рд╕реАрдзреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрдЬрд╛рдп рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╣реЗрд▓реНрдкрд░ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИ?

рдПрд▓реАрдХреНрд╕рд┐рд░ рдХреЗ рдкрд╛рд╕ рдиреЛрдб рдФрд░ рдкрд╛рдпрдерди рдХреА рддрд░рд╣ рдПрдХ рдкрд╣рд▓реЗ рд╢реНрд░реЗрдгреА рдХрд╛ рдХреНрд░реЛрдо рдбреЗрд╡рдЯреВрд▓реНрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдЪрд╛рд▓рдХ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рд╕рд╛рдл рдкреИрдЯрд░реНрди рдПрд▓реАрдХреНрд╕рд┐рд░ рдХреЛ рд╕рдордиреНрд╡рдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП System.cmd/3 рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдПрдХ рдЫреЛрдЯреЗ рдмрд╛рд╣рд░реА рд╕рд╣рд╛рдпрдХ рдХреЛ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕реМрдВрдкрддрд╛ рд╣реИред рдПрд▓реАрдХреНрд╕рд┐рд░ рдЕрднреА рднреА рдХреНрд░реЙрд▓ рд▓реВрдк, рд╕рд╣-рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдХреА рд╕реАрдорд╛рдПрдБ, рдкреГрд╖реНрдард╛рдВрдХрди рдФрд░ рдлреНрд▓реЛрдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИ; рдХреЗрд╡рд▓ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдирд┐рд╖реНрдкрд╛рджрди рдХреНрд▓рд╛рдЙрдб рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрд▓реАрдХреНрд╕рд┐рд░ рдХреЛрдб рдХреЛ рд╢рд╛рд╕реНрддреНрд░реАрдп рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╛рд╣рд░реА рдХреЙрд▓ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЛ рд╕рд░рд▓ рдмрдирд╛рддрд╛ рд╣реИред

рдкреНрд░рд╢реНрди: рдореБрдЭреЗ рдХрд┐рддрдиреА рд╕рдорд╡рд░реНрддреА рдЕрдиреБрд░реЛрдз рдЪрд▓рд╛рдиреЗ рдЪрд╛рд╣рд┐рдП?

тЙд3 рдкреНрд░рддрд┐ рд╣реЛрд╕реНрдЯ рдкрд░ рдЯрд┐рдХреЗрдВред Task.async_stream рдХреЗ рд╕рд╛рде, max_concurrency: 3 рд╕реЗрдЯ рдХрд░реЗрдВ; Crawly рдХреЗ рд╕рд╛рде, concurrent_requests_per_domain: 3 рд╕реЗрдЯ рдХрд░реЗрдВред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреИрдЯрд▓реЙрдЧ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╕рд╣рди рдХрд░рддреЗ рд╣реИрдВ, рдПрдВрдЯреА-рдмреЙрдЯ рд╕реБрд░рдХреНрд╖рд╛ рд╡рд╛рд▓реЗ рдореВрд▓ рдХрдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди 3 рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИ рдЬреЛ рдЗрди-рдлреНрд▓рд╛рдЗрдЯ рдкреВрд▓ рдХреЛ рдПрдХ рд╣рдорд▓реЗ рдХреА рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЙрдб-рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╕реНрддрд░ рдХреЛ рдФрд░ рднреА рд╕рдВрдХреАрд░реНрдг рд░рдЦреЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рд░реЗрдВрдбрд░реНрдб рд╕рддреНрд░ HTTP рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рджреБрд░реНрд▓рдн рд╣реЛрддреЗ рд╣реИрдВред

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

рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд▓реЗрдЦ

рд╕реВрдЪреА