❗ : これは、高度な Web スクレイピングに関する 6 部構成のシリーズのパート 3 です。このシリーズは初めてですか? 。 免責事項 パート 1 から最初から読んでください 高度な Web スクレイピング シリーズのパート 2 では、 学びました。これで、ほとんどの最新の Web サイトで機能するスクレイパーを構築するために必要な知識がすべて身についたはずです。 SPA、PWA、AI を利用したサイトからデータをスクレイピングする方法を 次は何ですか? プロのスクレイピングのヒントとコツを使ってスクレイパーを最適化しましょう。 Web スクレイピングが簡単になる — 本当にそうでしょうか? Web スクレイパーを構築しますか? すべては 次第です。👨💻 スクリプト 正直に言うと、コードを書いたことがある人なら、スクリプトはほとんどの場合 難しくないことが分かるでしょう。ここに数行、そこに 書くだけで、プロのようにデータをスクレイピングできます。簡単そうですよね? 😄 それほど for しかし、ここに問題があります。小さなスクレーパーを書くのは簡単だからといって、安心しきれないかもしれません。誰でも読めるコードが 12 行しかないのに、適切なコメント、エラー処理、ログ、あるいはきちんとしたインデントなど気にする必要はないのです。 わかります。必要のないものを過剰に設計する理由は何でしょうか? 過剰設計は進歩の敵 。しかし、スクレーパーを複数のページ、さらにはサイト全体に拡張する必要がある場合はどうなるでしょうか? 🤔 です その時、あなたの手抜きのスパゲッティコードスクレーパーは壊れてしまいます!🍝 高度な Web スクレイピングのヒントが必要な理由は次のとおりです。 Web スクレイピングの最適化: トップ 7 のヒントとコツ 重要なデータを含むページを優先する、リクエストをランダム化するなど、一般的な Web スクレイピングのヒントはすでに聞いたことがあるはずです。素晴らしいアドバイスですが、正直に言うと、これらのトリックは古いものです。📰 より高度なシナリオを扱う場合、これらの基本だけでは不十分な場合があります。スクレイピングのレベルを本当に上げたい場合は、次のレベルのテクニックを探求する必要があります。 準備はいいですか?シートベルトを締めて、Web スクレイピング スキルを次のレベルに引き上げましょう。💪 ⚠️ いくつかのヒントが既知だと感じても心配しないでください。そのまま読み進めてください。さらに深く掘り下げていくと、興味深い洞察がたくさんあります。🤿 警告: エラー処理を実装する Web スクレイピングで最もよくある間違いの 1 つは、インターネットが魔法のような絶対確実なテクノロジーではないことを忘れてしまうことです。サイトにリクエストを送信すると、さまざまな問題が発生する可能性があります (そして、ある時点で問題が発生します)。❌ 一般的なシナリオをいくつか見てみましょう。 Wi-Fiまたは接続が一時的に途切れる場合があります ウェブサイトをホストしているサーバーが利用できない可能性があります 探しているページはもう存在しない可能性があります 対象サイトで一時的な速度低下が発生し、タイムアウトエラーが発生している可能性があります。 ここで、データの解析、前処理、データベースへのエクスポートを組み合わせると、完璧なカオスのレシピが完成します。💥 では、解決策は何でしょうか? ! 🛡️ エラー処理です エラー処理は、Web スクレイピングの最大の味方です。スクリプトは数十 (または数千) のページを処理する可能性があり、1 つのエラーで操作全体がクラッシュすることはあってはなりません。 ブロックはあなたの味方であることを覚えておいてください。これを使用して、リクエストと処理ロジックをラップします。また、ほとんどの HTTP ライブラリは、不正な HTTP 応答 ( や など) に対して例外を発生させないことにも注意してください。😲 try ... catch 404 500 について詳しくない場合は、以下のビデオをご覧ください。 HTTP ステータス コード https://www.youtube.com/watch?v=wJa5CTIFj7U&embedable=true たとえば、 では、次のように応答ステータス コードを手動で確認する必要があります。 Python のリクエスト ライブラリ import requests response = requests.get("https://example.com") if response.status_code == 200: # handle the successful response... else: # handle the error response... または、同等に、 メソッドを使用します。 raise_for_status() import requests try: response = requests.get("https://example.com") # raises an HTTPError for bad responses (4xx or 5xx) response.raise_for_status() # handle the successful response... except requests.exceptions.HTTPError as http_err: # handle an HTTP error... except requests.exceptions.RequestException as req_err: # handle a request error... リクエストの再試行による障害回復 高度な Web スクレイピング スクリプトは、エラーを処理できるだけでなく、エラーから回復できる必要があります。Web スクレイピングに関連するエラーのほとんどは Web リクエストの作成に関連しているため、 。 再試行可能なリクエストを実装することでスクレイパーの有効性を大幅に向上できます コンセプトはシンプルです。リクエストが失敗した場合は、成功するまで 1 回、2 回、3 回、またはそれ以上再試行します。🔄 しかし、ここに落とし穴があります。リクエストが失敗する最も一般的な理由の 1 つは、ターゲット サーバーが一時的にダウンしているか遅いことであるため、短期間に同じリクエストを繰り返し送信してサーバーに過負荷をかけないようにする必要があります。 今リクエストが失敗すると、すぐにまた失敗する可能性が高くなります。そこで 役立ちます。 指数バックオフが この手法では、即座に再試行するのではなく、再試行の間隔を徐々に長くして、ターゲット サーバーに回復する時間を与えることで成功の可能性を高めます。⏳ カスタム コードを使用して単純な再試行戦略を手動で実装することもできますが、多くの HTTP クライアントには再試行を自動的に処理するための組み込みユーティリティまたはライブラリが付属しています。たとえば、Axios は ライブラリを提供しており、次のように使用できます。 axios-retry const axios = require("axios"); const axiosRetry = require("axios-retry"); axiosRetry(axios, { retries: 3, retryDelay: axiosRetry.exponentialDelay }); axios.get('https://example.com') .then(response => console.log(response.data)) .catch(error => console.log("Request failed:", error)); 同様に、Python の パッケージには、 とシームレスに統合される クラスが付属しています。 urllib3 ほとんどの Python HTTP クライアント Retry 汎用セレクターを書く DevTools で要素を検査するときに、右クリックして「セレクターをコピー」オプションを選択したくなるかもしれません。 ただし、結果は次のようになる可能性があるので注意してください。 #__next > div > main > div.sc-d7dc08c8-0.fGqCtJ > div.sc-93e186d7-0.eROqxA > h1 それは確かにウェブスクレイピングには理想的ではありません…。 問題は、このような過度に具体的なセレクターは、ページ構造が変更されると簡単に壊れてしまうことです。セレクターが詳細になるほど、壊れやすくなります。 ウェブスクレイピングの耐性を高めるには、セレクターを柔軟に保つ必要があります。スタイル関連のクラス(常に変更される)に頼るのではなく、 、 、 。これらの属性のほとんどは と を目的としているため、時間の経過とともに一貫性が保たれる傾向があります。💡 id data- aria- など、変更される可能性が低い属性に焦点を当てます テスト アクセシビリティ 読みやすく理解しやすいですが、 の方が強力です。しかし心配しないでください。多くの場合、シンプルな CSS セレクターで同じ結果を達成できるため、複雑な XPath コードを必要とせずに済みます。😌 CSS セレクターは XPath 詳細については、 に関するガイドをご覧ください。 XPath と CSS セレクター 高速な HTML パーサーを優先する HTML ページの解析には、特に大規模でネストされた DOM を扱う場合には、時間とリソースがかかります。スクレイパーが数ページのみを解析する場合、それほど大きな問題にはなりません。 さて、スクレイピング操作が拡大し、何百万ページものデータを取得する必要がある場合はどうなるでしょうか? この小さなオーバーヘッドによって、サーバーのリソースがすぐに消耗し、スクレイピングの合計時間が数時間も長くなる可能性があります。⏳ より深く理解するには、次のリソースを参照してください。 Python HTML パーサーのパフォーマンス比較 HTML 解析用 JavaScript ライブラリのベンチマーク HTML パーサーのベンチマーク 完全な比較をお探しですか? に関する記事をお読みください。 最高の HTML パーサー 良いニュースは?あるパーサーから別のパーサーに切り替えるのはそれほど難しくないということです。たとえば、 では、単純なパラメータの変更だけです。 BeautifulSoup from bs4 import BeautifulSoup # or using html.parser soup = BeautifulSoup(html_content, "html.parser") # or using lxml parser soup = BeautifulSoup(html_content, "lxml") Chrome などのブラウザに組み込まれている HTML パーサーはどうでしょうか?🤔 詳細については、以下のビデオをご覧ください。 https://www.youtube.com/watch?v=LLRig4s1_yA&embedable=true HTTP/2 を活用してリクエストを高速化する は、単一の接続で複数のリクエストを許可する HTTP の更新バージョンです。これにより、レイテンシが短縮され、スクレイピング タスクの全体的なパフォーマンスが向上します。 HTTP/2 サイトが HTTP/2 をサポートしているかどうかを確認するには、ブラウザで DevTools を開き、「ネットワーク」タブに移動して、「プロトコル」列を確認します と表示されている場合、サイトは HTTP/2 を使用しています。 h2 残念ながら、すべての HTTP クライアントとスクレイピング ライブラリが HTTP/2 をサポートしているわけではありません。ただし、 。 HTTPX for Python などのツールは、HTTP/2 を完全にサポートしています タスクの並列化 Web スクレイピングは主に です。サーバーにリクエストを送信し、応答を待機し、データを処理し、これを繰り返します。待機時間中、スクレイパーは基本的にアイドル状態になり、非効率的です。 I/O バウンド タスク 解決策は? か! 並列処理 か 同時実行 複数のリクエストを一度に送信すると、デッドタイムを最小限に抑え、ネットワークの使用を最適化できます。 🚨 でも気をつけて!🚨 同時リクエストが多すぎると、レート制限や IP 禁止につながる可能性があります。これらは、 としてよく使われる 2 つの手段です。😬 スクレイピング防止対策 : 特に複数の CPU を使用している場合は、解析タスクを並列化して、データ抽出プロセスを高速化することもできます。⚡ プロのヒント AIベースの適応アルゴリズムを採用する データと HTML ページ構造のパターンを学習し、変更に対応するためにリアルタイムで動作を調整します。😮 AI ベースの適応型アルゴリズムは、 これはウェブスクレイピングにとって画期的なことです! 🤯 ウェブサイトのレイアウトが更新されたり、ボット対策が導入されたりすると、これらのアルゴリズムはすぐに適応し、スクレイパーがスムーズに実行され続けるようにします。🧠 つまり、スクレーパーをよりスマートにし、サイトが予期しない変化を起こした場合でも、データを効率的に抽出できるようにします。⚾ 適応型アルゴリズムを使用すると、時間の経過とともに進化するスクレーパーを持つようなものです。 詳細については、Forrest Knight によるこのビデオの第 4 章をご覧ください。 https://www.youtube.com/watch?v=vxk6YPRVg_o&embedable=true ウェブスクレイピングの最適化に最適なツール 確かに、これまで紹介したヒントやコツを使えば、スクレーパーの速度、信頼性、堅牢性、効率性を高めることができます。しかし、現実的に考えてみると、それらは複雑さも伴います。😅 幸いなことに、これらのレッスンのほとんどは、ほとんどのスクレイピング プロジェクトに当てはまります。したがって、すべてをゼロからコーディングする代わりに、事前に構築された関数を使用して特定のタスクに取り組むことができます。それがまさに が提供するものです。 Bright Data のスクレイピング関数 73 以上の既成 JavaScript 関数を使用して、ユーザーは 195 か国以上で動作する 38,000 以上のスクレイパーを構築しました。これは膨大なスクレイピング パワーです! 📈 Web データ収集を簡単にスクレイピング、ロック解除、拡張できるように設計されたランタイム環境を使用して、開発をスピードアップします。 https://www.youtube.com/watch?v=Ve04_6gDKvU&embedable=true 最後に 経験豊富なスクレイピング開発者の洞察を活用して、スクレイパーをレベルアップする方法がわかりました。 これはまだパート 3 に過ぎず、高度な Web スクレイピングに関する 6 部構成の旅の半分が終わったに過ぎないことを覚えておいてください。シートベルトを締めたままにしておいてください。これからさらに最先端のテクノロジー、巧妙なソリューション、内部のヒントについて詳しく説明していきます。 次の目的地は? AI 駆動型プロキシ管理の力を活用することです!🌐