うな(。・ε・。)

Android, iOS, AppEngine まわりのめもめも

クローラー開発の知見

  1. 鍵は「リンク先を辿るか辿らないか」の処理。
    • この処理が甘ければ甘いほど、同一サイトのクロールが遅くなります。同じ URL を踏まないようにするため、以前辿った URL を除外したり、パラメータをイイ感じに省いて正規化してあげる必要があります。
    • (鍵は「クロール枠の節約」と言い換える事も出来ます)
    • 特別なことが無い限りは ?, # 移行は捨てる
    • ただし、一部サイトはまだ ?id=hoge などとやっている
    • canonical を使った URL 正規化の判断はけっこう面倒くさいです
  2. 既に辿った URL は KVS に突っ込んでおく。
    • 5 万ページ程度のクロールでも 150 万くらいのリンクがあります
    • MySQL とかに突っ込むと既に辿ったページを判定する為のクエリがとても重い
    • 素直に KVS に突っ込みましょう(AppEngine なら Datastore + Memcache)
  3. ページをクロールするときはとりあえず丸ごと S3 とかに突っ込んでおく
    • その場でスクレイピングとかしようとすると、Exception に弱過ぎるし、後で情報が追加で欲しくなったときに困ります。とても
    • とりあえず S3 とか GCS に突っ込んでおいて、あとから幾らでもリトライ出来るようにします
    • スクレイピングタスクはこの後キューに入れると良いです

同一ホストに対しては 1 秒 1 URL のリクエスト、とクロール枠を定めると、一日あたり 86400 ページしか取得出来ません。 URL 正規化をミスると簡単に本来の 10~100 倍ほどのクロール対象 URL が出来てしまうので、URL 正規化をキチンとやらないとクロールが一生終わりません。