Java
jsoup

リダイレクトされるページをパースする(JsoupでLocationを使って画面遷移する)

はじめに

私は、
〜2013年3月 文系大学学部卒
〜2018年4月 インフラ系のSIer # LinuxとかAzureとか
2018年5月〜 WEB系エンジニア # 開発できるようになりたかった
という変遷をたどり、
絶賛業務でJava勉強中の身です。

開発のやり方が学べたら
フルスタックなスキルを身につけられるように頑張りたいと思ってます。

だいぶ初心者な記載が多いかもしれませんが、Outputを続けることで、
エンジニアスキルが積み上がっていけばなと。

やりたかったこと

とあるWEBページのスクレイピング
検索画面にアクセスし(キーワードで検索した後、そのデータをスクレイピングし)たい。

こんな感じでアクセスしたいが、

Connection.Response response = Jsoup.connect(Url)
        .headers(header)
        .cookies(cookies)
        .data(formData)
        .timeout(3000)
        .execute();

URLがこんなかんじ。

https://hoge.com/fuga.aspx?validation_no=123456789

もちろんそのままアクセスしてもエラーになるし、
validation_noを精製しようと頑張ってもよくわからん。

6時間ほど悩んだ後、ディベロッパーツールを眺めていたら、

https://hoge.com/fuga.aspx?validation_no=123456789

の前にアクセスしてるページ(※)に「Location」という文字があるじゃん!と気づく。
調べて見るとリダイレクト先を指定しているようだ。
あれ、つまりvalidation_no考えなくてもいいってこと!?

※仮に以下のURLとする

https://hoge.com/top.aspx

やったこと

こんな感じで、一旦

https://hoge.com/top.aspx

を使い、下記でLocationを取得する。

Connection.Response res = Jsoup.connect(Url)
        .headers(header)
        .timeout(3000)
        .cookies(cookies)
        .method(Connection.Method.GET)
        .followRedirects(false)
        .execute();

System.out.println(response.header("Location"));

そうすると、validation_no付きのURLが取得できるので、
それを使って、やりたいことを実行する。

終わりに

見る人が見れば一発でわかりそうだけど、ハマってしまった。。。

参考:https://stackoverflow.com/questions/16243455/capture-header-location-with-jsoup-or-other-html-parser

追記(2018/6/18)

受け取ったLocationで再度Jsoupを叩いていたんだけど、
そもそも、

        .followRedirects(true)

この存在だけでよかったっぽいです。