0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

C# AngleSharp ログイン後の画面遷移を行う

Posted at

発生した問題

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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?