内容的に読ませる気ないので読みづらい形式で書いてます。ごめんなさい。
当方、php-webdriver(Selenium)とGuzzle愛用者です。
Guzzleはxhtml非対応なので自前で変換処理が必要。(ヒント:DOCTYPE宣言を変更したりiconvで文字コード変換するなど。)
スクレイピング対策が強いサイトでは、プロキシを通していても同じタイミングでブロックされることがある。外部からの観測した結果の憶測にはなるが、IPアドレスとクライアント側の内部データ(Cookieやlocalstorage等)が紐付けされて、同一人物として検出されている様子だ。(ブラウザ操作をする場合だけのお話。Guzzle等では基本的には該当しない。)
AというIPアドレスと、
BというIPアドレスでアクセスした場合、内部データが残っていると AとBを Cookieやlocalstorage等のデータを元に芋づる式に紐付いてしまうようだ。とあるサイトではこの効果は強力で1つブロック対象になると、ほぼ同タイミングで一瞬にしてプロキシリストのほぼ全てが使い物にならなくなる。
完全な回避は難しいけれども、アクセスする前にブラウザの内部データを全て削除した上で実行すると結構長い間ブロックされずに使える。(経験則)
すべてのウィンドウを閉じるときに cookie とサイトデータを削除する
というオプションが何気に便利な気がする。個人的には不安なので chrome://settings/clearBrowserData?search=cookie
で全期間にしてデータを削除をJSからclick()して実行もしている。
低コストで大量スクレイピングのヒント(部分的にJS処理が必要でJS処理結果とCookieが紐付いているサイト等で使える):
- Seleniumで各IPアドレスのCookieデータを集めてDBに保存(一時的に複数マシンを立ち上げて実行。完了したらマシン捨てればOK)
- DBに保存したCookieを用いてDockerコンテナで Guzzle を使ってスクレイピング。
VPSの1GBマシンでも15コンテナぐらい同時に動かせる。
月5,000円程度で150プロセスを同時に動かせるぐらい。(こんなんsleepしてないのと同じなんですけどね...。建前的sleepだね。)
誰とも情報交換したことないので、これが安いかどうかは分かりません。
- Vultr
- Linode
- DigitalOcean
あたりのVPSがおすすめ。
自由に作って自由に捨てれる。
プロキシは WebShare が安価で安定してていい感じ。(良質で安価なプロキシあったら知りたいのでコメントください。)プロキシのベーシック認証はExtensionを生成して通す形で実現。ググれば余裕で出てくるので割愛。Selenium使うときは画像リソースを受け付けないブラウザ設定にするのを忘れずに。帯域制限引っかかって死んじゃう。
節度あるスクレイピングライフを!
単発のスクレイピングは簡単。継続的なスクレイピングは難しい。