IEでのスクレイピングの代替手法

IEがいよいよ使えなくなる(https://togetter.com/li/1833525)ということで、普段使いはChromeなのでいいんだけど自作のIEを利用したスクレイピングツールの移行を考えないとなあ…ということでぼちぼち調べてみた結果。
WebDriverという仕組みが使えるらしいということで(←周回遅れ)使い方を調べてみた。仕組みは簡単だったけど、spec(WebDriver W3C Recommendation)が使う側の観点ではなくて、実装側観点で書かれてて難解だったのでメモも兼ねて。


Chromeの場合はChromeDriverをダウンロードし、解凍したchromedriver.exeを適当なフォルダに置いて起動するだけで良い。
ChromeDriverはport 9515で待ち受けているらしいので、localhost:9515にリクエストを投げる。


VBAからはxmlhttpでChromeDriverサーバにリクエストを投げて、返ってくるレスポンスを利用する形でChromeの操作が可能になる。




新規セッションを作る

POST http://localhost:9515/session HTTP/1.1
Content-Type: application:json

{
    "capabilities": {}
}

新規Chromeウィンドウが開きセッションIDが返る。

HTTP/1.1 200 OK
Content-Length: 789
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": {
    "capabilities": {
      "acceptInsecureCerts": false,
      "browserName": "chrome",
      "browserVersion": "97.0.4692.71",
      "chrome": {
        "chromedriverVersion": "97.0.4692.71 (adefa7837d02a07a604c1e6eff0b3a09422ab88d-refs/branch-heads/4692@{#1247})",
        "userDataDir": (省略)
      },
      "goog:chromeOptions": {
        "debuggerAddress": "localhost:60732"
      },
      "networkConnectionEnabled": false,
      "pageLoadStrategy": "normal",
      "platformName": "windows",
      "proxy": {},
      "setWindowRect": true,
      "strictFileInteractability": false,
      "timeouts": {
        "implicit": 0,
        "pageLoad": 300000,
        "script": 30000
      },
      "unhandledPromptBehavior": "dismiss and notify",
      "webauthn:extension:credBlob": true,
      "webauthn:extension:largeBlob": true,
      "webauthn:virtualAuthenticators": true
    },
    "sessionId": "b670858dbd58c01d2721b9a8548d834f"
  }
}

セッションID(sessionId)はこの後の処理でずっと使うので覚えておく。



指定したURLを開く(Navigate To)

http://localhost:9515/session/{セッションID}/url

POST http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f/url HTTP/1.1
Content-Type: application:json

{
    "url": "https://(省略)"
}

応答

HTTP/1.1 200 OK
Content-Length: 14
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": null
}



現在のURLを取得する(Get Current URL)

http://localhost:9515/session/{セッションID}/url

GET http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f/url HTTP/1.1

応答

HTTP/1.1 200 OK
Content-Length: 508
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": "https://(省略)"
}



HTML要素を検索する(Find Elements)

http://localhost:9515/session/{セッションID}/elements
usingに検索方法を、valueに検索する文字列を指定する。
検索方法にはxpathの他にもcss selector、tag nameなども使える。

POST http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f/elements HTTP/1.1
Content-Type: application:json

{
    "using": "xpath",
    "value": "//*[contains(@class,'product')]"
}

見付かった複数の要素のIDの一覧が返ってくる。

HTTP/1.1 200 OK
Content-Length: 15811
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": [
    {
      "element-6066-11e4-a52e-4f735466cecf": "3ede9e25-c17c-486e-a1f3-618c201270c5"
    },
    (中略)
    {
      "element-6066-11e4-a52e-4f735466cecf": "b41e4cbb-a210-407a-bc30-d9177d9ae0e2"
    }
  ]
}



HTML要素を起点にして別のHTML要素を検索する(Find Elements From Element)

http://localhost:9515/session/{セッションID}/element/{起点要素ID}/elements
usingに検索方法を、valueに検索する文字列を指定する。
↑で見つかった要素ID 3ede9e25-c17c-486e-a1f3-618c201270c5 を起点にしてさらにHTML要素を検索する。

POST http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f/element/3ede9e25-c17c-486e-a1f3-618c201270c5/elements HTTP/1.1
Content-Type: application:json

{
    "using": "xpath",
    "value": "descendant::*[contains(@class,'title')]/descendant::a"
}

