ホームページ >バックエンド開発 >Python チュートリアル >SEO スペシャリスト向けの高度な CAPTCHA バイパス テクニックとコード例
データ スクレイピングに携わるすべての SEO スペシャリストは、CAPTCHA が必要な情報へのアクセスを制限する困難な障壁であることを知っています。しかし、それは完全に避ける価値があるのでしょうか、それともそれを回避する方法を学んだ方が良いのでしょうか? CAPTCHA とは何なのか、なぜこれほど広く使用されているのか、そして SEO スペシャリストが実際の例と効果的な方法を使用して CAPTCHA を回避する方法を詳しく見てみましょう。
すべての SEO 専門家は CAPTCHA に遭遇したことがあります。そうでない場合は、専門家ではないか、SEO の頭字語を誤解しているか (SMM や CEO と混同している可能性があります)、あるいはこの困難な作業をまだ始めたばかりであるかのいずれかです。
CAPTCHA (「コンピュータと人間を区別するための完全に自動化された公開チューリング テスト」) は、データ スクレイピングやボット攻撃などの自動化されたアクションからサイトを保護する方法です。 CAPTCHA は「Полностью автоматизированный публичный тест Тьюринга для различения компьютеров и людей」と翻訳されます。
CAPTCHA が過大評価されているということを長年否定し、多額のリソースの価値がないと主張する人もいるでしょう。しかし、XML リクエストについて何も考えずに、Yandex などの検索エンジンからデータを取得する必要がある瞬間に、そのような議論は崩壊します... または、たとえば、クライアントが Amazon のすべてを収集したいと考えていて、十分な支払いをしている場合... いいえそのとき疑問が生じます:「これ以上は言わないでください…」
状況は思っているほど単純ではありません。データ スクレイピングからサイトを保護することは、特に非営利プロジェクトや「ハムスター サイト」の場合は困難です。多くの場合、CAPTCHA にリソースを割り当てる時間がなく、最も重要なことに、その必要もありません。しかし、あなたが何百万もの収入をもたらす大手ポータルのオーナーである場合は話が別です。その場合、DDoS 攻撃や不正な競合他社を防ぐための対策を含む、本格的な保護を検討するのが合理的です。
たとえば、Amazon は 3 種類の CAPTCHA を適用し、それぞれが異なる状況で表示され、自動化ツールやスクレーパーが時代遅れの方法に依存できないように設計をランダムに変更しています。そのため、保護を回避するのは複雑でコストがかかります。
小規模なウェブマスターについて言えば、特にサイトの障壁が高すぎる場合、複雑な CAPTCHA が実際のユーザーを阻止する可能性があることも理解しています。同時に、サイトを保護せずに放置するのは賢明ではありません。これは、CAPTCHA をバイパスできない可能性があるものの、大量のアクションを実行できる最も愚かなボットさえも引き寄せてしまいます。
現代のサイト所有者は、reCAPTCHA や hCaptcha などの汎用ソリューションを使用してバランスを見つけようとしています。これにより、ユーザーに重大な不便をもたらすことなく、単純なボットからサイトを保護できます。より複雑な CAPTCHA は、サイトが大規模なボット攻撃に直面した場合にのみ使用されます。
SEO スペシャリストの観点からこの質問を考えてみましょう: CAPTCHA をバイパスする理由と目的は何ですか?
CAPTCHA バイパスは、検索エンジンでの位置の分析という最も基本的なタスクに必要な場合があります。もちろん、これは毎日の位置監視に料金を請求するサードパーティのサービスを通じて利用できます。さらに、サードパーティの CAPTCHA 認識サービスの料金も支払う必要があります。
CAPTCHA は、競合サイトを調査するときにも関連する場合があります。保護レベルが異なるため、競合他社のサイトで CAPTCHA をバイパスすることは、検索ランキングを収集するよりも簡単であることがよくあります。
日常的なタスクの自動化は、よりニッチなトピックです。誰もが使用しているわけではありませんが、専任の SEO スペシャリストにとっては、時間と労力を節約できる貴重なツールとなります。
一般に、費用対効果を計算することが重要です。位置監視サービスと CAPTCHA 認識サービスに料金を支払うのと、独自のソリューションを作成してコストを削減するのはどちらが安いでしょうか?もちろん、プロジェクトが 1 つまたは 2 つだけで、クライアントがお金を払っている場合、後者のオプションは過度に労働集約的であるように思えます。しかし、複数のプロジェクトを所有し、すべてを自分で支払う場合は…検討する価値があります。
Key Collector に API キーを単に差し込むよりももう少し手間がかかる方法を見てみましょう。サービスのホームページで API キーを見つけて、それを正しいフィールドに挿入する方法を知るだけではなく、より深い知識が必要になります。
最も一般的な方法は、CAPTCHA を専門のサービス (2Captcha や RuCaptcha など) に送信し、準備ができたソリューションを返す方法です。これらのサービスでは、解決された CAPTCHA ごとに支払いが必要です。
Python で reCAPTCHA V2 を解決するための標準コードの例を次に示します。
import requests import time API_KEY = 'YOUR_2CAPTCHA_KEY' SITE_KEY = 'YOUR_SITE_KEY' PAGE_URL = 'https://example.com' def get_captcha_solution(): captcha_id_response = requests.post("http://2captcha.com/in.php", data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': SITE_KEY, 'pageurl': PAGE_URL, 'json': 1 }).json() if captcha_id_response['status'] != 1: print(f"Error: {captcha_id_response['request']}") return None captcha_id = captcha_id_response['request'] print(f"CAPTCHA sent. ID: {captcha_id}") for attempt in range(30): time.sleep(5) result = requests.get("http://2captcha.com/res.php", params={ 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 }).json() if result['status'] == 1: print(f"CAPTCHA solved: {result['request']}") return result['request'] elif result['request'] == 'CAPCHA_NOT_READY': print(f"Waiting for solution... attempt {attempt + 1}/30") else: print(f"Error: {result['request']}") return None return None captcha_solution = get_captcha_solution() if captcha_solution: print('CAPTCHA solution:', captcha_solution) else: print('Solution failed.')
このコードは、解決のために CAPTCHA を自動的に送信し、保護をバイパスするために必要なトークンを受け取るのに役立ちます。
2 番目の方法では、レジデンシャル プロキシを使用して IP アドレスをローテーションします。これにより、あたかも別人であるかのように、新しいプロキシごとにサイトにアクセスできるようになり、CAPTCHA がアクティブ化される可能性が低くなります。
Python でプロキシ ローテーションを使用したコードの例を次に示します。
import requests from itertools import cycle import time import urllib.parse # List of proxies with individual logins and passwords proxies_list = [ {"proxy": "2captcha_proxy_1:port", "username": "user1", "password": "pass1"}, {"proxy": "2captcha_proxy_2:port", "username": "user2", "password": "pass2"}, {"proxy": "2captcha_proxy_3:port", "username": "user3", "password": "pass3"}, # Add more proxies as needed ] # Proxy rotation cycle proxy_pool = cycle(proxies_list) # Target URL to work with url = "https://example.com" # Headers to simulate a real user headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:129.0) Gecko/20100101 Firefox/129.0" } # Sending several requests with proxy rotation for i in range(5): # Specify the number of requests needed proxy_info = next(proxy_pool) proxy = proxy_info["proxy"] username = urllib.parse.quote(proxy_info["username"]) password = urllib.parse.quote(proxy_info["password"]) # Create a proxy with authorization proxy_with_auth = f"http://{username}:{password}@{proxy}" try: response = requests.get( url, headers=headers, proxies={"http": proxy_with_auth, "https": proxy_with_auth}, timeout=10 ) # Check response status if response.status_code == 200: print(f"Request {i + 1} via proxy {proxy} was successful.") else: print(f"Request {i + 1} ended with status code {response.status_code}") except requests.exceptions.RequestException as e: print(f"Error with proxy {proxy}: {e}") # Delay between requests for natural behavior time.sleep(2)
この例では、プロキシ ローテーションを使用してターゲット サイトにリクエストを行い、ブロックされるリスクを軽減する方法を示します。
3 番目の方法では、Selenium のようなヘッドレス ブラウザを使用して、実際のユーザーのアクションをシミュレートします。このアプローチは手間がかかるかもしれませんが、より効果的です。
プロキシ ローテーションで Selenium を使用したコード例を次に示します。
import requests import time API_KEY = 'YOUR_2CAPTCHA_KEY' SITE_KEY = 'YOUR_SITE_KEY' PAGE_URL = 'https://example.com' def get_captcha_solution(): captcha_id_response = requests.post("http://2captcha.com/in.php", data={ 'key': API_KEY, 'method': 'userrecaptcha', 'googlekey': SITE_KEY, 'pageurl': PAGE_URL, 'json': 1 }).json() if captcha_id_response['status'] != 1: print(f"Error: {captcha_id_response['request']}") return None captcha_id = captcha_id_response['request'] print(f"CAPTCHA sent. ID: {captcha_id}") for attempt in range(30): time.sleep(5) result = requests.get("http://2captcha.com/res.php", params={ 'key': API_KEY, 'action': 'get', 'id': captcha_id, 'json': 1 }).json() if result['status'] == 1: print(f"CAPTCHA solved: {result['request']}") return result['request'] elif result['request'] == 'CAPCHA_NOT_READY': print(f"Waiting for solution... attempt {attempt + 1}/30") else: print(f"Error: {result['request']}") return None return None captcha_solution = get_captcha_solution() if captcha_solution: print('CAPTCHA solution:', captcha_solution) else: print('Solution failed.')
この例は、Selenium を使用して、サイト上の要素をスクロールして操作することで実際のユーザーをシミュレートする方法を示しています。
結論として、時間があり、コードをじっくり読みたい場合は、プロキシ ローテーションやヘッドレス ブラウザなどの方法を組み合わせると、優れた結果が得られる可能性があります。物事を単純化したい場合は、そのタスク用の既製のツールを提供するサービスを使用してください。ただし、特定のタスクごとに最適なツールを慎重に選択することが重要です。
キャプチャなしでアクセスできることを願っています!
以上がSEO スペシャリスト向けの高度な CAPTCHA バイパス テクニックとコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。