発生した問題
AngleSharpでスクレイピングをしてみたのだが、どうもログイン後の画面遷移がうまくいっていないっぽい。
ログインしてトップページまで表示させることはできたのだが、別ページに遷移しようとすると以下のエラーメッセージが表示されてしまう。
※ちなみにこれは某証券サイトのエラーメッセージ
ログイン画面から再度入力して下さい。(エラーコード)
何らかの原因によりXXXXXから自動的にログアウトいたしました。
ご利用を継続される場合は、再度ログインをお願いいたします。
・最後にXXXXXを操作してから、30分以上経過した
・ブックマークからログイン後のページにアクセスした
・インターネットから一旦切断された後、再度アクセスされた等
問題のコード
using System.Diagnostics;
using AngleSharp.Dom;
using AngleSharp;
using AngleSharp.Html.Dom;
namespace SampleFormApp
{
public class ScrapingMain
{
const string HOST_URL = "https://xxxxx.co.jp";
public async Task<System.Collections.Generic.IEnumerable<string>> Exec()
{
var config = Configuration.Default.WithDefaultLoader().WithJs();
var context = BrowsingContext.New(config);
await context.OpenAsync($"{HOST_URL}/xxxxx/");
var topPage = await context.Active.QuerySelector<IHtmlFormElement>("form[name='form_TopPage']").SubmitAsync(new
{
koza1 = "[支店コード]",
koza2 = "[口座番号]",
passwd = "[パスワード]",
});
var topPageHeaderMenu = context.Active.QuerySelectorAll("table");
var transactionPageUrl = topPageHeaderMenu[3].Children[0].Children[0].Children[2].Children[0].Attributes["href"].Value;
// この遷移がうまくいっていないっぽい
await context.OpenAsync($"{HOST_URL}{transactionPageUrl}");
// ここはとりあえず適当・・・。
return (IEnumerable<string>)topPageHeaderMenu;
}
}
}
解決方法
色々調べたところ、デフォルトではCookieを保持するような設定になっていないみたい。
そりゃセッション維持できないよね・・・。
ということで WithDefaultCookies() を追加したら、問題なく画面遷移できた。
using System.Diagnostics;
using AngleSharp.Dom;
using AngleSharp;
using AngleSharp.Html.Dom;
namespace SampleFormApp
{
public class ScrapingMain
{
const string HOST_URL = "https://xxxxx.co.jp";
public async Task<System.Collections.Generic.IEnumerable<string>> Exec()
{
var config = Configuration.Default.WithDefaultLoader().WithJs().WithDefaultCookies(); // WithDefaultCookies()を追加
var context = BrowsingContext.New(config);
await context.OpenAsync($"{HOST_URL}/xxxxx/");
var topPage = await context.Active.QuerySelector<IHtmlFormElement>("form[name='form_TopPage']").SubmitAsync(new
{
koza1 = "[支店コード]",
koza2 = "[口座番号]",
passwd = "[パスワード]",
});
var topPageHeaderMenu = context.Active.QuerySelectorAll("table");
var transactionPageUrl = topPageHeaderMenu[3].Children[0].Children[0].Children[2].Children[0].Attributes["href"].Value;
await context.OpenAsync($"{HOST_URL}{transactionPageUrl}");
return (IEnumerable<string>)topPageHeaderMenu;
}
}
}
バージョン情報
Visual Studio 2022 Version 17.1.3
.NET 6.0
AngleSharp 0.16.1
AngleSharp.Js 0.15.0