A következő gyakori feladat a weben található információk letöltése. Erre a célra a .NET keretrendszerben a System.Net.WebClient osztály áll rendelkezésre. Itt nem egy emberi fogyasztásra szánt web böngészőt kell elképzelni, hanem egy olyan alapszolgáltatást, ami csatlakozik egy adott URL segítségével a webkiszolgálóhoz és kiolvassa az adott weboldalt:
[2] PS C:\> $client = New-Object System.Net.WebClient
[3] PS C:\> $client.DownloadString("http://www.geocaching.hu")
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859
-2">
<title>geocaching.hu</title>
<meta name="description" content="A magyar geocaching központja, geo
ládák
koodinátái, leírások, fényképek, letöltés, fórum.">
<meta name="keywords" content="kincskeresés, geocaching, geochaching
, geoc
ashing, geokesing, gps, kincs, kincsvadászat, keresés, láda, geoláda, koord
ináta, koordináták, letöltés, kincsesláda, cache">
<link rel="stylesheet" href="style.css" type="text/css">
...
A [3]-as sorban a DownloadString metódussal indítom a böngészést. Az eredmény – mivel külön nem rendelkeztem róla – a konzolra került ki. Látható, hogy a teljes HTML tartalmat megkaptam. Természetesen szkriptjeimben ezt nem a képernyőre fogom kifolyatni, hanem egy változóba töltök be és valamilyen elemzés, átalakítás (például a HTML címkéktől való megszabadítás) után adom csak vissza az engem ténylegesen érdeklő információkat.
A DonwloadString metódus olvasható karaktereket vár azon a weboldalon, amelyre ráirányítjuk. Ha azonban egy bináris állományt, például egy ZIP fájlt akarunk letölteni, akkor ez nem lesz nekünk jó. Ilyen letöltésekre egy másik metódust, a DownloadFile-t használhatjuk:
[5] PS I:\>$client = New-Object System.Net.WebClient
[6] PS I:\>$url= "http://www.xs4all.nl/~hneel/software/bytecount.zip"
[7] PS I:\>$filename = "c:\bytecount.zip"
[8] PS I:\>$client.DownloadFile($url, $filename)
[9] PS I:\>Get-ChildItem c:\b*
Directory: Microsoft.PowerShell.Core\FileSystem::C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 2008. 04. 22. 9:53 419660 bytecount.zip
A fenti példában látható, hogy ennek a metódusnak az URL-en kívül egy fájl elérési útja is paramétere, ahova majd letölti a bináris állományt.
Megjegyzés
Fájlt letölteni a BitsTransfer modul segítségével is lehet:
PS C:\> Import-Module BitsTransfer
PS C:\> Start-BitsTransfer 'http://www.iqjb.hu/UserFiles/video/PowerShell_1.avi
' $home/PowerShell_1.avi
A böngészést összeköthetjük a strukturált adatkezeléssel! Például a Bing kereső képes XML formátumban is visszaadni a keresési találatokat. Erre alapozottan készítettem egy függvényt, ami megadja a Binggel történő keresés eredményét:
function Search-BingXML ([string] $search, $max = 10) {
$wc = New-Object net.WebClient
$wc.Encoding = [System.Text.Encoding]::UTF8
$találat1 = [xml] $wc.DownloadString(
"http://www.bing.com/search?q=$search&format=XML")
$maxtalálat = [Math]::Min($találat1.searchresult.documentset.total, $max)
$találat1.searchresult.documentset.document
for($i = 11; $i -le $maxtalálat; $i+=10){
$t = [xml] $wc.DownloadString(
"http://www.bing.com/search?q=$search&first=11&format=XML")
$t.searchresult.documentset.document
}
$wc.Dispose()
}
Ez a függvény vár egy keresési kifejezést és egy opcionális maximális találatszámot. Belsejében a WebClient osztály egy objektuma dolgozik, a szebb megjelenítés érdekében UTF8-as kódolással dolgozom. Az első keresési eredmények strukturált adathalmazából kiszedem a $maxtalálat változóba, hogy hány találat van összesen. Ebben az első etapban maximum 10 találat van, és a lapozás is 10 találatonként mehet, amit a for ciklusban teszek meg, az URL-ben jelzett first paraméter megadásával.
Ennek kimenete:
[23] PS C:\> Search-BingXML "Soós Tibor" 10 | Format-Table title, desc, languag
e, url
title desc language url
----- ---- -------- ---
Microsoft Techne... Soós Tibor. IQSO... hu http://www.micr...
Meet our Author:... Tibor Soós is fr... en http://www.rsc....
Az előadás címe Windows Server 2... hu http://www.micr...
Soós Tibor Soós Tibor. Loca... en http://my.opera...
Soós Tibor Soós Tibor festő... hu http://www.ngks...
Soós Tibor/Tel Tel: Összes kép:... hu http://www.ngks...
AIB Real Estate ... Please contact o... en http://www.aib....
Thionation Using... Thionation Using... en http://www.orga...
Untitled Page Soós Tibor Bizto... hu https://tudasta...
Exchange 2010 Hi... Exchange Server ... hu http://download...
Megjegyzés
Sajnos, nem sokkal a fenti kis Bing szkriptem megírása után a Microsoft megszűntette a szolgáltatás ilyen jellegű hozzáférését, így ne csodálkozzon senki, ha már nem működik.