見付かった複数の要素のIDの一覧が返ってくる。

HTTP/1.1 200 OK
Content-Length: 327
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": [
    {
      "element-6066-11e4-a52e-4f735466cecf": "e6024817-b584-4585-907a-8e55f76398ca"
    },
    (中略)
    {
      "element-6066-11e4-a52e-4f735466cecf": "8addecef-e28e-48a8-b12b-6522779def9e"
    }
  ]
}



HTML要素の属性を取得する(Get Element Attribute)

http://localhost:9515/session/{セッションID}/element/{要素ID}/attribute/{属性名}
↑で見つかった要素ID e6024817-b584-4585-907a-8e55f76398ca(Aタグ)のhrefを取得してみる。

GET http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f/element/e6024817-b584-4585-907a-8e55f76398ca/attribute/href HTTP/1.1
HTTP/1.1 200 OK
Content-Length: 49
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": "/detail/detail.php?product_id=1198823"
}



セッションを閉じる(Delete Session)

DELETE http://localhost:9515/session/b670858dbd58c01d2721b9a8548d834f HTTP/1.1

ウィンドウが閉じる。

HTTP/1.1 200 OK
Content-Length: 14
Content-Type: application/json; charset=utf-8
cache-control: no-cache
Connection: close

{
  "value": null
}


テストにはREST Client on VSCodeを使わせてもらってます。便利。

サンシャインクリエイション2022Winterサークル名入り配置図


サンシャインクリエイション2022Winter サークル名入り配置図


久々のコミケ直後ということもあるでしょうけどかなり縮小開催ですね。
まあソーシャルディスタンスは確保できるからいいのか……。
それはともかくコロナ感染者数が急増していて心配ではあります。
今更開催中止というわけにもいかないでしょうけど、週明けの状況が気になります。

COMITIA138サークル名入り配置図


COMITIA138 サークル名入り配置図


今回で青海展示棟は最後だそうです。


ようやくこなれてきたところで終わりというのもなんとも寂しい気持ちですね。(立地的には使いにくかったですが)
どうせだから解体せずに使えばいいのに、と素人考えで思ってしまいますが……。レガシーどこ行った。


今年は冬コミが復活するので年内ではコミケ前の大型イベントとしてはコミティアが最後ということになりますか。
コミケは一般参加すら抽選になって参加できるかどうかすら現時点で未知数ですが、コミティアが終わったらぼちぼちコミケに向けて準備を始めなければ。


ネットプリントはこちらから。
予約番号:83489073
字が小さいのでA3カラー印刷推奨。

サンシャインクリエイション2021Autumn サークル名入り配置図


サンシャインクリエイション2021Autumn サークル名入り配置図


前回は油断していて入替一回目に漏れてしまって泣きを見たので今回は忘れずにチケット確保。
全然大手とかじゃなくて、むしろピコ手の方が入手難度高いという・・・まあ当たり前なんですが。(入替考慮してくれてないと一回目で売り切れる)


サンシャインDホールのイベントはあまり数が多くないのでかなり前のを引っ張り出してきました。
サンクリでもDホール開催あった気がしたんだけど、気のせいでしたかね…。
コロナ直後にDホールサンクリあった気がしたんですが、その時はうっかりしていてマップ作ってませんでした(というか当日になるまでイベント忘れていたという)


Dホールは縦長でちょっと面倒くさいんですよね。ちょっと工夫して一枚に収めてみました。


コロナの方は少し落ち着いてきているので以前よりは少し安心ですが、しっかり対策して参加しましょう。

COMITIA137 サークル名入り配置図

COMITIA137 サークル名入り配置図


COMITIA137 サークル名入り配置図


ネットプリントはこちら。字が小さいのでA3カラー推奨です。
予約番号: 36176847


ぼちぼちサークルチェックしてますが、さすがにコロナ禍の中で欠席されるサークルさんも多いですね…。
仕方ないとはいえ。
参加する方も最大限の予防策で臨みましょう。


ちなみに一か月前ですがこんなお知らせが出ていたようなので、念のためご注意を。
青海展示棟におけるセアカゴケグモ発見に伴う注意喚起について

サンシャインクリエイション2021Summer サークル名入り配置図


サンシャインクリエイション2021Summer サークル名入り配置図


今回は入替制になったようですね。
私はまだチケットこれからなので、ゆっくり第二部に参加予定。