chai222222 / jangetter

get jan code
0 stars 0 forks source link

微調整カスタマイズ化検討 #24

Closed chai222222 closed 2 months ago

chai222222 commented 4 months ago

jangetterの標準機能で、各サイトの jan, title、-g オプションでイメージを取得する情報などは各サイト用クラスにハードコーディングされているが、外だししてカスタマイズしてもらうようにするための検討用 issue。

そのため、商品ページからのデータ取得定義などがどのように定義されているかを簡単にわかってもらえるように説明してみる。


現設定部の仕様

各サイト単位のクラスファイルがあるが、設定情報は定数で以下のようになっている。

const MYOJO_CONSTANTS = {
  searchConfig: {
    prefix: 'Myojo',
    top: 'https://www.myojofoods.co.jp/search/',
    lastSupportedDate: '2022/06/02: 19:00:00',
    searchPageSelectors: {
      productsLink: 'div.ns-c-items__item > a',
      onlyCurrentPage: true,
      nextLink: 'section.ns-p-search__results__products a.ns-c-a_button__more',
      searchText: 'header.ns-p-search__header input[name="q"]',
      searchButton: 'button[type="submit"]',
    },
    productPageSelectors: {
      jan: '//dt[contains(text(), "JANコード")]/../dd',
      title: 'h1.ns-headline_01',
      allergy: {
        selector: 'ul.ns-c-list_allergens--item li.active a',
      },
    },
    productPageImages: {
      suffix: '.jpeg',
    },
    productPageImageSelectors: {
      picture: 'section.ns-p-item__main img',
    },
    replacer: {
      title: [
        REPLACERS.trim,
      ],
    },
  },
};

この中で、各商品ページのための情報を抜いて説明する。

明星

    productPageSelectors: {
      jan: '//dt[contains(text(), "JANコード")]/../dd',
      title: 'h1.ns-headline_01',
      allergy: {
        selector: 'ul.ns-c-list_allergens--item li.active a',
      },
    },
    productPageImages: {
      suffix: '.jpeg',
    },
    productPageImageSelectors: {
      picture: 'section.ns-p-item__main img',
    },

Coop

    productPageSelectors: {
      // jan: '#basicInfo tbody > tr:nth-child(2) td img',
      jan: 'url',
      // category: '#basicInfo tbody > tr:first-child td',
      title: 'title',
      name: '//span[contains(text(), "名称")]/../../td',
      allergy: {
        selector: '//th[contains(text(), "物質名")]/..//img',
        attr: 'alt',
      },
    },

product*のキーで始まる定義が、各商品情報取得情報である。 以下簡単にまとめて説明する。

パス 内容
productPageSelectors 商品情報定義まとめ。
productPageImageSelectors イメージ取得情報(各キーの値がセレクタになっていて、参照されるイメージが取得される)
productPageImages イメージダウンロード付加情報
productPageImages.downloader イメージをダウンロードする時、この値に "puppeteer" が設定されている場合にブラウザで取得する(現:イトーヨーカドーのみセキュリティがらみで使用)。それ以外は axios。
productPageImages.suffix イメージをダウンロードする拡張子を強制的に指定する場合に定義する。通常は拡張子を検索してそのあとをとるが、明星だけCDNを利用していて拡張子がとれないため

画面からのデータの複数取得(タイトル+グラム等)ができたら結合も可能となっている。 また、結合したあと最後に replacer 定義にて、均一的な各属性の置き換えが可能となっている(https://github.com/chai222222/jangetter?tab=readme-ov-file#jangetterrc)。 各サイトごとに個別の置き換えはハードコーディングされているが、これは取得するデータもハードコーディングされているためである。 取得するデータをカスタマイズできるようにした場合、ここも各サイト単位にカスタマイズできるようにしたほうが良いかもしれないが、要検討。

chai222222 commented 2 months ago
chai222222 commented 2 months ago

完了したのでクローズ