
рдореБрдЭреЗ рдЕрдкрдиреА рд╕рд╛рдЗрдЯреЛрдВ рдХреЛ рдЯреВрдЯреЗ рд╣реБрдП рдФрд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд▓рд┐рдВрдХ рдХреЗ рдПрдХ рд╕рд╛рдкреНрддрд╛рд╣рд┐рдХ рдЪреЗрдХ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рд╕рд░реНрдлрд┐рдВрдЧ рдореЗрдВ рдЖрдзреЗ рдШрдВрдЯреЗ рдмрд┐рддрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдХрдИ рдЕрдЪреНрдЫреЗ рдХрдВрд╕реЛрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдорд┐рд▓реЗ (рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдВрдбреЛрдЬ рдкрд░ рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ, рдореИрдВ рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдЯрд╛рд╕реНрдХрд╢реЗрдбрд░реНрдпреВрд▓рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛)ред рд╡реЗ рд╕рднреА рднреБрдЧрддрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓реЗред рдФрд░ рдЪреВрдВрдХрд┐ рдореИрдВ рдЦреБрдж рдХреЛ рдХреБрдЫ рдЦрд╛рд▓реА рд╕рдордп рджреЗ рд╕рдХрддрд╛ рдерд╛, рдФрд░ рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдпрд╣ рдХрд╛рдо рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЦреБрдж рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред
рдореИрдВрдиреЗ рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрд░
рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ
рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:
рд╡реЗрдмрд╕реНрдкрд╛рдЗрдбрд░ , рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдЕрдВрдд рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рд▓рдЧрднрдЧ рд╣рд░ рдЪреАрдЬ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ рдЬреИрд╕рд╛ рдХрд┐ рдореБрдЭреЗ рдкрд╕рдВрдж рд╣реИред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕ рдмрд╛рдд рдХреА рдПрдХ рдЫреЛрдЯреА рд╕реВрдЪреА рдмрдирд╛ рд▓реА рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдереЛрдбрд╝рд╛-рдереЛрдбрд╝рд╛ рдХрд░рдХреЗ рдореИрдВ рдЗрд╕реЗ рд╕реЗ рдХрд╛рд░реНрдп рдХреЛ рдкрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ:
рдХрд╛рд░реНрдп | рд╡рд┐рд╡рд░рдг | рд╕реНрдерд┐рддрд┐ |
рд╕рднреА рд▓рд┐рдВрдХ рдХреЛ рдкреБрди: рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдВ | рдПрдХ рд╕рд╛рдЗрдЯ рдХреЗ рднреАрддрд░ рд╕рднреА рдкреГрд╖реНрдареЛрдВ рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд╕рднреА рд▓рд┐рдВрдХ рдПрдХрддреНрд░ рдХрд░реЗрдВ | рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ |
рдПрди рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ | рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрди рд▓рд┐рдВрдХ рдХреА рдЬрд╛рдБрдЪ рдХреЗ рдмрд╛рдж рд░реБрдХреЗрдВ | рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ |
рдлрд╝рд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВ | TXT рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВ | рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ |
HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬреЗрдВ | рдЫрд╛рдирдиреЗ рдФрд░ рдЫрдБрдЯрд╛рдИ рдХреЗ рд▓рд┐рдП рдкрдардиреАрдпрддрд╛ + рдкреЗрдВрдЪ jquery рдбреЗрдЯрд╛ рдЯреЗрдмрд▓ рдкреНрд▓рдЧрдЗрди | рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ |
рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджрд┐рдЦрд╛рдПрдВ | рдлрд╝рд╛рдЗрд▓ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЯреВрдЯреЗ рд▓рд┐рдВрдХ рджрд┐рдЦрд╛рдПрдВ | рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ |
рдкреБрд░рд╛рд▓реЗрдЦ рд░рд┐рдкреЛрд░реНрдЯ рдлрд╝рд╛рдЗрд▓ рд╡рд┐рдХрд▓реНрдк | 7zip рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
рдкрд░рд┐рдгрд╛рдо рдИрдореЗрд▓ рдХрд░реЗрдВ | рдХрдВрд╕реЛрд▓ рдореЗрд▓рд░ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢ рджрд┐рдЦрд╛рдПрдБ | рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рд╕рднреА рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ рдФрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
рд▓реЙрдЧрд┐рдВрдЧ рдЬреЛрдбрд╝реЗрдВ | Log4Net рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рдЬреЛрдбрд╝реЗрдВ | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдЬрд╛рдирдХрд╛рд░реА | рджрд┐рдЦрд╛рдПрдВ рдХрд┐ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХрдм рд╢реБрд░реВ рд╣реБрдИ, рдХрдм рд╕рдорд╛рдкреНрдд рд╣реБрдИ, рдФрд░ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдЬрд╛рдирдХрд╛рд░реА | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
рд╕рд╣реА рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдЬрд╛рдВрдЪреЗрдВ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ | | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
app.config рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди | рдЪреВрдВрдХрд┐ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ app.config рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ | рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ |
рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд░рдо рдЕрдкрдорд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╣реИ:
1. рдЗрдирдкреБрдЯ рдПрдХ рдпреВрдЖрд░рдЖрдИ рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЬрд╛рддреА рд╣реИ рдФрд░ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд╛рдордЧреНрд░реА рдореЗрдВ рд▓рд┐рдВрдХ рдЦреЛрдЬреЗ рдЬрд╛рддреЗ рд╣реИрдВ:
public const string UrlExtractor = @"(?: href\s*=)(?:[\s""']*)(?!#|mailto|location.|javascript|.*css|.*this\.)(?<url>.*?)(?:[\s>""'])";
2. рд╕рднреА рд▓рд┐рдВрдХ рдкрд╛рдП рдЧрдП, рдпрджрд┐ рд╡реЗ рдЗрд╕ рд╕рд╛рдЗрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╣реИрд╢рдЯреЗрдмрд▓ рдореЗрдВ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдирд┐рд░рдкреЗрдХреНрд╖ рдпреВрдЖрд░рдЖрдИ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рджреЛрд╣рд░рд╛рд╡ рди рд╣реЛред
3. рд╣реИрд╢ рдЯреЗрдмрд▓ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдЕрдиреБрд░реЛрдз рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рд╕реНрдкрд╛рдВрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрд╕ рдкрдврд╝рддреЗ рд╣реИрдВ:
public bool Process(WebPageState state) { state.ProcessSuccessfull = false; HttpWebRequest request = (HttpWebRequest) WebRequest.Create(state.Uri); request.Method = "GET"; WebResponse response = null; try { response = request.GetResponse(); if (response is HttpWebResponse) state.StatusCode = ((HttpWebResponse) response).StatusCode; else if (response is FileWebResponse) state.StatusCode = HttpStatusCode.OK; if (state.StatusCode.Equals(HttpStatusCode.OK)) { var sr = new StreamReader(response.GetResponseStream()); state.Content = sr.ReadToEnd(); if (ContentHandler != null) ContentHandler(state); state.ProcessSuccessfull = true; } } catch (Exception ex) {
рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдкреНрд░реАрдЯреАрдиреЗрд╕ рдФрд░ рдПрдиреНрдЯреНрд░рд╛рдкреА рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рд╕реЗ: рдореИрдВрдиреЗ рдХрдВрд╕реЛрд▓ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛
https://nuget.org/packages/ManyConsole ред
рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреЛ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рдпрд╣рд╛рдВ рдмрдирд╛рдирд╛ рд╣реИ:
public class GetTime : ConsoleCommand { public GetTime() { Command = "get-text"; OneLineDescription = "Returns the current system time."; } public override int Run() { Console.WriteLine(DateTime.UtcNow); return 0; } }
PS рдФрд░ рдирд┐рд╖реНрдХрд░реНрд╖ рдореЗрдВ, рдЪреВрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд┐рдЦ тАЛтАЛрд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЕрднреА рднреА рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВрдиреЗ рдЗрд╕реЗ github
https://github.com/alexsuslin/LinkInspector рдореЗрдВ рдЬреЛрдбрд╝рд╛ рд╣реИ
рдЕрд░реЗ рд╣рд╛рдВ ... рдЬреЛ рдЕрднреА рднреА рдиреЗрддреНрд░рд╣реАрди рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдпрд╣ рд╕рд╛рдВрддреНрд╡рдирд╛ рдореЗрдВ рд╣реИ:
D:\WORK\Projects\Own\LinkInspector\LinkInspector\bin\Debug>LinkInspector.exe -u www.google.com -n=10 -ff=html -e
Executing -u (Specify the Url to inspect for broken links.):
======================================================================================================
Proccess URI: www.google.com
Start At : 2011-12-21 04:56:09
------------------------------------------------------------------------------------------------------
0/1 : [ 2.98s] [200] : www.google.com
1/7 : [ 0.47s] [200] : accounts.google.com/ServiceLogin?hl=be&continue=http://www.google.by/
2/6 : [ 0.22s] [200] : www.google.com/preferences?hl=be
3/5 : [ 0.27s] [200] : www.google.com/advanced_search?hl=be
4/7 : [ 0.55s] [200] : www.google.com/language_tools?hl=be
5/341 : [ 0.21s] [200] : www.google.by/setprefs?sig=0_OmYw86q6Bd9tjRx1su-C4ZbrJUU=&hl=ru
6/340 : [ 0.09s] [200] : www.google.com/intl/be/about.html
7/361 : [ 0.30s] [200] : www.google.com/ncr
8/361 : [ 0.21s] [200] : accounts.google.com/ServiceLogin?hl=be&continue=http://www.google.com/advanced_search?hl=be
9/360 : [ 0.13s] [200] : www.google.com/webhp?hl=be
------------------------------------------------------------------------------------------------------
Pages Processed: 10
Pages Pending : 0
End At : 2011-12-21 04:56:14
Elasped Time : 0h 0m 5s 456ms
======================================================================================================
рдпрд╛ рдпрд╣рд╛рдБ HTML рдЯреЗрдореНрдкрд▓реЗрдЯ рдореЗрдВ рд░рд┐рдкреЛрд░реНрдЯ рдХрд╛ рдПрдХ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рд╣реИ
PPS рдиреЗ рд╕рдВрдХрд▓рд┐рдд рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛, рдЖрдк рдпрд╣рд╛рдБ рд╣реИрдВ:
рд▓рд┐рдВрдХ рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ 0.1 рдЕрд▓реНрдлрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