Invoke-WebRequest: HTML web sayfalarını Powershell ile parse etmek


PowerShell 3.0’da, Internet’teki HTML web sayfalarına doğrudan erişebilir ve parse edebilirsiniz. Bunu yapmak için özel bir Invoke-WebRequest cmdlet’i tanıtıldı. Bu cmdlet, HTTP, HTTPS, FTP aracılığıyla herhangi bir web sitesinden dosya indirme, yükleme, HTML sayfalarını parse etme, web hizmetleri izleme, web formları doldurma ve gönderme yeteneğine kadar pek çok senaryoyu uygulamanıza olanak tanır. Genel olarak, yeni cmdlet, bir HTML belgesinin DOM ağacında gezinmek için gerekli tüm yöntemleri sağlar. Bu makalede, PowerShell’deki Invoke-WebRequest cmdlet’ini kullanmanın temel örneklerini ele alacağız.

Not→ Invoke-WebRequest cmdlet’i Windows PowerShell 3.0’da kullanılabilir. Bu yüzden başlamadan önce Powershell versiyonunu kontrol etmelisiniz.

Invoke-WebRequest cmdlet’ini kullanma

Invoke WebRequest HTTP, HTTPS ve FTP isteklerini alır ve web sunucusu tarafından döndürülen yanıtı işleyebilir. Alınan yanıt, bir HTML belgesinin formları, linkleri, görüntüleri ve diğer önemli öğeleri topluluğudur.

Aşağıdaki komutu çalıştırarak başlayabiliriz.

Invoke-WebRequest -Uri “http://google.com”

Gördüğünüz gibi, cmdlet basit bir HTML kodu döndürdü. Bir web belgesinin çeşitli özelliklerini görebilirsiniz. Diğer PowerShell cmdlet’leri gibi Invoke-WebRequest cmdlet’i nesneleri işler. Invoke-WebRequest, HtmlWebResponseObject türünde bir nesne döndürür. Bu nesnenin tüm özelliklerine bakalım.

$WebResponseObj = Invoke-WebRequest -Uri “http://google.com”
$WebResponseObj| Get-Member

HtmlWebResponseObject nesnesinde bulunan web sayfasının ham HTML kodunu almak için şunu çalıştırın.

$WebResponseObj.content

HTML kodunu, web sunucusu tarafından döndürülen HTTP başlıklarıyla birlikte listeleyebilirsiniz.

$WebResponseObj.rawcontent

Sadece HTTP sunucusunun HTTP durum kodunu ve HTML sayfasının HTTP başlıklarını kontrol edebilirsiniz.

$WebResponseObj.Headers

Gördüğünüz gibi, sunucu 200 cevabını geri döndürdü. Yani istek başarılı oldu ve web sunucusu müsait ve düzgün çalışıyor.

WebPage’de HTML bağlantıları listesi nasıl eklenir?

Sitemizin ana sayfasını açalım ve HTML linklerinin listesini açalım.

$SiteAdress = “http://google.com”
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Foreach {$_.href }

Bağlantı metnini (InnerText öğesinde bulunur) almak için aşağıdaki komutu kullanabilirsiniz.

$HttpContent.Links | fl innerText, href

Yalnızca belirli bir CSS sınıfıyla bağlantılar seçebilirsiniz.

$HttpContent.Links | Where-Object {$_.class -eq “page-numbers”} | fl innerText, href

URL adresindeki belirli metinleri seçebilirsiniz.

$HttpContent.Links | Where-Object {$_.href -like “*powershell*”} | fl innerText,href

PowerShell kullanarak HTML web içeriğini parse etme

Invoke-WebRequest cmdlet’i, herhangi bir web sayfasının içeriğini hızlı ve kolay bir şekilde parse etmenize olanak tanır. Bir HTML sayfası işlenirken, bağlantılar, web formları, resimler, betikler koleksiyonlar oluşturulur.

PowerShell’i kullanarak web sitemizin ana sayfasının içeriğini alalım.

$Img = Invoke-WebRequest “http://google.com/”

Ardından bu sayfadaki tüm imajların bir listesini görüntüleyin.

$Img.Images

Bu resimlere tam URL yolu oluşturun.

$images = $Img.Images | select src

WebClient sınıfının yeni bir örneğini başlatın.

$wc = New-Object System.Net.WebClient

Tüm image dosyalarını (orijinal dosya adları ile) c:\tools\ klasörüne indirin.

$images | foreach { $wc.DownloadFile( $_.src, (“c:\tools\”+[io.path]::GetFileName($_.src) ) ) }

Powershell ile HTTP kullanarak dosya indirme

Invoke-WebRequest, Windows için Wget veya cURL olarak çalışabilir ve bir web sayfasından veya ftp sitesinden dosya indirmeye izin verebilir. Farz edelim ki, PowerShell kullanarak bir dosya indirmeniz gerekiyor (bu durumda Mozilla Firefox’un kurulum dosyası). Aşağıdaki komutu çalıştırabilirsiniz.

