ブロックされないウェブスクレイピング

ブロックされずにウェブサイトをスクレイピングする方法に関するチュートリアル。ウェブサイトのスクレイピングブロックを克服するための9つのソリューションを紹介します。
2 min read
Web scraping without getting blocked

ウェブスクレイピングという行為は、APIでは提供されない隠された情報を求めてウェブを探索する宝探しのように感じられることがよくあります。そして、どんな宝探しにも、克服すべき課題があります。

注目すべき障害の1つは、ターゲットウェブサイトが課すアクセスブロックに遭遇することです。これらのブロックは、厳しいスクレイピングポリシー、リソースの乱用に関する懸念、ソースIPレピュテーションの問題、(偽の)ユーザエージェントの検出など、さまざまな理由で発生する可能性があります。

でも、心配はいりません。このチュートリアルでは、ターゲットウェブサイトにブロックされることなくウェブスクレイピングを行う方法をお伝えするので、インターネット上で簡単に宝物を見つけることができます。

アクセスブロック回避に役立つ戦略  

ウェブスクレイピングは複雑な作業であるため、アクセスブロックを回避するには、多くの場合、複数の手法を活用する必要があります。以下に、こうした厄介なブロックの回避に活用できる戦略を9つ紹介します。

1.ターゲットのポリシーとサービス条件を理解する  

新しいサイトをスクレイピングし始めるときには、単にページのHTML構造を学ぶだけでなく、それに精通する必要があります。精通することには、スクレイピングしようとしているサイトのポリシーとサービス条件を理解することも含まれます。これには、ウェブスクレイピングに対するサイトの姿勢、スクレイピングが許可されているか、どのページのスクレイピングが許可されているかなどがよく含まれます。これらの条件を尊重しないと、ブロックされ、法的リスクにさらされる可能性があります。

注意すべき重要なドキュメントの1つは、robots.txtファイルです。このファイルはウェブサイトのルートディレクトリにあり、ウェブサイトのどの部分をスキャンまたは処理できないかについて、ウェブロボットに指示を与えます。

以下に、robots.txtファイルの例を示します。

User-agent: *
Disallow: /private/
Disallow: /temp/

ここで、robots.txtファイルは、すべてのウェブロボット(User-agentの後に*で示される)に対して、ウェブサイトのprivateプライベートディレクトリとtempディレクトリをスクレイピングしないように指示します。

礼儀正しくウェブスクレイピングを行うには、個別のウェブサイトのガイドラインに従う必要があります。

2.倫理的スクレイピング基準を遵守する  

ウェブサイトのポリシーに従うのと同様に、行動規範に従うことも最善です。倫理的スクレイピング基準は、ブロックを回避するだけでなく、ターゲットウェブサイトの権利とリソースを尊重するのにも役立ちます。

以下のガイドラインに従うことが重要です。

  • 絶え間ないリクエストをサーバーに浴びせない:リクエストとリクエストの間に十分な時間間隔を設けます。一部のウェブサイトでは、大量のデータを迅速に抽出するウェブスクレイパーを検出してブロックする場合があります。それが人間の行為とは思えないためです。より自然に見え、ブロックされる可能性を減らすために、リクエストに時間遅延を追加することをお勧めします。ただし、時間遅延を固定せず、間隔を不規則にして、人間の動作をより厳密に模倣する方がよいでしょう。  
  • 同意なしに個人データをスクレイピングしない:これは単なる倫理的な問題ではなく、多くの場合、法的な問題です。個人データをスクレイピングする前に、必要な権限があることを常に確認してください。  
  • 取得したデータを尊重する:スクレイピングしたデータは、責任を持って合法的に使用します。データの使用が、著作権法や一般データ保護規則(GDPR)など、適用されるすべての法律と規則に則っていることを確認してください。  

次に、Pythonで不規則なリクエスト間隔を実装する方法を示します。

import time
import random

urls = ['https://www.targetwebsite.com/page1', 'https://www.targetwebsite.com/page2', 'https://www.targetwebsite.com/page3']

