job内のInvoke-WebRequestにsessionが上手く渡せない

実現したいこと

windows powershellで、invoke-webrequestを用いたウェブスクレイピングを並列処理したい。

前提

・スクレイピング先はブラウザで閲覧できる社内システムのデータ
・powershellのバージョンは5.1

該当のソースコード(一部情報は伏せさせていただいています)

#ログイン情報 $ip = "ipアドレス" $port = ":ポート4桁" $domain = "$ip$port" $session = New-Object Microsoft.PowerShell.Commands.WebRequestSession #ログイン Write-Output -NoEnumerate "try - Log in ..." $response = $null $response = Invoke-WebRequest ` -UseBasicParsing ` -Uri "url文章.ashx" ` -Method POST ` -SessionVariable session ` -UserAgent "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0" ` -ContentType "application/x-www-form-urlencoded; charset=UTF-8" ` -Body "必要な情報群がいろいろ" ・・・ 中略 ・・・ $session | Get-Member #※プリント_1 # ジョブのスクリプトブロックを定義 $scriptBlock = { param ( [string]$wno, [string]$Info, [string]$domain ) try { $response = Invoke-WebRequest ` -UseBasicParsing ` -Uri "http://$domain/以下略.ashx" ` -Method POST ` -WebSession $using:session ` -Body "action=wno=$wno" } catch { Write-Output "fail to change page... try again from login" Write-Output "error massage... $_.Exception.Message" #※エラー内容プリント Write-Output $using:session Write-Output $using:session | Get-Member #※プリント_2 return } # ジョブごとに結果を返す #$jobResponse } # 並列実行を開始 foreach ($wno in $results.wno) { Write-Output "try - get info -> $wno" # $session パラメーターに型情報を指定してスクリプトブロックを実行 $job = Start-Job ` -ScriptBlock $scriptBlock ` -ArgumentList $wno, $Info, $domain [void]$jobs.Add($job) # ArrayList にジョブを追加 # 同時に実行するジョブの数がプロセッサ数以下になるように制御 while ($jobs.Count -ge $processorCount) { $completedJobs = $jobs | Where-Object { $_.State -eq 'Completed' } foreach ($completedJob in $completedJobs) { $completedJob | Stop-Job | Out-Null # ジョブを終了させる $jobs.Remove($completedJob) } # ジョブがまだ実行中の場合は待機 if ($jobs.Count -ge $processorCount) { #Start-Sleep -Seconds 2 #Write-Output 'Loop...' } $Results = $jobs | Wait-Job | Receive-Job $Results } $Results = $jobs | Wait-Job | Receive-Job $Results }

cmd上の文書

※プリント_1での結果 TypeName: Microsoft.PowerShell.Commands.WebRequestSession Name MemberType Definition ---- ---------- ---------- Equals Method bool Equals(System.Object obj) GetHashCode Method int GetHashCode() GetType Method type GetType() ToString Method string ToString() Certificates Property System.Security.Cryptography.X509Certificates.X509CertificateCollection Certificates {get;set;} Cookies Property System.Net.CookieContainer Cookies {get;set;} Credentials Property System.Net.ICredentials Credentials {get;set;} Headers Property System.Collections.Generic.Dictionary[string,string] Headers {get;set;} MaximumRedirection Property int MaximumRedirection {get;set;} Proxy Property System.Net.IWebProxy Proxy {get;set;} UseDefaultCredentials Property bool UseDefaultCredentials {get;set;} UserAgent Property string UserAgent {get;set;} ※プリント_2での結果 TypeName: Deserialized.Microsoft.PowerShell.Commands.WebRequestSession Name MemberType Definition ---- ---------- ---------- GetType Method type GetType() ToString Method string ToString(), string ToString(string format, System.IFormatProvider formatProvider), string IFormat... Certificates Property {get;set;} Cookies Property System.String {get;set;} Credentials Property {get;set;} Headers Property Deserialized.System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=4.0.0.0, Culture=... MaximumRedirection Property System.Int32 {get;set;} Proxy Property {get;set;} UseDefaultCredentials Property System.Boolean {get;set;} UserAgent Property System.String {get;set;} ※エラー内容プリントでの記述 パラメーター 'WebSession' をバインドできません。値 "Microsoft.PowerShell.Commands.WebRequestSession" を型 "Microsoft.PowerShell.Commands.WebRequestSession" に変換できません。 エラー: ""Microsoft.PowerShell.Commands.WebRequestSession" の値を "Deserialized.Microsoft.PowerShell.Commands.WebRequestSession" 型から "Microsoft.PowerShell.Commands.WebRequestSession" 型に変換できません。 ・・・以下略

解決策について

エラーメッセージとデバッグ用のプリントから、本文から$scriptBlockに渡した$sessionの型が、
Microsoft.PowerShell.Commands.WebRequestSession
から
Deserialized.Microsoft.PowerShell.Commands.WebRequestSession
に変わってしまったことでInvoke-webrequestが通らなくなってしまったと推測していますが、
どう対応したらいいかわからない次第です。

ググってみても良い方法がわからなかったので質問させていただきました。
宜しくお願い致します。

コメントを投稿

0 コメント