Invoke-WebRequest Powershell Konten Web dan Pemrosesan Situs HTML

PowerShell versi 3.0 memperkenalkan kemampuan untuk secara langsung mengakses dan bekerja dengan halaman web HTML di Internet. Cmdlet khusus dikembangkan untuk ini. Invoke-WebRequest. Cmdlet ini memungkinkan Anda untuk menerapkan banyak skenario: dari kemampuan untuk mengunduh / mengunggah file dari / ke situs web apa pun melalui HTTP / HTTPS / FTP, diakhiri dengan kemampuan untuk menguraikan halaman HTML, memantau status server web, mengisi dan mengirimkan formulir web. Secara umum, cmdlet baru menyediakan semua metode yang diperlukan untuk menavigasi pohon DOM dari dokumen HTML. Pada artikel ini, kita akan melihat beberapa contoh dasar bekerja dengan cmdlet PowerShell Invoke-WebRequest..

Konten:

  • Menggunakan Cmdlet Invoke-WebRequest
  • Kami mendapatkan daftar semua tautan HTML di halaman
  • Parsing Halaman HTML Menggunakan Powershell
  • Cara mengunduh file melalui HTTP menggunakan PowerShell
  • Powershell mengisi dan mengirimkan formulir web
  • Kerugian dari cmdlet Invoke-WebRequest

Kiat. Cmdlet Invoke-WebRequest tersedia di Windows PowerShell 3.0, jadi pastikan Anda menggunakan ini atau versi yang lebih baru sebelum Anda memulai. Jika beberapa versi Posh diinstal pada komputer Anda, Anda dapat beralih di antara mereka.

Menggunakan Cmdlet Invoke-WebRequest

Cmdlet Panggil-Permintaan web (alias wget) dapat mengirim dan menerima permintaan HTTP, HTTPS dan FTP, memproses respons yang dikembalikan oleh server. Responsnya adalah kumpulan formulir, tautan, gambar, dan elemen penting lainnya dari dokumen HTML.

Mari kita coba perintah berikut:

Invoke-WebRequest -Uri "http://winitpro.ru"

Kiat. Jika Anda terhubung ke Internet melalui server proxy, maka agar cmdlet PoweShell berfungsi dengan benar, gunakan tips dari artikel: Cara mengkonfigurasi PowerShell untuk akses melalui server proxy.

Seperti yang Anda lihat, jawaban yang dikembalikan bukanlah kode HTML sederhana untuk halaman tersebut. Anda melihat berbagai properti dokumen web. Cmdlet Invoke-WebRequest, seperti cmdlet PowerShell lainnya, beroperasi pada objek. Invoke-WebRequest mengembalikan objek tipe HtmlWebResponseObject. Mari kita lihat semua properti dari objek ini:

$ WebResponseObj = Invoke-WebRequest -Uri "http://winitpro.ru"
$ WebResponseObj | Dapatkan anggota

Untuk mendapatkan kode HTML mentah dari halaman web yang terkandung dalam objek ini, jalankan:

$ WebResponseObj.content

Anda dapat mengembalikan kode HTML bersama dengan tajuk HTTP yang dikembalikan oleh server web:

$ WebResponseObj.rawcontent

Anda hanya dapat memeriksa kode respons server web dan header HTTP halaman HTML:

$ WebResponseObj.Headers

Seperti yang Anda lihat, server web mengembalikan respons 200, yaitu permintaan berhasil dan server web dapat diakses dan berfungsi dengan benar.

Kami mendapatkan daftar semua tautan HTML di halaman

Kami beralih ke halaman utama situs kami dan mendapatkan daftar tautan yang tersedia di dalamnya:
$ SiteAdress = "http://winitpro.ru"
$ HttpContent = Panggil-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Foreach $ _. Href

Untuk mendapatkan teks tautan itu sendiri (terkandung dalam elemen InnerText), Anda dapat menggunakan konstruksi ini:

$ HttpContent.Links | fl innerText, href

Anda hanya dapat memilih tautan dengan kelas CSS tertentu:

$ HttpContent.Links | Where-Object $ _. Kelas -eq "halaman-angka" | fl innerText, href

Atau teks khusus dalam url:

$ HttpContent.Links | Where-Object $ _. Href-like "* exchange *" | fl innerText, href

Parsing Halaman HTML Menggunakan Powershell

Cmdlet Invoke-WebRequest memungkinkan Anda dengan cepat dan mudah mengurai konten halaman web mana pun. Saat memproses halaman HTML dari kontennya, kumpulan tautan (tautan), formulir web (formulir), gambar (gambar), skrip (skrip), dll terbentuk.

Menggunakan Powershell, kami mendapatkan konten dari halaman utama situs kami:

$ Img = Invoke-WebRequest "https://winitpro.ru/"

Lalu kami daftar semua gambar di halaman ini:

$ Img. Gambar

Kami akan membentuk koleksi jalur url lengkap untuk gambar yang digunakan:

$ images = $ Img.Images | pilih src

Inisialisasi instance baru dari kelas WebClient:

$ wc = Sistem Objek Baru.Net.WebClient

Dan unduh semua gambar dari halaman (dengan nama asli) ke direktori c: \ tools \:

