スクレイピング

スクレイピングがバレてないか確認できるツールを作った話

はじめに

皆さん、クローリング/スクレイピングしてますか? してますね?(威圧確認

スクレイピングする際に気をつけなければならないことの1つに「BANされないような挙動をする」がある。

といっても、UA偽装やIP分散など経験のある人には共通認識ですが、慣れないうちだと結局何に気をつけるべきかあまりわからないと思う。

加えて、最近ではJavascriptが実行可能なクローラーでないとほしいデータが取れないサイトも増えてきており、
puppeteerで対応できるものの、逆にJS側でクローラーかどうか判別されやすくなってしまった。

と、いうことで、スクレイピングする際に、クローラーであることをなるべく隠蔽できているか確認できるツール、「スクレイピング確認くん」を作った。

スクレイピング確認くん http://scrape.turai.work

screenshot-scrape.turai.work-2018.12.02-22-38-20.png

なにができるの

このツールでは、

  • User-Agent
  • Accept-Language
  • リモートホスト
  • Javascriptの実行可能有無
  • スクリーンサイズ
  • ウィンドウサイズ

を取得して通常のアクセスと似たアクセスかどうかを一発で確認できる

puppeteerでアクセスした場合

特にオプションを指定パターン。Accept-Languageが含まれていない、User-Agentに「HeadlessChrome」が含まれてしまっている、ウィンドウサイズがおかしい(小さすぎる)などがわかる。

result.png

ちなみに確認コードは以下

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('http://scrape.turai.work/');
  await page.screenshot({path: 'result.png', fullPage: true});
  await browser.close();
})();

curlでアクセスした場合

キャプチャ非対応でも、 http://scrape.turai.work/json にアクセスするとJSON形式で返却するので確認できる。(jqはJSONの整形に使ってるだけなので必須ではない)

curl http://scrape.turai.work/json? | jq .
{
  "ua": {
    "name": "User-Agent",
    "status": "NG",
    "value": "curl/7.58.0"
  },
  "accept_language": {
    "name": "Accept-Language",
    "status": "NG",
    "value": null
  },
  "remote_host": {
    "name": "Remote-Host",
    "status": "NG",
    "value": "xxx.xxx.xxx.xxx"
  }
}

この場合はUA,Accept-Language未設定なのに加えて、AWSからアクセスしたのでリモートホストをXにしている。

別にAWSとかGCPからのアクセスがNGとは一概にいえないが、普段のアクセスでは本来ありえないので、やはりBANの対象になりやすい、というのは確実にいえる。

確認先で説明もつけたのでよかったら見てほしい。

まとめ

アクセス先に迷惑をかけない範疇で楽しいスクレイピング生活を!(