for url in urls:
    response = requests.get(url)
    # Process response
    sleep_time = random.uniform(1, 10)  # Generate a random sleep time between 1 and 10 seconds
    time.sleep(sleep_time)  # Sleep for a random time between requests

このコードは、urls配列内のURLのリストを循環します。URLごとに、それを取得するリクエストを行い、次のリクエストに進む前にtime.sleep()関数を使用して一時停止します。これらのランダムな間隔は人間のブラウジング動作を模倣するのに役立ち、検出の可能性を減らします。

3.(ローテーション)プロキシを使用する

 

ウェブスクレイピングツールキットの便利なツールはプロキシ、特にローテーションプロキシです。プロキシは、ユーザーとスクレイピング対象のウェブサイトとの間のゲートウェイとして機能します。それはユーザーのIPアドレスをマスクし、リクエストが異なる場所から来ているように見せます。  

ローテーションプロキシは、これをさらに一歩進めたものです。単一のプロキシIPを使用する代わりに、IPアドレスのプールを提供します。リクエストはこれらのIP間をローテーションし、デジタルの外観は絶えず変化します。このため、ウェブサイトがリクエストのパターンを識別するのがはるかに難しくなり、スクレイパーが検出されてブロックされる可能性が大幅に減少します。

さらに、ローテーションプロキシにより複数のIPにリクエストを分散させることができ、1つのIPアドレスがあまりにも多くのリクエストを送信するために禁止されるリスクを減らせます。

以下に、Pythonでローテーションプロキシの実装に使用できるコードスニペットを示します。

import requests
from itertools import cycle

# List of proxies
proxy_list = ['ip1:port1', 'ip2:port2', ...] 
proxy_pool = cycle(proxy_list) # create a cycle of proxies

url = 'https://www.targetwebsite.com'

for i in range(1,3):
    # Get a proxy from the pool
    proxy = next(proxy_pool)
    print(f"Request #{i}:")
    try:
        response = requests.get(url, proxies={"http": proxy, "https": proxy})
        print(response.content)
    except:
        # Most free proxies will often get connection errors, so we catch them here
        print("Connection error with proxy:", proxy)

このコードスニペットは、実行される各リクエストが異なるIPアドレスを持つように、循環するプロキシのリスト(すなわちproxy_list)を使用します。これにより、サイトがウェブスクレイピング操作を検出するのが難しくなります。

ローテーションプロキシは強力なツールですが、より大きな戦略の一部であるべきです。ブロックされることなくウェブスクレイピングの荒波を進むには、この記事で説明した他のテクニックと組み合わせる必要があります。

4.適切なヘッダーとユーザーエージェントを使う

 

ウェブサイトは、しばしばヘッダーとユーザーエージェントを使用してボットを検出しますUser-Agentは、ブラウザがサーバーに送信するヘッダーで、リクエストを開始するソフトウェアとシステムに関する詳細を提供します。通常、これにはアプリケーションの種類、オペレーティングシステム、ソフトウェアベンダー、およびソフトウェアバージョンが含まれます。この情報は、サーバーが特定のブラウザおよびシステムに適したコンテンツを配信するのに役立ちます。

ウェブスクレイピングでは、正規のユーザーエージェント文字列を使用することが重要です。実際のユーザーを模倣することで、検出メカニズムを効果的に回避し、ブロックされる可能性を減らせます。

User-Agentに加え、考慮すべきもう1つの重要なヘッダーはRefererヘッダーです。Refererヘッダーは、リクエストされているリソースにリンクされているウェブページのURLを示します。これをスクレイパーのリクエストに含めると、人間のユーザーがあるページから別のページへと閲覧しているように見えます。

スクレイパーに含めることのできる、その他の便利なヘッダーとしては、Accept-LanguageAccept-EncodingConnectionなどがあります。通常、これらのヘッダーはウェブブラウザが送信するもので、スクレイパーに含まれることはほとんどありません。これらのヘッダーはウェブコンテンツの取得に直接影響を与えないため、通常スクレイパーでこれらに注意が向けられることはありません。ただし、これらを含めることで、スクレイパーのリクエストがより本物らしく見えるようになり、検出される可能性が低くなります。

