AutoScraperは、手動でのHTML検査なしにウェブサイトからデータを自動的に識別・抽出することで、ウェブスクレイピングを簡素化するPythonライブラリです。従来のスクラッピングツールとは異なり、AutoScraperはサンプルクエリに基づいてデータ要素の構造を学習するため、初心者から経験豊富な開発者まで幅広く活用できます。製品情報の収集、コンテンツの集約、市場調査などのタスクに最適で、複雑な設定なしに動的ウェブサイトを効率的に処理します。
この記事では、PythonとAutoScraperを用いたウェブスクレイピングの実践方法を解説します。
前提条件
AutoScraperの設定は簡単です。もちろん、ローカルにPython 3以降がインストールされている必要があります。他のPythonウェブスクレイピングプロジェクトと同様に、プロジェクトディレクトリを作成し、その中に仮想環境を作成してアクティブ化するだけで済みます:
# プロジェクトディレクトリの設定
mkdir auto-scrape
cd auto-scrape
# 仮想環境の作成
python -m venv env
# Mac & Linuxユーザー向け
source env/bin/activate
# Windowsユーザー向け
venvScriptsactivate
仮想環境を使用することで、プロジェクト内の依存関係管理が簡素化されます。
次に、以下のコマンドを実行してautoscraperライブラリをインストールします:
pip install autoscraper
最後にスクレイピング結果をCSVファイルに保存するため、pandasもインストールする必要があります。pandasは使いやすいデータ分析・操作ツールを提供するPythonライブラリです。CSV、XLSX、JSONなど様々な形式でスクレイピング結果を簡単に処理・保存できます。以下のコマンドでインストールしてください:
pip install pandas
対象ウェブサイトを選択する
公開ウェブサイトをスクレイピングする際は、必ずサイトの利用規約(ToS)またはrobots.txtファイルを確認し、スクレイピングが許可されていることを確認してください。これにより法的・倫理的問題を回避できます。また、テーブルやリストなど構造化された形式でデータを提供するウェブサイトを選択すると、抽出が容易になります。
従来のスクレイピングツールでは、対象データ要素を特定するためにウェブページのHTML構造を分析する必要がありました。これは時間がかかり、ブラウザの開発者コンソールなどのツールに精通していることが求められます。しかしAutoScraperは、サンプルデータ(wanted_listとも呼ばれる)に基づいてデータ構造を自動的に学習するため、この手順を簡略化し、手動での確認を不要にします。
このチュートリアルでは、まず「Scrape This Site」の「世界の国々:簡単な例」ページからデータをスクレイピングします。これはスクレイピングツールのテスト用に設計された初心者向けのサンドボックスです。このページはシンプルな構造で、基本的なスクレイピング手法の習得に最適です。基本構造をマスターしたら、より複雑なレイアウトを持つ「ホッケーチーム:フォーム、検索、ページネーション」ページに進みます。
AutoScraperでシンプルなデータをスクレイピング
スクレイピング対象となる2つのページを特定したところで、いよいよスクレイピングを開始しましょう!
「世界の国々:簡単な例」ページは単純なため、以下のスクリプトで国名リストと首都・人口・面積をスクレイピングできます:
# 1. 依存関係をインポート
from autoscraper import AutoScraper
import pandas as pd
# 2. スクレイピング対象サイトのURLを定義
url = "https://www.scrapethissite.com/pages/simple/"
# 3. AutoScraperをインスタンス化
scraper = AutoScraper()
# 4. ウェブページ上の例を用いて取得対象リストを定義
# このリストにはスクレイピングしたいテキストや値を含める
wanted_list = ["Andorra", "Andorra la Vella", "84000", "468.0"]
# 5. 取得リストとURLに基づいてスクレイパーを構築
scraper.build(url, wanted_list)
# 6. 一致した全要素の結果を取得
results = scraper.get_result_similar(url, grouped=True)
# 7. 構造を理解するためのキーとサンプルデータを表示
print("スクレイパーが検出したキー:", results.keys())
# 8. スクレイパーのキーと想定されるデータ順序に基づいて列を割り当てる
columns = ["国名", "首都", "面積 (平方キロメートル)", "人口"]
# 9. 抽出されたデータでDataFrameを作成する
data = {columns[i]: results[list(results.keys())[i]] for i in range(len(columns))}
df = pd.DataFrame(data)
# 10. DataFrameをCSVファイルに保存
csv_filename = 'countries_data.csv'
df.to_csv(csv_filename, index=False)
print(f"データは{csv_filename}に正常に保存されました")
このコードには処理内容を説明するインラインコメントが付いていますが、簡単にまとめると以下の通りです:スクリプトはAutoScraperとpandasのインポートから始まります。次に、対象ウェブサイトのURLを定義します。その後、スクレイパーのインスタンスを作成します。
ここで重要な点:他のスクレイパーのように(おそらくXPathやその他のセレクタを用いて)ターゲットデータがウェブサイトのどこにあるかを詳細に指示する代わりに、単に探しているデータの例を提供します。4番目のコメントの下で、ある国のデータポイントが配列(wanted_listとも呼ばれる)としてスクレイパーに提供されています。
wanted_listが準備できたら、URLとwanted_listを用いてスクレイパーを構築します。スクレイパーは対象ウェブサイトをダウンロードし、スタックリストに保存するルールを生成します。これらのルールを用いて、将来的に任意の対象URLからデータを抽出します。
6番目のコメント下のコードでは、AutoScraperモデル上のget_result_similarメソッドを使用し、ターゲットURLからwanted_listのデータと類似したデータを抽出します。次の行は、ターゲットURL上でデータが見つかったルールのIDを表示する単純なprint文です。出力は次のようになります:
Keys found by theスクレイパー: dict_keys(['rule_4y6n', 'rule_gghn', 'rule_a6r9', 'rule_os29'])
コメント8と9のコードはCSVファイルのヘッダースキーマを作成し、抽出データをpandas DataFrameでフォーマットします。最後に、コメント10のコードがデータをCSVに保存します。
このスクリプトを実行すると(前のスクリプトをscript.pyというファイルに保存し、コマンドラインでpython script.pyを実行)、プロジェクトディレクトリにcountries_data.csvという新しいファイルが作成され、内容は次のようになります:
国名,首都,面積 (平方キロメートル),人口
Andorra,Andorra la Vella,84000,468.0
United Arab Emirates,Abu Dhabi,4975593,82880.0
...246行が折りたたまれています
Zambia,Lusaka,13460305,752614.0
ジンバブエ,ハラレ,11651858,390580.0
以上です!AutoScraperを使えば、シンプルなウェブサイトのスクレイピングがこんなに簡単です。
複雑なデザインのウェブサイトからデータを処理・抽出する
ホッケーチーム:フォーム、検索、ページネーションページのように、類似値が多いテーブルを含むやや複雑なウェブサイトの場合、前述の手法が失敗する可能性があります。このウェブサイトからチーム名、年、勝利数、敗北数などのフィールドを、前述と同じ方法で抽出してみて、問題を確認してみてください。
幸い、AutoScraperではモデルをデータ抽出に使用する前に、ビルド段階で収集したルールを剪定することで、より細かいモデルトレーニングが可能です。そのためのコードは以下の通りです:
from autoscraper import AutoScraper
import pandas as pd
# スクレイピング対象サイトのURLを定義
url = "https://www.scrapethissite.com/pages/forms/"
def setup_model():
# AutoScraperをインスタンス化
scraper = AutoScraper()
# ウェブページ上の例を用いて取得対象リストを定義
# このリストにはスクレイピングしたいテキストや値を含める
wanted_list = ["Boston Bruins", "1990", "44", "24", "0.55", "299", "264", "35"]
# 取得対象リストとURLに基づきスクレイパーを構築
scraper.build(url, wanted_list)
# 一致した全要素の結果を取得
results = scraper.get_result_similar(url, grouped=True)
# 構造理解のためデータを表示
print(results)
# モデルを保存
scraper.save("teams_model.json")
def prune_rules():
# Autoscraperのインスタンスを作成
scraper = AutoScraper()
# 先に保存したモデルを読み込み
scraper.load("teams_model.json")
# 必要なルールのみを保持するようにモデルを更新
スクレイパー.keep_rules(['rule_hjk5', 'rule_9sty', 'rule_2hml', 'rule_3qvv', 'rule_e8x1', 'rule_mhl4', 'rule_h090', 'rule_xg34'])
# 更新したモデルを再度保存
scraper.save("teams_model.json")
def load_and_run_model():
# スクレイパーのインスタンスを作成
scraper = AutoScraper()
# 事前に保存したモデルを読み込み
scraper.load("teams_model.json")
# 一致した全要素の結果を取得
results = scraper.get_result_similar(url, grouped=True)
# スクレイパーのキーと想定されるデータ順序に基づいて列を割り当てる
columns = ["チーム名", "年", "勝利", "敗戦", "勝率", "得点 (GF)", "失点 (GA)", "得失点差 (+/-)"]
# 抽出データをDataFrameに作成
data = {columns[i]: results[list(results.keys())[i]] for i in range(len(columns))}
df = pd.DataFrame(data)
# DataFrameをCSVファイルに保存
csv_filename = 'teams_data.csv'
df.to_csv(csv_filename, index=False)
print(f"データは{csv_filename}に正常に保存されました")
# setup_model()
# prune_rules()
# load_and_run_model()
このスクリプトには3つのメソッドが定義されています:setup_model、prune_rules、load_and_run_model。setup_modelメソッドは、以前見たものと同様です。スクレイパーのインスタンスを作成し、wanted_listを作成し、wanted_listを使用してスクレイパーを構築し、このスクレイパーを使用してターゲットURLからデータをスクレイピングし、キー(つまり、この抽出中に収集されたルールID)を出力し、モデルをそのままプロジェクトディレクトリ内のteams_model.jsonというファイルに保存します。
これを実行するには、前のスクリプト内の# setup_model() 行のコメントを外し、完全なスクリプトをファイル(例:script.py)に保存し、`pythonscript.py` を実行します。出力は次のようになります:
{'rule_hjk5': ['Boston Bruins', 'Buffalo Sabres', 'Calgary Flames', 'Chicago Blackhawks', 'Detroit Red Wings', 'Edmonton Oilers', 'Hartford Whalers', 'Los Angeles Kings', 'Minnesota North Stars', 'Montreal Canadiens', 'New Jersey Devils', 'ニューヨーク・アイランダース', 'ニューヨーク・レンジャーズ', 'フィラデルフィア・フライヤーズ', 'ピッツバーグ・ペンギンズ', 'ケベック・ノルディクス', 'セントルイス・ブルース', 'トロント・メープルリーフス', 'バンクーバー・カナックス', 'ワシントン・キャピタルズ', 'ウィニペグ・ジェッツ', 'ボストン・ブルーインズ', 'バッファロー・セイバーズ', 'カルガリー・フレームス', 'シカゴ・ブラックホークス'], 'rule_uuj6': ['ボストン・ブルーインズ', 'バッファロー・セイバーズ', 'カルガリー・フレームス', 'シカゴ・ブラックホークス', 'デトロイト・レッドウィングス', 'エドモントン・オイラーズ', 'ハートフォード・ホエールズ', 'ロサンゼルス・キングス', 'ミネソタ・ノーススターズ', 'モントリオール・カナディアンズ', 'ニュージャージー・デビルズ', 'ニューヨーク・アイランダース', 'ニューヨーク・レンジャーズ', 'フィラデルフィア・フライヤーズ', 'ピッツバーグ・ペンギンズ', 'ケベック・ノルディクス', 'セントルイス・ブルース', 'トロント・メープルリーフス', 'バンクーバー・カナックス', 'ワシントン・キャピタルズ', 'ウィニペグ・ジェッツ', 'ボストン・ブルーインズ', 'バッファロー・セイバーズ', 'カルガリー・フレームス', 'シカゴ・ブラックホークス'], 'rule_9sty': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_9nie': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_41rr': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_ufil': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_ere2': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_w0vo': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_rba5': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_rmae': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_ccvi': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_3c34': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_4j80': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_oc36': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_93k1': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_d31n': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_ghh5': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_5rne': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_4p78': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_qr7s': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_60nk': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_wcj7': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_0x7y': ['1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1990', '1991', '1991', '1991', '1991'], 'rule_2hml': ['44', '31', '46', '49', '34', '37', '31', '46', '27', '39', '32', '25', '36', '33', '41', '16', '47', '23', '28', '37', '26', '36', '31', '31', '36'], 'rule_swtb': ['24'], 'rule_e8x1': ['0.55', '14', '0.575', '0.613', '-25', '0', '-38', '0.575', '-10', '24', '8', '-67', '32', '-15', '0.512', '-118', '0.588', '-77', '-72', '0', '-28', '-5', '-10', '-9', '21'], 'rule_3qvv': ['24', '30', '26', '23', '38', '37', '38', '24', '39', '30', '33', '45', '31', '37', '33', '50', '22', '46', '43', '36', '43', '32', '37', '37', '29'], 'rule_n07w': ['24', '30', '26', '23', '38', '37', '38', '24', '39', '30', '33', '45', '31', '37', '33', '50', '22', '46', '43', '36', '43', '32', '37', '37', '29'], 'rule_qmem': ['0.55', '0.388', '0.575', '0.613', '0.425', '0.463', '0.388', '0.575', '0.338', '0.487', '0.4', '0.312', '0.45', '0.412', '0.512', '0.2', '0.588', '0.287', '0.35', '0.463', '0.325', '0.45', '0.388', '0.388', '0.45'], 'rule_b9gx': ['264', '278', '263', '211', '298', '272', '276', '254', '266', '249', '264', '290', '265', '267', '305', '354', '250', '318', '315', '258', '288', '275', '299', '305', '236'], 'rule_mhl4': ['299', '292', '344', '284', '273', '272', '238', '340', '256', '273', '272', '223', '297', '252', '342', '236', '310', '241', '243', '258', '260', '270', '289', '296', '257'], 'rule_24nt': ['264', '278', '263', '211', '298', '272', '276', '254', '266', '249', '264', '290', '265', '267', '305', '354', '250', '318', '315', '258', '288', '275', '299', '305', '236'], 'rule_h090': ['264', '278', '263', '211', '298', '272', '276', '254', '266', '249', '264', '290', '265', '267', '305', '354', '250', '318', '315', '258', '288', '275', '299', '305', '236'], 'rule_xg34': ['35', '14', '81', '73', '-25', '0', '-38', '86', '-10', '24', '8', '-67', '32', '-15', '37', '-118', '60', '-77', '-72', '0', '-28', '-5', '-10', '-9', '21']}
これは、AutoScraperが対象ウェブサイトからget_result_similar呼び出しで収集した完全なデータを示しています。 このデータには重複が多く含まれていることに気付くでしょう。これはAutoScraperが対象ウェブサイトからデータを収集するだけでなく、データ間の関係を推測して「ルール」と呼ばれるデータポイントのグループを作成し、相互に関連すると判断するためです。データを正しくグループ化できれば、前の例のように類似サイトから簡単にデータを抽出できます。
しかし、AutoScraperはこのウェブサイトでは苦戦しているようです。数値データが大量に含まれるため、AutoScraperは様々な数値間の相関関係を過剰に推測してしまい、結果として重複データポイントを含む大規模なルールデータセットが生成されてしまいます。
ここで、このデータセットを注意深く分析し、スクレイピング作業に必要な正しいデータ(つまり、対象ページの列から正しい順序で取得されたデータのみを含むルール)を含むルールを選別する必要があります。
この出力において、以下のルールが正しいデータを含んでいた(手動でいくつかのデータポイントを確認し、選択した各ルールが25個のデータ要素(対象ページのテーブルの行数)を受け取っていることを確認して見つけた):
['rule_hjk5', 'rule_9sty', 'rule_2hml', 'rule_3qvv', 'rule_e8x1', 'rule_mhl4', 'rule_h090', 'rule_xg34']
prune_rulesメソッドでこれを更新する必要があります。その後、スクリプト内のsetup_model()行をコメントアウトし、prune_rules()行のコメントを外して実行してください。今回は、teams_model.jsonファイルから以前に作成したモデルを読み込み、リストされたルール以外のすべてを削除し、同じファイルに保存します。teams_model.jsonの内容を確認すれば、現在どのルールが保存されているかも確認できます。これを完了すれば、モデルの準備は整います。
次に、同じスクリプト内でprune_rules とprune_rules 行をコメントアウトし、load_and_run_model 行のコメントを外して再実行することで、load_and_run_model メソッドを実行できます。これにより、プロジェクトディレクトリ内のteams_data.csv というファイルに適切なデータが抽出・保存されると同時に、以下の出力が表示されます:
Data has been successfully saved to teams_data.csv
正常に実行された後のteams_data.csv ファイルの内容は以下の通りです:
チーム名,年,勝利数,敗戦数,勝率 %,得点 (GF),失点 (GA),得失点差
Boston Bruins,1990,44,0.55,24,299,264,35
バッファロー・セイバーズ,1990,31,14,30,292,278,14
...さらに21行
カルガリー・フレームス,1991,31,-9,37,296,305,-9
シカゴ・ブラックホークス,1991,36,21,29,257,236,21
この記事で開発したコードは、こちらのGitHubリポジトリで確認できます。
AutoScraperの一般的な課題
AutoScraperは、対象ウェブサイトが比較的小規模なデータセットと明確なデータポイントを含む単純なユースケースでは非常に有効ですが、先程ご覧になったようなテーブルを含むウェブサイトなど、複雑なケースでは設定が煩雑になる場合があります。さらに、AutoScraperはJavaScriptレンダリングをサポートしていないため、Splashのようなモジュールや、Seleniumや Puppeteerのような本格的なライブラリとの統合が必要となります。
IPブロックなどの問題が発生した場合や、スクレイピング時にヘッダーをカスタマイズする必要がある場合、AutoScraperではリクエストモジュールで使用する追加リクエストパラメータを次のように指定できます:
# 初期URLでスクレイパーを構築
scraper.build(
url,
wanted_list=wanted_list,
request_args=dict(proxies=proxies) # プロキシリストやカスタムヘッダーをここで渡せます
)
例えば、AutoScraperでスクレイピングを行う際にカスタムユーザーエージェントとプロキシを設定する方法は以下の通りです:
request_args = {
"headers: {
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36" # この値は任意のユーザーエージェントにカスタマイズ可能です。AutoScraperのデフォルト値です。
},
"proxies": {
"http": "http://user:[email protected]:3128/" # プロキシポート、ホスト、ユーザー名、パスワードの値の使用方法を示す例
}
}
# 初期URLでスクレイパーを構築
scraper.build(
url,
wanted_list=wanted_list,
request_args=request_args
)
ただし、繰り返しブロックされるのを避けたい場合は、ウェブスクレイピング用に最適化された優れたレジデンシャルプロキシが必要です。このため、195カ国に分散した1億5000万のレジデンシャルIPを保有するBright Dataのレジデンシャルプロキシの利用を検討すべきです。
AutoScraperライブラリは内部でPythonのrequestライブラリを使用してターゲットサイトへリクエストを送信するため、レート制限を本質的にサポートしていません。サイトのレート制限に対処するには、手動でスロットリング機能を設定するか、ratelimitライブラリのような既成ソリューションを使用する必要があります。
AutoScraperは非動的ウェブサイトのみに対応するため、CAPTCHAで保護されたサイトは一切処理できません。そのような場合、LinkedIn、Amazon、Zillowなどのサイトから構造化データを提供するBright DataウェブスクレイピングAPIのような詳細なソリューションの利用が有効です。
結論
本記事では、AutoScraperの概要と、単純なサイトから複雑なサイトまでデータ抽出する方法を解説しました。 ご覧の通り、AutoScraperは最終的にシンプルなrequests呼び出しで対象サイトにアクセスするため、動的サイトやCAPTCHAなどの認証保護が施されたサイトではしばしば機能不全に陥ります。さらに、ウェブスクレイピング時にはプロキシの使用が必須です。大半のサイトは異常な高トラフィックを検知するためです。こうしたケースではBright Dataが有効です。
Bright Dataはプロキシネットワーク、AI搭載ウェブスクレイパー、ビジネス向けデータセットを提供する主要ベンダーです。今すぐ登録してBright Dataの製品群(無料トライアル含む)をぜひお試しください!