今日、宣教師が書いたブログ投稿 http://www.cnblogs.com/piapia/p/5367556.html (PowerShell の 2 つのクローラー) を偶然見て、非常にインスピレーションを受けて自分でも捕まえてみました。しばらくすると、Web ページのテーブルが正常にキャプチャされました。私は英語版のシステムを使用しているため、中国語のシステム インターフェイスは文字列に変換されると文字化けしてしまうため、テストはすべて英語の Web ページで実行されます。
PowerShell 5 には ConvertFrom-String と呼ばれる新しい関数があり、文字列をオブジェクトに変換するために使用されます。パラメータの 1 つは、文字列の対応する部分を照合して、指定されたテンプレートに基づいてオブジェクトを生成することです。この関数を使用して Web ページ内のテーブルをクロールできます。
詳細なヘルプドキュメントのリンク
https://technet.microsoft.com/library/dn807178(v=wps.640).aspx
最初に基本的な例を見てみましょう
$a=@'1 2 3 45 6 7 89 2 2 3'@$t=@'{Co1*:1} {Co2:2} {Co3:3} {Co4:4}{Co1*:5} 6 7 8'@$c=$a | ConvertFrom-String -Delimiter "\r\n"$d=$a | ConvertFrom-string -TemplateContent $t
同じ文字列ですが、最初の文字列を使用します1 つ目の区切り文字はオブジェクトを生成するためのキャリッジ リターンとライン フィードで、2 つ目の区切り文字はマッチングにカスタム テンプレート形式を使用します。属性定義の形式は {} で区切られており、最初の定義には {属性名*:} が必要で、その後に * を追加する必要はありません。少なくとも 2 行のデータが一致する必要があることに注意してください。
最初のオブジェクトには 3 つの属性があり、P1 は 1 2 3 4、P2 は 4 5 6 7、P3 は 9 2 2 3 であることがわかります
2 番目のオブジェクトは各列に基づいて自動的に照合されます (すでに最初の 2 行に一致するテンプレートです)
次に 2 つの例を見ていきます。
最初の例はこの Web ページです。以下に示すように、オーストラリアのプロキシ サーバーのリストが含まれています。これを取得したいと思います
http://www.proxylisty.com/country/Australia-ip-list
基本的な考え方: invoke-restmethod は Web ページ全体を直接取得し、それを自動的に次のように変換します文字列オブジェクト。
次に、対応するテンプレートをデザインします。 htmlファイルなので、文字列に変換した後の対応するhtmlコードが入っています。したがって、重要なのは、HTML コードを使用してこれらのテーブル テンプレートを作成する方法です。
それは非常に簡単で、どの Web ページでも HTML のソース コードを表示できます。以下の大きな HTML コードについては、Web ページから対応する 2 行のテーブル コードを直接コピーして貼り付けるだけです。属性名を追加します。
その後、テンプレート マッチングに基づいて、対応するテーブル オブジェクトが自動的に生成されます
$web = 'http://www.proxylisty.com/country/Australia-ip-list'$template = @'{IP*:203.56.188.145} {Port:8080} HTTP High anonymous / Elite proxy No Australia
13 Months 2.699 Sec {Reliability:50%}'@$temp=Invoke-RestMethod -uri $web $result = ConvertFrom-String -TemplateContent $template -InputObject $temp $result | sort reliability {IP*:103.25.182.1} {Port:8081} HTTP Anonymous proxy No Australia
15 Months 7.242 Sec {Reliability:55%}
キャプチャ成功
さらに一歩進んで、これらのキャプチャされたアドレスが実際に使用できるかどうかをテストして、関数を作成したいと思います。見てください
function Test-Proxy{[cmdletbinding()]param( [Parameter(Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true, position=0 ) ] [string]$server, [string]$url = "http://www.microsoft.com")write-host "Test Proxy Server: $server" -NoNewline$proxy = new-object System.Net.WebProxy($server)$WebClient = new-object System.Net.WebClient$WebClient.proxy = $proxyTry{ $content = $WebClient.DownloadString($url) Write-Host " Opened $url successfully" -ForegroundColor Cyan}catch{ Write-Host " Unable to access $url" -ForegroundColor Yellow }}foreach ($r in $result){$servername="http://"+$r.IP+":"+$r.PortTest-proxy -server $servername -url "www.google.com"}
検査の結果、それらはすべて詐欺であることがわかりました
同様に、Douziも最近は健康食品に注目しているので、低GI食品とは何かを知りたいです
http://ultimatepaleoguide.com/glycemic-index-food-list
次の表を入手する必要があります
やったー成功!
このメソッドは、特に Web ページのリスト情報を取得する必要がある場合に非常に便利です。もちろん、Web ページ自体が RESTFUL インターフェイスを提供している場合は、JSON 形式でコンテンツを直接取得できます。よりトラブルフリーに。