狠狠撸

狠狠撸Share a Scribd company logo
颈蚕翱狈を支えるクローラーの里侧
VASILY,Inc. 塩 健弘
塩 健弘
大学時代はロボコンで8bitマイコンを使ったり
原子核物理の研究でFPGAを使った信号処理ボードを作ったり
2015年にVASILYに新卒入社して、クローラーの刷新をしたり
VASILY, Inc.
software engineer
日本最大級の
ファッションアプリ
[特徴]
ユーザーがファッションアイテムを組み合わせてコーデを作れる
気に入ったアイテムがあったら、
その場でECサイトに飛んでお買い物できる
提携ECサイト
日本中のECサイトの商品情報をクローリング
(価格、写真、在庫 etc.)
クロール対象の
??ECサイト: 約400サイト
??商品数:約700万商品
全体構成
Download
Worker
Parse
Worker
Sync
Worker
ImageProcess
Worker
Download
Worker
ImageProcess
Worker
???
???
???
???
クローリング処理を4つの段階に分けて分散処理
? ページダウンロード
? DOM解析
? マスターテーブルへの同期
? 画像処理
ECサイト
Sync
Worker
Parse
Worker
ワーカー間のメッセージパッシング
Message
Queue
(Redis)
dequeue
JOB
Sidekiqを利用した
Producer-Consumerパターン
WorkerA WorkerB
WorkerA WorkerB
???
???
enqueue
JOB
ページダウンロード
Download
Worker
Download
Worker
Message
Queue
ECサイト
Sender ???
Message
Queue
1. enqueue
MySQL
2. dequeue
3. lock
DistMutex
4. download
5. save
6. enqueue
Download
Worker
Download
Worker
Message
Queue
ECサイト
Sender ???
Message
Queue
1. enqueue
MySQL
2. dequeue
3. lock
DistMutex
4. download
5. save
6. enqueue
ページダウンロード
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)
Download
Worker
Download
Worker
Message
Queue
ECサイト
Sender ???
Message
Queue
1. enqueue
MySQL
2. dequeue
3. lock
DistMutex
4. download
5. save
6. enqueue
ページダウンロード
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/)
Download
Worker
Download
Worker
Sidekiq
queue
ECサイト
Sender ???
Sidekiq
queue
1. enqueue
MySQL
2. dequeue
3. lock
DistMutex
4. download
5. save
6. enqueue
ページダウンロード
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クライアントを実装
Download
Worker
Download
Worker
Sidekiq
queue
ECサイト
Sender ???
Sidekiq
queue
1. enqueue
MySQL
2. dequeue
3. lock
DistMutex
4. download
5. save
6. enqueue
ページダウンロード
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
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
?クローラー作成を効率化するための社内ツール
?項目抽出のための設定を入稿できる
クローラー大量生産の課題
ECサイトごとに抽出するデータの場所が異なる
15項目 400サイト = 6000项目
CrawlerGenerator
クローラー作成を効率化するための社内ツール
? 項目抽出のための設定(XPATH, 正規表現, 文字列操作)を入稿可能
? 入稿した項目はその場で正しいかどうかをプレビュー可能
? ツールでは手に負えない時にはrubyコードをマージすることも可能
CrawlerGenerator
このツールを使用してクローラーを作ったのは非エンジニア
XPATHと正規表現のマニュアルを整備し、誰でもクローラーが作れるように
CrawlerGenerator
? Chromeの拡張機能 XPATH Helperも利用
? XPATHを効率的に抽出
XPATH Helper(https://chrome.google.com/webstore/detail/xpath-helper/hgimnogjllphhhkhlmebbmlgjoejdpjl)
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
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
商品カテゴリの自動分類
MeCabを利用した形態素解析
カテゴリーを表現している単語の抽出
iQONのカテゴリーにマッピング
ブランド情報と照合して異常を排除
テキスト情報を使用
? 商品名
? 商品説明文
? パンくずリスト
商品カテゴリの自動分類
MeCabを利用した形態素解析
? 基本的にはIPA辞書と新語辞書(mecab-ipadic-neologd)を使用
? ファッションアイテム名やブランド名が不十分だったので、?
ファッション用語数万語を独自に追加
まるでぬいぐるみのような思わず抱きしめたくなるアイテムです。
まるで ぬいぐるみ の ような
思わ ず 抱きしめ たく なる アイテム です 。
商品カテゴリの自動分類
カテゴリーを表現している単語を抽出
印象的な幾何学柄のジャガードニットプルオーバー。インパクトのあるモード
なアイテムですが、モノトーンカラーなので、様々なボトムに合わせやすいです。繊
細なプリーツスカートやギャザースカートなどフェミニンアイテムとも
好相性です。
? カテゴリー判定の判断材料となる単語を自動抽出
? 複数個の単語が検出された場合は文脈を考慮して1つに絞り込む
ニットプルオーバー
商品カテゴリの自動分類
iQONのカテゴリーにマッピング
セーター
ニットプルオーバー
ニット
傘
Umbrella
レインブーツ
レイングッズ
抽出された単語をiQONのカテゴリーに変換
商品カテゴリの自動分類
ブランド情報と照合して異常を排除
ブランド カテゴリーの組み合わせがアリエナイ判定結果を排除
? 過去の人力判定結果から条件付確率 p(カテゴリ?ブランド)を求める
? 扱っているカテゴリーがほぼ1つのブランドの誤判定の抑制に効果的
商品カテゴリの分類
約100カテゴリへの分類で精度97%を達成
ワンピース スカート パンプス
マスターテーブルへの同期
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への負荷が高まるので適度に速度を抑える
画像処理
アイテム単体画像の判定
(モデル着用画像、
マネキン着用画像との区別)
精度97 %
画像の透過処理
(アイテム単体画像のみ)
エラーログの集計
Worker
Worker
???
???
ECサイトのサイト変更を素早く検知したい
→各処理のログを全てBigQueryに保存 & 異常検知
(パース中のエラー、画像処理中のエラー、カテゴリー判定、etc.)
異常検知
BigQuryの内容を集計して自動レポート生成(SpreadSheet)
緊急度が高い異常を検知した時にはslackにアラート
自動集計(daily)
アラート
ありがとうございました
? クローラーについて聞きたい人お待ちしてます
? 興味ある方の入社お待ちしています!

More Related Content

颈蚕翱狈を支えるクローラーの里侧