Invoke-WebRequest “https://download.mozilla.org/?product=firefox-34.0.5-SSL&os=win&lang=en-US” -outfile “c:\too1s\firefox setup 34.0.5.exe”

Bu cmdlet, belirtilen URL’den bir dosya indirir ve “firefox setup 34.0.5.exe” adı altında c:\tools\ klasörüne kaydeder. FTP’den bir dosya indirmeniz gerekiyorsa, http:// yerine ftp:// yazmalısınız.

Böylece, belirli bir web sayfasında, belirli kriterlere (link sınıfı, dosya adı, url adresi, vb.) göre olan tüm bağlantıları kolayca bulabilir ve alınan linklerden dosyaları indirebilirsiniz. Örneğin, PDF belgelerine bağlantılar içeren belirli bir site var. Göreviniz tüm bu dosyaları bilgisayarınıza indirmek. HTTP üzerinden toplu dosya indirmeleri için PowerShell betiği şu şekilde olacaktır.

$OutDir=”C:\docs\download\PDF”
$SiteAdress = “https://sometechdocs.com/pdf”
$HttpContent = Invoke-WebRequest -URI $SiteAdress
$HttpContent.Links | Where-Object {$_.href -like “*.pdf”} | %{Invoke-WebRequest -Uri $_.href -OutFile ($OutDir + $(Get-Random 200000)+”.pdf”)}

Hedef dizindeki komut dosyası sayesinde, sayfadaki tüm pdf dosyaları indirilecektir. Her dosya rastgele bir isim altında kaydedilir.

İpucu→ PowerShell 6.1’de, Invoke-WebRequest Commander, resume mode destekler. Böylece, Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile –Resume parametresini kullanarak sunucu çökmesi ya da bağlantı kopması durumunda dosyayı indirmeye devam edebilirsiniz.

HTML formlarını Powershell ile doldurma ve gönderme

Birçok web hizmeti, HTML formlarına girilecek çeşitli veriler gerektirir. Invoke-WebRequest ile herhangi bir HTML formuna erişebilir, gerekli alanları doldurabilir ve doldurulmuş formu sunucuya geri gönderebilirsiniz. Bu örnekte Facebook’ta Powershell’i kullanarak standart web formuyla nasıl oturum açacağınızı göstereceğiz.

Aşağıdaki komutla, bağlantı tanımlama bilgileriyle ilgili bilgileri ayrı bir oturum değişkenine kaydedin.

$fbauth = Invoke-WebRequest https://www.facebook.com/login.php -SessionVariable session

Bir sonraki komutu kullanarak, giriş HTML formunda doldurulacak alanların listesini görüntüleyin. (login_form)

$fbauth.Forms[“login_form”].Fields

Tüm alanlara gerekli değerleri atayın:

$fbauth.Forms[“login_form”].Fields[“email”] = “somemail@gmail.com”

$fbauth.Forms[“login_form”].Fields[“pass”] = “Coo1P$wd”

Doldurulmuş formu sunucuya göndermek için HTML formunun action niteliğini çağırın.

$Log = Invoke-WebRequest -method POST -URI (“https://www.facebook.com/login.php” + $fbauth.Forms[“login_form”].Action) -Body $fbauth.Forms[“login_form”].Fields -WebSession $session

Invoke-WebRequest cmdlet’inin dezavantajları

Invoke-WebRequest cmdlet’inin önemli dezavantajlarından biri düşük performanstır. Bir HTTP dosyası indirildiğinde, tüm akış belleğe alınır ve sadece tam yükleme tamamlandıktan sonra, yerel sürücüye kaydedilir. Böylece, büyük dosyaları Invoke-WebReques kullanarak indirirken, RAM yetersizliği ile karşılaşabilirsiniz.

Başka bir sorun, Invoke-WebRequest cmdlet’inin Internet Explorer ile yakından ilişkili olmasıdır. Örneğin, IE’nin yüklü olmadığı Windows Server Core sürümlerinde, Invoke-WebRequest cmdlet’i kullanılamaz.

Bir diğer dezavantajı ise otomatik olarak imzalanan sertifika kullanılan web sitelerinde, ınvoke WebRequest cmdlet’i web sitesinden veri almayı reddeder. Geçersiz bir SSL sertifikasını yoksaymak için aşağıdaki kodu kullanabilirsiniz.

add-type @”
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class TrustAllCertsPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint, X509Certificate certificate,
WebRequest request, int certificateProblem) {
return true;
}
}
“@
[System.Net.ServicePointManager]::CertificatePolicy = New-Object TrustAllCertsPolicy
$result = Invoke-WebRequest -Uri “https://somesite.net”

KAYNAKPOWERSHELL