伝えたいこと
Googleの検索結果からリンク先のURL文字列だけをちゃちゃっと抽出する方法です。
ブラウザの開発者ツールとsessionStorage
を使います。
背景
いまだHTTPで動いている日本のWebサイトのURL(FQDNレベル)を収集したかった。
Google Dorksにて intitle:"index of" inurl:http after:2010 inurl:jp
このように検索した。1ページにおよそ検索結果が10サイトぐらい出てくる。
ここからURLを一つ一つ手動でコピペするのはかなりめんどくさい。
真っ先に考えることはAPIを使うことであるが、すぐには用意がなかった。
Seleniumなどブラウザ動作をエミュレートするプログラミングをしようと考えるが10分以内に終えたかった。
短期間にアクセスしすぎると、Google検索結果にてbot検知のGoogle reCAPTCHAが発動する懸念もある。
方法
ブラウザの開発者ツールにて少量のJavaScriptと'sessionStorage'で10分でURL 120個ぐらいを収集した。
%1. ブラウザの開発者ツールを開く(Safariの例)
%2. JavaScriptコンソールのタブに移動
%3. sessionStorageの初期化
sessionStorage.clear()
%4. sessionStorageに検索結果のURLリストを登録するために以下のJavaScriptをコンソールに入力して実行(Enter)
(DOMのプロパティは今後Googleにて変更になる可能性があることに留意)
document.querySelectorAll("cite").forEach(
function(currentValue,currentIndex) {
sessionStorage.setItem(Number(location.href.match(/&start=(\d+)&/)[1])+currentIndex,currentValue.textContent);
},
);
%5. 次のページボタンを手動で押す
%6. %4を再度実行
%7. %5と%6を繰り返す
%8. sessionStorageに登録したURLリストをJavaScriptコンソールにダンプ。200は適当に必要十分以上のバッファ値で、検索結果の総数より多い値を入力する。最下部"参考"のリンク先ではブラウザ開発者ツールの中でsessionStorageをテーブル表示する方法を紹介している。
var urls = []
for (let i = 0; i < 200; i++) {
urls.push(sessionStorage.getItem(i));
}
console.log(urls);
この方法ならGoogle reCAPTCHAが表示されても手動で突破すればよい。
reCAPTCHAの入力と次のページめくり、JavaScriptコンソールへの4の実行は手動である半自動オペレーション。
%9. JavaScriptコンソールから結果をConsole.txtにExport(Safariの場合、Array出力部分を右クリックし上から4番目の"Save Selected"を選択)
%10. 結果の加工
cat Console.txt | grep http | sed -e 's/ › /\//g' | cut -d" " -f2- | sort | uniq | sed -e 's/"//g'
まとめ
使い回すのであればPowerAutomateやSeleniumなどでクローリングの型化をするのが好ましいが
プログラミングの実行環境がすぐにインストールできない端末で即興でWeb Hackingをするには、
やはりブラウザ開発者ツールは便利!
参考
以上です。ご一読ありがとうございました。
ご参考になれば幸いです。