Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

iQONを支えるクローラーの裏側

8,243 views

Published on

Fashion Tech meetup #1 発表資料
iQONがどのようにして大量の商品データをECサイトからクローリングしているのかを説明

Published in: Technology

iQONを支えるクローラーの裏側

  1. 1. iQONを支えるクローラーの裏側 VASILY,Inc. 塩 健弘
  2. 2. 塩 健弘 大学時代はロボコンで8bitマイコンを使ったり 原子核物理の研究でFPGAを使った信号処理ボードを作ったり 2015年にVASILYに新卒入社して、クローラーの刷新をしたり VASILY, Inc. software engineer
  3. 3. 日本最大級の ファッションアプリ [特徴] ユーザーがファッションアイテムを組み合わせてコーデを作れる
  4. 4. 気に入ったアイテムがあったら、 その場でECサイトに飛んでお買い物できる 提携ECサイト
  5. 5. 日本中のECサイトの商品情報をクローリング (価格、写真、在庫 etc.)
  6. 6. クロール対象の   ECサイト: 約400サイト   商品数:約700万商品
  7. 7. 全体構成 Download Worker Parse Worker Sync Worker ImageProcess Worker Download Worker ImageProcess Worker ・・・ ・・・ ・・・ ・・・ クローリング処理を4つの段階に分けて分散処理 • ページダウンロード • DOM解析 • マスターテーブルへの同期 • 画像処理 ECサイト Sync Worker Parse Worker
  8. 8. ワーカー間のメッセージパッシング Message Queue (Redis) dequeue JOB Sidekiqを利用した Producer-Consumerパターン WorkerA WorkerB WorkerA WorkerB ・・・ ・・・ enqueue JOB
  9. 9. ページダウンロード Download Worker Download Worker Message Queue ECサイト Sender ・・・ Message Queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue
  10. 10. Download Worker Download Worker Message Queue ECサイト Sender ・・・ Message Queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード
  11. 11. Download Worker Download Worker Message Queue ECサイト Sender ・・・ Message Queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード クロール対象URLを決定 ECサイト 商品リストページ 過去にクロールした商品 (in DB)
  12. 12. Download Worker Download Worker Message Queue ECサイト Sender ・・・ Message Queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード
  13. 13. Download Worker Download Worker Sidekiq queue ECサイト Sender ・・・ Message Queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード スケジューリング 1 request / s という紳士協定 時限付き分散Lock (https://github.com/vasilyjp/redis- dist-mutex) →ワーカーの稼働率向上 [Ref] vasily tech blog Redis::DistMutex 時限付き分散ロックで効率 良くサイトクロールをしよう (http://tech.vasily.jp/crawl-sites-with- redis-dist-mutex/)
  14. 14. Download Worker Download Worker Sidekiq queue ECサイト Sender ・・・ Sidekiq queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード
  15. 15. Download Worker Download Worker Sidekiq queue ECサイト Sender ・・・ Sidekiq queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード ダウンロード open-uriでは機能不足 ・リダイレクト時の処理 ・POSTリクエスト ・UserAgent → net/httpをベースにした HTTPクライアントを実装
  16. 16. Download Worker Download Worker Sidekiq queue ECサイト Sender ・・・ Sidekiq queue 1. enqueue MySQL 2. dequeue 3. lock DistMutex 4. download 5. save 6. enqueue ページダウンロード
  17. 17. DOM解析 Parse Worker Parse Worker Message Queue ・・・ Message Queue DynamoDB 1. dequeue 4. save 5. enqueue DSL (XPATH, RegExp, etc.) rubyコード片 CrawlerGenerator generate 3. include3. include MySQL 2. load
  18. 18. DOM解析 Parse Worker Parse Worker Message Queue ・・・ Message Queue DynamoDB 2. dequeue 3. save 4. enqueue DSL (XPATH, RegExp, etc.) rubyコード片 CrawlerGenerator generate includeinclude CrawlerGenerator  クローラー作成を効率化するための社内ツール  項目抽出のための設定を入稿できる
  19. 19. クローラー大量生産の課題 ECサイトごとに抽出するデータの場所が異なる 15項目 400サイト = 6000項目
  20. 20. CrawlerGenerator クローラー作成を効率化するための社内ツール • 項目抽出のための設定(XPATH, 正規表現, 文字列操作)を入稿可能 • 入稿した項目はその場で正しいかどうかをプレビュー可能 • ツールでは手に負えない時にはrubyコードをマージすることも可能
  21. 21. CrawlerGenerator このツールを使用してクローラーを作ったのは非エンジニア XPATHと正規表現のマニュアルを整備し、誰でもクローラーが作れるように
  22. 22. CrawlerGenerator • Chromeの拡張機能 XPATH Helperも利用 • XPATHを効率的に抽出 XPATH Helper(https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl)
  23. 23. DOM解析 Parse Worker Parse Worker Message Queue ・・・ Message Queue DynamoDB 4. save 5. enqueue DSL (XPATH, RegExp, etc.) rubyコード片 CrawlerGenerator generate 3. include3. include dequeueしたジョブ毎に、 別々の設定をincluce MySQL 2. load 1. dequeue
  24. 24. DOM解析 Parse Worker Parse Worker Message Queue ・・・ Message Queue DynamoDB 4. save 5. enqueue DSL (XPATH, RegExp, etc.) rubyコード片 CrawlerGenerator generate 3. include3. include 解析結果のデータを DynamoDBに保存 MySQL 2. load 1. dequeue
  25. 25. 商品カテゴリの自動分類 MeCabを利用した形態素解析 カテゴリーを表現している単語の抽出 iQONのカテゴリーにマッピング ブランド情報と照合して異常を排除 テキスト情報を使用 • 商品名 • 商品説明文 • パンくずリスト
  26. 26. 商品カテゴリの自動分類 MeCabを利用した形態素解析 • 基本的にはIPA辞書と新語辞書(mecab-ipadic-neologd)を使用 • ファッションアイテム名やブランド名が不十分だったので、
 ファッション用語数万語を独自に追加 まるでぬいぐるみのような思わず抱きしめたくなるアイテムです。 まるで ぬいぐるみ の ような 思わ ず 抱きしめ たく なる アイテム です 。
  27. 27. 商品カテゴリの自動分類 カテゴリーを表現している単語を抽出 印象的な幾何学柄のジャガードニットプルオーバー。インパクトのあるモード なアイテムですが、モノトーンカラーなので、様々なボトムに合わせやすいです。繊 細なプリーツスカートやギャザースカートなどフェミニンアイテムとも 好相性です。 • カテゴリー判定の判断材料となる単語を自動抽出 • 複数個の単語が検出された場合は文脈を考慮して1つに絞り込む ニットプルオーバー
  28. 28. 商品カテゴリの自動分類 iQONのカテゴリーにマッピング セーター ニットプルオーバー ニット 傘 Umbrella レインブーツ レイングッズ 抽出された単語をiQONのカテゴリーに変換
  29. 29. 商品カテゴリの自動分類 ブランド情報と照合して異常を排除 ブランド カテゴリーの組み合わせがアリエナイ判定結果を排除 • 過去の人力判定結果から条件付確率 p(カテゴリ¦ブランド)を求める • 扱っているカテゴリーがほぼ1つのブランドの誤判定の抑制に効果的
  30. 30. 商品カテゴリの分類 約100カテゴリへの分類で精度97%を達成 ワンピース スカート パンプス
  31. 31. マスターテーブルへの同期 Sync Worker Sync Worker Message Queue ・・・ Message Queue MySQL 1. dequeue 3. save 4. enqueue if item is new DyamoDB 2. load ParseWorkerがMySQLに対して直接書き込むと MySQLへの負荷が高まるので適度に速度を抑える
  32. 32. 画像処理 アイテム単体画像の判定 (モデル着用画像、 マネキン着用画像との区別) 精度97 % 画像の透過処理 (アイテム単体画像のみ)
  33. 33. エラーログの集計 Worker Worker ・・・ ・・・ ECサイトのサイト変更を素早く検知したい →各処理のログを全てBigQueryに保存 & 異常検知 (パース中のエラー、画像処理中のエラー、カテゴリー判定、etc.)
  34. 34. 異常検知 BigQuryの内容を集計して自動レポート生成(SpreadSheet) 緊急度が高い異常を検知した時にはslackにアラート 自動集計(daily) アラート
  35. 35. ありがとうございました • クローラーについて聞きたい人お待ちしてます • 興味ある方の入社お待ちしています!

×