1. アンチボット技術: ボット対策のいたちごっこ
今日は、ウェブスクレイピングの最も興味深く、ある意味で議論を呼ぶテーマ のひとつである「ボット対策の回避方法とCAPTCHAとの戦い」に触れます。 プログラマーの人生ではよくあることですが、したたかなネジには逆向きに 回るナットがあるもので、これらの障害をどう克服できるか見ていきましょう。
抜け道を探し始める前に、何に直面しているのかを理解しましょう。 アンチボット技術とは、ウェブサイトを過剰でしばしば望ましくない 自動プログラムの注目から保護するためのシステムです。以下は一般的な方法です:
- CAPTCHA: CAPTCHAはアンチボットの世界における核兵器のようなものです。 目的は、ユーザーに人間の関与を必要とするタスクを提示して ボットリクエストを排除することです。たとえば、タクシーの画像をすべて選択したり、 歪んだ文字の組み合わせを入力したりします。
- 行動分析: 一部のウェブサイトでは、フォームへの入力速度や ページ要素とのインタラクションの速さを評価します。速すぎる? あなたはもうブロックされています。
- リクエストの遅延と制限: サイトがあなたを人間でないと 疑い始めると、リクエスト間の遅延を増やしたり、完全にブロックしたりできます。
2. アンチボットの回避手法
敵を知った今、対策を検討してみましょう。
CAPTCHAの解決
最も明らかで同時に困難な方法は、CAPTCHAの解決を自動化することです。 そう、それは可能ですが、特定のツールと第三者サービスが必要です。 CAPTCHAにはテキスト、グラフィック、さらには音声CAPTCHAなどさまざまなタイプがあります。
CAPTCHAの解決を自動化するためには、2Captchaや Anti-CaptchaなどのAPIサービスを使用できます。 これらのサービスは少額の料金でCAPTCHAの解決を提供します。実際のコード例を見てみましょう:
import requests
def solve_captcha(api_key, site_url, captcha_image_url):
# CAPTCHA画像をダウンロード
captcha_image = requests.get(captcha_image_url).content
# 画像をサービスに送信し、タスクIDを取得
response = requests.post("http://2captcha.com/in.php", files={'file': captcha_image}, data={'key': api_key, 'method': 'post'})
captcha_id = response.text.split('|')[1]
# CAPTCHAの答えを取得
solution_url = f"http://2captcha.com/res.php?key={api_key}&action=get&id={captcha_id}"
solution_response = requests.get(solution_url)
while 'CAPCHA_NOT_READY' in solution_response.text:
solution_response = requests.get(solution_url)
return solution_response.text.split('|')[1]
# 関数使用例
api_key = 'あなたの2CAPTCHAキー'
site_url = 'https://example.com'
captcha_image_url = 'https://example.com/captcha_image'
captcha_solution = solve_captcha(api_key, site_url, captcha_image_url)
print("CAPTCHAの答え:", captcha_solution)
このコードはCAPTCHAを解決するためのリクエストがどのように機能するかを示しています。 ただし、この方法は複雑なグラフィック問題や、頻繁にアルゴリズムを変更するサイト には効果がない場合があります。
人間の行動を模倣する
別の回避方法として、人間の行動を模倣する方法があります。 スクリプトのランダムな場所に遅延を挿入したり、user-agentを変更したり、 双方向のインタラクションをエミュレートしたり、Seleniumを使用してマウスの動きをエミュレートすることなどが含まれます:
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
import time
driver = webdriver.Chrome()
driver.get('https://example.com')
# マウスの動きをエミュレーション
actions = ActionChains(driver)
element = driver.find_element_by_id('button')
actions.move_to_element(element)
actions.perform()
# 自然なインタラクションを作成するための遅延
time.sleep(2)
# アクションを実行
element.click()
Seleniumについての詳しい情報は次回の講義で説明します。
動的IPとプロキシの利用
プロキシサーバーを使用して、リクエストを送信するIPアドレスを変更することもできます。 これは、1つのIPからのリクエスト数の制限を回避するのに役立ちます。 Bright Dataや Smartproxyなどのサービスがあります。
import requests
proxy = {
"http": "http://123.456.789.012:8080",
"https": "http://123.456.789.012:8080",
}
response = requests.get('https://example.com', proxies=proxy)
print(response.content)
3. 重要な注意点
アンチボット回避の実装には知識と試行錯誤が必要です。 すべての方法が合法であるわけではないことやウェブサイトによって許可されていない可能性があることを忘れないでください。 必ず "robots.txt" を確認し、サーバーの負荷を避けるためにウェブスクレイピングのエチケットを遵守してください。 これは法的な問題を回避するだけでなく、他人の労力を尊重することにもなります。
本格的なパーサーを自宅のIPで実行しないでください。 学習目的のパースであれば問題ありませんが、スクリプトを誤って何千ものリクエストを同時に送信し、サーバーを落とした場合、 あなたに質問が寄せられる可能性があります。その後、質問をするための人が直接訪れることもあり得ます。
GO TO FULL VERSION