以下に、リクエストヘッダー内にUser-AgentRefererを設定して、本物のブラウジングセッションを模倣するPythonスニペットを示します。

url = 'https://www.targetwebsite.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36',
    'Referer': 'https://www.google.com/'
}

response = requests.get(url, headers=headers)

5.ハニーポットのトラップとエラーを処理する

 

ハニーポットなどの障害物のせいで、ウェブサイト内をナビゲートすることが困難な場合があります。ハニーポットは、通常のユーザーには気づかれないように意図的に設計された隠しリンクですが、スクレイパーやボットが検出することがあります。これらのリンクは、hiddenまたはnoneに設定されたHTML要素を使って隠されたり、ページの背景に合わせた色のボタンとして偽装されたりすることがよくあります。ハニーポットを組み込む主な目的は、ボットを識別してブラックリストに載せることです。

以下に、Pythonでハニーポットを回避するために使用できる簡単なコードスニペットを示します。

from bs4 import BeautifulSoup
import requests

url = 'https://www.targetwebsite.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')

for link in soup.select('a'):
    if 'display' in link.get('style', '') and 'none' in link['style']:
        continue  # Skip this link
    # Process link

このコードは、ハニーポットリンクの一般的な特徴であるstyle属性のdisplay: noneを持つリンクをスキップします。

データをスクレイピングする際、注意すべきもう1つの重要な点はエラーです。エラー応答に遭遇するのは珍しいことではありません。これらのエラーは、多くの場合、4xxの範囲(クライアントエラー)または5xxの範囲(サーバエラー)のHTTPステータスコードで示されます。これらのエラーを適切に処理することは、過剰なリクエストでサーバーに過度の負荷をかけ、ブロックされてしまうことを避ける上で重要です。

この種のエラーを管理するための効果的な戦略の1つは、指数バックオフアルゴリズムを実装することです。このアプローチでは、後続の再試行間の時間間隔を徐々に増やして、エラーをより効率的に処理できるようにします。

6.CAPTCHA解決サービスを利用する

 

CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart)は、ウェブスクレイピングなどの自動ボットアクティビティを防ぐために、多くのウェブサイトで実装されているセキュリティ対策です。人間には簡単に解決できても、機械には解決が困難になるように設計されているため、この名前が付いています。

CAPTCHAに遭遇した場合は、Bright DataのWeb Unlockerの使用を検討してください。このサービスは、機械学習アルゴリズムやヒューマンソルバーなどのさまざまな方法を使用し、ユーザーに代わってCAPTCHAの課題を解読します。その役割は、CAPTCHA解決プロセスを自動化し、スクレイパーが妨害されることなくデータ抽出プロセスを継続できるようにすることです。  

7.レート制限とアクセス拒否を監視する

 

ほとんどのウェブサイトは、自動化されたボットによるリソースの悪用を防ぐために、レート制限とアクセス拒否を実施しています。サーバーに送信されるすべてのリクエストはリソースを消費するため、毎秒リクエストを送信する何千ものボットによって簡単にサーバーがダウンしたり、ウェブサイトのパフォーマンスが低下したりする可能性があります。これを防ぐために、ウェブサイトはレート制限を実施しており、レート制限の詳細を示すX-RateLimit-Limitヘッダーを応答に含めているウェブサイトさえあります。ブロックを回避するには、これらの制限を遵守する必要があります。

通常、サーバーはHTTPステータスコードを通じてこれらの制限を伝達します。ステータスコード200はすべてがスムーズに進んだことを意味しますが、コード429は指定された時間内に送信したリクエストが多すぎることを意味します。同様に、403はアクセスが禁止されていることを意味し、503はおそらく過負荷のためにサーバが使用できないことを示します。これらのコードについて知ることは、データ抽出をうまく行う上で不可欠です。

以下に、Requestsライブラリを使用してレート制限を遵守するPythonスニペットを示します。

import time
import requests

def respectful_requester(url, delay_interval=1):
    response = requests.get(url)
    # If the status code indicates rate limiting, sleep then retry
    if response.status_code == 429:
        print('Rate limit reached. Sleeping...')
        time.sleep(delay_interval)
        return respectful_requester(url, delay_interval)
    elif response.status_code != 200:
        print(f'Error: {response.status_code}. Try a different proxy or user-agent')
    
    return response

