Webページのリンクを正規表現で検索
私がニュースサイトを見るとき、どのような行動をとるか考えてみました。
1.ブラウザを開く
2.ニュースサイトに移動する
3.トピックの題名を見る
4.気になったものがあればクリックして読む
さて、この中で自動化できるものはないか考えてみました。
まず、2.はサイトのショートカットを作れば自動化できそうです。3.4.はあらかじめ自分が気になりそうな単語を登録しておいて、表示するようにできるかもしれません。(自己分析が必要ですが) これを学習のためPowerShellで行ってみたいと考えました。まず、ニューストピックの項目名(リンク)を取得しなくてはいけません。ということで、Webページのリンクを取得してみたいと思います。今回はオブジェクトから取得するのではなく、ソースから正規表現でリンクのタグを取得するようにしました。以下がプログラムです。
set-PSDebug -strict # -------------------------------- # Webページのリンクを表示する # -------------------------------- Function ShowWebPageLinks{ # url設定 $url = "http://www.yahoo.co.jp" # 読み込みコード設定 $codetype = "utf-8" # webページのソースを取得 $source = GetWebPageSource $url $codetype # ソースからリンクを検索 $links = SearchLinksFromSource $source $links | format-List } # -------------------------------- # ソースからリンクを検索 # -------------------------------- Function SearchLinksFromSource{ # 引数取得 param([string]$source) # パターン設定 $pattern = "<\s*?a *?href\s*?=\s*?""(.*?)"".*?>(.*?)< *?/ *?a *?>" # 改行を削除 $source = $source -replace "`n","" $source = $source -replace "`r","" # リンクタグを検索(<a href="url">text</a>) $results = [regex]::matches($source, $pattern, ("IgnoreCase","SingleLine")) # 検索結果からアンカーテキストとURLをハッシュに格納 $links = @{} foreach ($match in $results){ $atext = $match.result("`$2") $url = $match.result("`$1") $links[$atext] = $url } $links } # -------------------------------- # Webページソースを取得する # 第一引数:URL # 第二引数:読み込み文字コード # -------------------------------- Function GetWebPageSource{ # 引数取得 param([string]$url, [string]$codetype) # encoding設定 $encoding = [system.Text.Encoding]::GetEncoding($codetype) # webclientオブジェクト生成 $wc = new-Object System.Net.WebClient # streamオープン # (OpenRead:指定した URI を持つリソースからダウンロードしたデータの読み取り可能ストリームを開きます。) $st = $wc.OpenRead($url) # streamReaderオープン $reader = new-Object system.IO.StreamReader($st, $encoding) # webページ取得 $source = $reader.readtoend() # streamクローズ $st.close() # streamReaderクローズ $reader.close() $source }