$ gambar | foreach $ wc.DownloadFile ($ _. src, ("c: \ tools \" + [io.path] :: GetFileName ($ _. src))

Contoh menarik menggunakan cmdlet Invoke-WebRequest adalah cara untuk mengetahui alamat IP eksternal komputer dari PowerShell.

Cara mengunduh file melalui HTTP menggunakan PowerShell

Invoke-WebRequest dapat berfungsi sebagai analog dari Wget atau cURL untuk Windows, memungkinkan Anda untuk mengunduh file atau file yang diinginkan dari halaman web atau situs ftp. Misalkan kita perlu menggunakan PowerShell untuk mengunduh file tertentu melalui HTTP (dalam contoh kita, distribusi Mozilla Firefox). Jalankan perintah berikut:

Invoke-WebRequest "https://download.mozilla.org/?product=firefox-32.0.3-SSL&os=win&lang=en" -outfile "c: \ tools \ firefox setup 32.0.3.exe"

Sebagai hasil menjalankan cmdlet, file akan diunduh dari URL yang ditentukan dan disimpan di direktori c: \ tools \ di bawah nama firefox setup 32.0.3.exe. Jika Anda perlu mengunduh file dari situs FTP, ganti saja http: // dengan ftp: //.

Anda juga dapat mengunduh file dari server web menggunakan BITS dalam mode sinkron.

Dengan demikian, Anda dapat dengan mudah menemukan di halaman web tertentu semua tautan yang termasuk dalam kriteria tertentu (kelas tautan, resolusi dalam nama file, alamat url), dan mengunduh file menggunakan tautan yang diterima. Misalnya, ada situs web dengan banyak tautan ke dokumen PDF. Tugas Anda adalah mengunduh semua file ini ke komputer Anda. Tulang punggung skrip PowerShell untuk mengunduh file massal mungkin terlihat seperti ini:

$ OutDir = "C: \ Downloads \ docs \ PDF"
$ SiteAdress = "https://www.site.ru/free-pdf-books/"
$ HttpContent = Panggil-WebRequest -URI $ SiteAdress
$ HttpContent.Links | Where-Object $ _. Href-like "* .pdf" | % Invoke-WebRequest -Uri $ _. Href -OutFile ($ OutDir + $ (Get-Random 100000) + ". Pdf")

Sebagai hasil dari skrip di direktori target, semua file pdf dari halaman akan diunduh. Setiap file disimpan dengan nama sewenang-wenang..

Di PowerShell 6.1, cmdlet Invoke-WebRequest mendukung mode resume. Oleh karena itu, gunakan parameter Invoke-WebRequest -Uri $ Uri -OutFile $ OutFile -Lanjutkan Anda dapat melanjutkan mengunduh file jika terjadi gangguan pada saluran atau server.

Powershell mengisi dan mengirimkan formulir web

Banyak layanan web membutuhkan input dari berbagai data dalam bentuk HTML agar berfungsi. Menggunakan Panggil-Permintaan web Anda dapat mengakses formulir HTML apa pun, mengisi bidang yang diperlukan, dan mengirimkan formulir yang telah diisi kembali ke server. Dalam contoh ini, kami akan menunjukkan cara menggunakan Powershell untuk masuk ke kotak surat dari layanan mail.ru Rusia populer melalui formulir web standarnya.

Menggunakan konstruksi berikut, kami menyimpan informasi cookie untuk koneksi dalam variabel sesi terpisah:

$ mailru = Invoke-WebRequest https://e.mail.ru/login -SessionVariable session

Perintah berikut menampilkan daftar bidang yang harus diisi dalam formulir otorisasi HTML (formulir ini disebut LoginExternal):

$ mailru.Forms ["LoginExternal"]. Fields

Tetapkan nilai yang diperlukan untuk semua bidang:

$ mailru.Forms ["LoginExternal"]. Fields ["Login"] = "[email protected]"

$ mailru.Forms ["LoginExternal"]. Fields ["Password"] = "Str0NgP $$ w0rd"

Dll ... .

Untuk mengirimkan formulir yang telah diisi ke server web, panggil atribut tindakan form HTML.

$ Log = Panggil-WebRequest -metode POST -URI ("https://e.mail.ru/login" + $ mailru.Forms ["LoginExternal"]. Aksi) -Body $ mailru.Forms ["LoginExternal"]. Fields -WebSession $ sesi

Kerugian dari cmdlet Invoke-WebRequest

Salah satu kelemahan utama dari cmdlet Invoke-WebRequest adalah kecepatannya yang relatif rendah. Ketika file HTTP diunduh, aliran sepenuhnya buffered ke memori, dan hanya setelah unduhan lengkap selesai disimpan ke disk. Jadi, saat mengunduh file besar, Anda mungkin kehabisan memori.

Masalah lain adalah cmdlet Invoke-WebRequest terkait erat dengan Internet Explorer. Misalnya, dalam edisi Windows Server Core di mana IE tidak diinstal, Anda tidak dapat menggunakan cmdlet Invoke-WebRequest.

Jika sertifikat yang ditandatangani sendiri digunakan di situs HTTP, maka cmdlet Invoke-WebRequest menolak untuk menerima data darinya. Untuk mengabaikan sertifikat SSL yang tidak valid, gunakan kode berikut:

Anda dapat mengabaikan sertifikat SSL seperti ini:
add-type @ "
menggunakan System.Net;
menggunakan System.Security.Cryptography.X509Certificates;
kelas publik TrustAllCertsPolicy: ICertificatePolicy
bool publik CheckValidationResult (
ServicePoint srvPoint, X509Sertifikat sertifikat,
Permintaan WebRequest, int CertificateProblem)
kembali benar;


"@
[System.Net.ServicePointManager] :: CertificatePolicy = Objek-Baru TrustAllCertsPolicy
$ result = Invoke-WebRequest -Uri "https://site.ru"