この関数は、GETリクエストをURLに送信し、応答をチェックします。ステータスコード429が検出されると、指定された遅延間隔だけ一時停止してから、リクエストを再試行します。必要に応じ、他のステータスコードに対してより高度な処理を追加することもできます。

8.Googleのキャッシュからスクレイピングする

 

スクレイピングが困難なウェブサイトや時間的制約のないデータの場合、ウェブサイト自体ではなく、Googleがキャッシュしたウェブサイトのコピーからデータをスクレイピングするという代替アプローチもあります。この手法は、ウェブスクレイパーを積極的にブロックする非常に困難なウェブサイトを扱う場合に特に役立ちます。これらのキャッシュされたページを、元のウェブページの代わりにスクレイピングすることで、スクレイピング防止メカニズムのトリガーを回避できます。一部のウェブサイトはGoogleにコンテンツをキャッシュしないように指示しているため、この方法は確実ではないかもしれないことに留意してください。加えて、Googleのキャッシュからのデータは最新ではない可能性があります。

Googleのキャッシュからウェブサイトをスクレイピングするには、そのサイトのURLをhttp://webcache.googleusercontent.com/search?q=cache:の末尾に追加するだけです。たとえば、Bright Dataのウェブサイトをスクレイピングする場合、http://webcache.googleusercontent.com/search?q=cache:https://https://brightdata.com/のURLを使用できます。

Googleのキャッシュからスクレイピングする方が、リクエストを積極的にブロックしているサイトをスクレイピングするよりも信頼性が高くなりますが、制限を考慮し、キャッシュされたデータの関連性を検証することを忘れないでください。

9.サードパーティプロキシとスクレイピングサービスを使用する

 

ウェブスクレイパーとウェブサイト管理者のいたちごっこが激化するにつれて、効果的かつステルスなウェブスクレイパーの設定を維持する複雑さが増しています。ウェブサイトは、ウェブスクレイパーを検出したり、速度を落としたり、ブロックしたりする新しい方法を常に考案しており、これらの防御を克服するには動的なアプローチが必要です。

場合によっては、難しい部分は専門家に任せるのが最善の方法です。この分野では、Bright Dataなどのサードパーティプロキシやスクレイピングサービスが優れています。Bright Dataは常にアンチスクレイピング技術の最先端にあり、戦略を迅速に適応させて新たな障害を克服しています。  

Bright Dataは、ローテーションするレジデンシャルプロキシ自動CAPTCHA解決など、人間の行動を説得力ある仕方で模倣するのに役立つソリューションを提供し、スクレイピング作業を目立たずに実行できるようにします。そのサービスは拡張性にも優れているため、ウェブスクレイピングプロジェクトの増大するニーズに簡単に対応できます。  

これらのソリューションを利用することで、時間とリソースを節約し、得られたデータの分析やインサイトの導出など、プロジェクトの他の部分に集中できるようになります。

まとめ  

これで、ウェブスクレイピングの障害物が立ち並ぶ危険な地形を切り抜けることができました。ターゲットのポリシーを理解し、倫理的スクレイピング基準に従って、プロキシ、適切なヘッダー、ユーザーエージェントのローテーションなどの戦術を採用し、ハニーポットトラップとエラーを処理することで、ブロックを回避しつつウェブスクレイピングプロジェクトをセットアップするための十分な準備ができました。

ただし、最も熟練した探検家であっても、信頼できるツールキットが必要であることを忘れないでください。そこでBright Dataの出番です。同社の包括的なソリューションは、ウェブスクレイピング作業を効率化するよう調整された幅広いサービスを提供します。CAPTCHAの背後に隠されたデータにアクセスするために、同社のWeb Unlockerをご活用ください。また、堅牢なプロキシサーバーデータセンタープロキシレジデンシャルプロキシなど、さまざまなプロキシサービスから選択して、匿名性を維持することもできます。  

ハッピースクレイピング!