![画像](https://habrastorage.org/getpro/habr/post_images/423/8aa/54c/4238aa54c6e0f0e2ac49c798ca4bb3ac.jpg)
壊れたリンクや存在しないリンクを毎週チェックするサイトが必要でした。 30分間インターネットをサーフィンした後、まともなコンソールアプリケーションを見つけました(Windowsにサーバーがあるため、このタスクにTaskShedulerを使用したかったため)。 それらのすべてが支払われたことが判明した。 そして、私は自分自身にいくらかの自由時間を与えることができ、一見タスクが難しくないように思えたので、私は自分で書くことに決めました。
この実装であるWebSpiderに基づいて構築することにしましたが、通常は最終的に行われるので、私は好きなようにほとんどすべてを書き直しました。
私は自分が必要なものの短いリストを作成し、少しずつタスクを削除しました:
挑戦する | 説明 | ステータス |
すべてのリンクを再帰的に収集する | 1つのサイト内のすべてのページを調べて、すべてのリンクを収集します | 製 |
Nリンクを確認 | 主にデバッグ目的で、N個のリンクを確認した後に停止します | 製 |
結果をファイルに保存 | TXTに保存 | 製 |
HTMLテンプレートを使用して結果を保存する | 読みやすくするために、フィルタリングとソート用のjqueryデータテーブルプラグインをねじ込みます | 製 |
エラーのみを表示 | ファイルレポートに壊れたリンクを表示する | 製 |
レポートファイルのアーカイブオプション | 7zipサポートを追加 | していない |
結果をメールで送信 | コンソールメーラーサポートを追加する | していない |
レポートにリダイレクトを表示する | すべてのリダイレクトを正しく処理し、それらに関する情報をレポートに表示します | していない |
ロギングを追加 | Log4Netライブラリを追加する | していない |
HTMLテンプレートの一般的なプロセス情報 | 処理の開始時、終了時、およびhtmlテンプレートの他の一般情報を表示します | していない |
正しいリダイレクト処理を確認して構成する | していない | |
app.configのデフォルト構成 | ユーティリティにはパラメーターが多すぎるため、app.configからデフォルトの構成を作成する必要があると判断しました | していない |
プログラムは簡単に不名誉です:
1.入力は、コンテンツがダウンロードされるURIであり、正規表現を使用してコンテンツ内のリンクが検索されます。
public const string UrlExtractor = @"(?: href\s*=)(?:[\s""']*)(?!#|mailto|location.|javascript|.*css|.*this\.)(?<url>.*?)(?:[\s>""'])";
2.このサイトに関連する場合、見つかったすべてのリンクはハッシュテーブルに配置されます。キーは絶対URIであるため、重複はありません。
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) { // todo: catch } finally { if (response != null) { response.Close(); } } return state.ProcessSuccessfull; }
他のすべては可愛さとエントロピーです。
おもしろいことから:コンソールパラメータの便利な解析のためにこのパッケージ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テンプレートのレポートのスクリーンショットがあります
![画像](https://habrastorage.org/getpro/habr/post_images/557/683/ec3/557683ec37899bb89ad5146054e958ab.png)
PPSコンパイル済みバイナリを要求されました。ここにあります: Link Inspector 0.1 alphaをダウンロードしてください