プロフィール

髭山髭人(ひげひと)

自分の書いた記事が、一人でも誰かの役に立てば...
活動信条の一つとして「貴方のメモは、誰かのヒント」というのがあります。

このサイトについて

本家HP packetroom.net から切り離した いわゆる技術メモ用のブログで、無料レンタルサーバーにて運用しています。広告表示はその義務なのでご容赦。
XREA さんには長年お世話になっています

アイドルギャラリー上でベタ書きのJSONをパース

概要

各個人のアイドルギャラリーページに接続し、関連・内包するカードオブジェクトを取得する。
抜き出し処理に関する覚書なので、ページアタッチ系の処理には触れていない

記載場所

今のところ 非同期でJSONを持ってくる形ではなく、得られたhtml上にベタ書きされている模様。
div#top > script のいずれかに位置しており、 window.idol に代入する処理

抜粋

<script type="text/javascript">
(function(){
var idol = {};
idol.detail_list = [{"data":{"card_name":"\u4e59\u5009\u60a0\u8cb4","rarity":"3","cost":"12",(中略)]};
idol.ios_app_flg = false;
idol.apple_review = null;
window.idol = idol;
})();
var birthday_flag = false;
var select_card_index = "33";
var selected_num = null;
var url_trade = 'http://sp.pf.mbga.jp/12008305/?guid=ON&amp;url=http%3A%2F%2F1( 略 )
var url_comment_5th_redirect = "idol_gallery/idol_detail/__hash_card_id__";
var slider_pos = 6;
var select_tab = 0;
var comments_info = {"comment":{"category":"greeting","type":"idol","conditions":"none"}( 略 )
var conditions_names = {"none":"\u6761\u4ef6\u7121\u3057","get_idol":"\u30a2\u30a4\u30c9\u30eb\u304c\u6240\u5c5e\u3059\u308b\u3068\u95b2\u89a7\u3067\u304d\u307e\u3059","love_max":"\u89aa\u611b\u5ea6\u3092MAX\u306b\u3059\u308b\u3068\u95b2\u89a7\u3067\u304d\u307e\u3059"};
var comment_tab_start = null;
var show_premium = true;
</script>

(以下スクリーンショット)

※ 本来はもっと大量のオブジェクト行が記載されています。

これらが <script>~</script> に収まっているので、一部を抽出しつつ無理やりパースする。
突き詰めれば、idol.detail_list に代入している行が欲しい ..という事。

window空間上での扱い

window.idol オブジェクトに格納され、アクセスするとざっくり以下のような感じ。
detail_list の配列に美味しそうな情報がつまっています😋

処理メモ 2020/12/10

(function(){
var idol = {};
idol.detail_list = [{"data":(中略)_exist_archive":false,"is_max_love":false}];
idol.idol_story_list = [{"story_id":(中略)
...
..
略

抽出したい箇所及びその付近が上記のようになっていたので、

_match = re.search(r'\(function\(\){\nvar idol = {};\nidol.detail_list = (.*?);\nidol.idol_story_list = \[', _oring_script, re.DOTALL)

で抽出する。(結構無理やり)

(function(){
var idol = {};
idol.detail_list = (この部分!); // ← ここ😋
idol.idol_story_list = [{"story_id":(以下略)
})();
...以下略...

↑ ※ 上記の(この部分!) が得られる。
先程も記載したが、

detail_list = [
    {
     "archive":(値),
     "comments":(値),
     "data":(値),
     "event":(値),
     "idol_search_param":(値),
     "is_exist_archive":(値),
     "is_max_love":(値),
     "profile":(値),
     "release":(値),
     "trade_prohibition":(値),
    }
    ,
    {
     "archive":(値),
     "comments":(値),
     ...略...
    }
    ,{ ...略... }
    ,{ ...略... }
    ...以下略...
];

...のような感じで、そのアイドルでリリースされたカードデータの詳細オブジェクトが、配列で管理されている。

上手く抽出できたら _script_str = _match.group(1) 的な感じでグループを得て、
json.loads(_script_str) でパースすれば、個々のカードオブジェクトを束ねた list 型が手に入る筈