ホームページ >バックエンド開発 >Python チュートリアル >Webスクレイピングの専門家のように考える方法のヒント

Webスクレイピングの専門家のように考える方法のヒント

DDD
DDDオリジナル
2024-11-05 11:29:02748ブラウズ

通常、チュートリアルは技術的な側面、つまり「ここから始めて、この道をたどれば、ここにたどり着く」という再現できる内容に焦点を当てています。これは特定のテクノロジーを学習するのには最適ですが、作成者がなぜ特定の方法で物事を行うことを決めたのか、何が開発プロセスの指針になっているのかを理解するのが難しい場合があります。

私たちのコミュニティ メンバーの 1 人が、Crawlee Blog への寄稿としてこのブログを書きました。このようなブログを Crawlee Blog に投稿したい場合は、Discord チャンネルまでご連絡ください。

クローリー&アピファイ

これは、Apify と Crawlee の公式開発者コミュニティです。 |会員数8987名

tips on how to think like a web scraping expert discord.com

このブログでは、Web スクレイピング プロジェクトに取り組む際の指針となり、素晴らしい結果を達成するための一般的なルールと原則について説明します。

それでは、Web スクレイピング開発者の考え方を探ってみましょう。

1. プロジェクトのデータソースの選択

プロジェクトに取り組み始めると、特定のデータを抽出する必要があるターゲット サイトが存在する可能性があります。このサイトまたはアプリケーションがデータ抽出にどのような可能性を提供しているかを確認してください。以下に考えられるオプションをいくつか示します:

  • 公式 API - サイトは、必要なデータをすべて取得できる無料の公式 API を提供する場合があります。これがあなたにとって最良の選択肢です。たとえば、Yelp からデータを抽出する必要がある場合は、このアプローチを検討できます。
  • ウェブサイト - この場合、ウェブサイト、その構造、フロントエンドとバックエンドの相互作用方法を研究します
  • モバイル アプリケーション - 場合によっては、Web サイトや API がまったく存在しないか、モバイル アプリケーションがより多くのデータを提供する場合があります。その場合は、中間者アプローチを忘れないでください

1 つのデータ ソースに障害が発生した場合は、利用可能な別のソースにアクセスしてみてください。

たとえば、Yelp の場合、3 つのオプションすべてが利用可能であり、何らかの理由で公式 API が合わない場合は、他の 2 つを試すことができます。

2. robots.txt とサイトマップを確認する

robots.txt とサイトマップについては誰もが何らかの形で知っていると思いますが、それらを単に忘れている人をよく見かけます。これらについて初めて聞いた場合は、ここで簡単に説明します:

  • ロボットは、SEO におけるクローラーの定着した名前です。通常、これは Google や Bing などの主要な検索エンジンのクローラー、または Ahrefs や ChatGPT などのサービスを指します。
  • robots.txt は、ロボットに許可される動作を説明するファイルです。これには、許可されたクローラー ユーザー エージェント、ページ スキャン間の待機時間、スキャンが禁止されているページのパターンなどが含まれます。これらのルールは通常、どのページが検索エンジンによってインデックスされるべきか、どのページがインデックスされないのかに基づいています。
  • サイトマップは、ロボットがナビゲートしやすいようにサイトの構造を記述します。また、サイトに不要な負荷を与えることなく、更新が必要なコンテンツのみをスキャンするのにも役立ちます

あなたは Google やその他の一般的な検索エンジンではないため、robots.txt のロボット ルールはあなたに反する可能性があります。ただし、サイトマップと組み合わせると、サイトの構造、ロボットとの予想される対話、およびブラウザー以外のユーザー エージェントを研究するのに適した場所になります。場合によっては、サイトからのデータ抽出が簡素化されます。

たとえば、Crawlee Web サイトのサイトマップを使用すると、ブログの存続期間全体と特定の期間の両方の投稿への直接リンクを簡単に取得できます。 1 つの簡単なチェックを行うだけで、ページネーション ロジックを実装する必要はありません。

3. サイト分析を怠らない

徹底的なサイト分析は、特にブラウザ自動化を使用する予定がない場合、効果的な Web スクレイパーを作成するための重要な前提条件です。ただし、このような分析には時間がかかり、場合によってはかなりの時間がかかります。

分析とより最適なクローリング ソリューションの検索に費やした時間は、必ずしも報われるわけではないことにも注意してください。最も明白なアプローチが最初から最善であったことを発見するためにのみ何時間も費やす可能性があります。

したがって、最初のサイト分析には制限を設定することが賢明です。割り当てられた時間内でより良いパスが見つからない場合は、より単純なアプローチに戻ります。経験を積むにつれて、サイトで使用されているテクノロジーに基づいて、分析により多くの時間を費やす価値があるかどうかを早い段階で判断できるようになります。

また、サイトからデータを 1 回だけ抽出する必要があるプロジェクトでは、徹底的なサイト分析により、スクレイパー コードを完全に記述する必要がなくなる場合があります。そのようなサイトの例を次に示します - https://ricebyrice.com/nl/pages/find-store.

tips on how to think like a web scraping expert

分析すると、すべてのデータが 1 回のリクエストで取得できることが簡単にわかります。このデータをブラウザから JSON ファイルにコピーするだけで、タスクは完了です。

tips on how to think like a web scraping expert

4. 最大限のインタラクティブ性

サイトを分析するときは、ブラウザの開発ツールの [ネットワーク] タブを見ながら、並べ替えやページを切り替え、サイトのさまざまな要素を操作します。これにより、サイトがバックエンドとどのようにやり取りするのか、どのようなフレームワークに基づいて構築されているのか、どのような動作が期待できるのかをより深く理解できるようになります。

5. データは何もないところから現れるものではありません

これは明白ですが、プロジェクトに取り組む際に心に留めておくことが重要です。いくつかのデータまたはリクエスト パラメータが表示される場合は、それらが以前のどこかで、おそらく別のリクエストで取得されたことを意味します。おそらく、それらはすでに Web サイトのページに存在し、おそらく他のパラメータから JS を使用して形成された可能性があります。でも、彼らはいつもどこかにいます。

ページ上のデータの出所、またはリクエストで使用されるデータがわからない場合は、次の手順に従ってください。

  1. 続いて、この時点より前にサイトが行ったすべてのリクエストを確認します。
  2. 応答、ヘッダー、Cookie を調べます。
  3. 直感を働かせてください: このパラメータはタイムスタンプでしょうか?変更された形式の別のパラメータである可能性がありますか?
  4. 標準のハッシュまたはエンコーディングに似ていますか?

ここでは練習すれば完璧になります。さまざまなテクノロジ、さまざまなフレームワーク、およびそれらの期待される動作に慣れ、さまざまなテクノロジに遭遇すると、物事がどのように機能し、データがどのように転送されるかを理解しやすくなることがわかります。この蓄積された知識により、Web アプリケーションのデータ フローを追跡して理解する能力が大幅に向上します。

6. データはキャッシュされます

同じページを何度か開くと、サーバーに送信されるリクエストが異なることに気づくかもしれません。おそらく何かがキャッシュされ、すでにコンピューターに保存されています。したがって、ブラウザを切り替えるだけでなく、シークレット モードでサイトを分析することをお勧めします。

この状況は、一部のデータをデバイス上のストレージに保存する可能性があるモバイル アプリケーションに特に関係します。したがって、モバイル アプリケーションを分析するときは、キャッシュとストレージをクリアする必要がある場合があります。

7. フレームワークについて詳しく知る

分析中に、これまでに見たことのないフレームワークがサイトで使用されていることが判明した場合は、時間をかけてそのフレームワークとその機能について学習してください。たとえば、サイトが Next.js で構築されていることに気付いた場合、ルーティングとデータの取得がどのように処理されるかを理解することが、スクレイピング戦略にとって重要になる可能性があります。

これらのフレームワークについては、公式ドキュメントを通じて、または ChatGPT や Claude などの LLM を使用して学ぶことができます。これらの AI アシスタントは、フレームワーク固有の概念を説明するのに優れています。 Next.js について LLM にクエリを実行する方法の例を次に示します。

I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed?

Restrictions:
- Accompany your answers with code samples
- Use this message as the main message for all subsequent responses
- Reference only those elements that are available on the client side, without access to the project code base

バックエンド フレームワークに対しても同様のクエリを作成できます。たとえば、GraphQL を使用すると、利用可能なフィールドやクエリ構造について尋ねることができます。これらの洞察は、サイトの API をより適切に操作する方法と、どのようなデータが利用できる可能性があるかを理解するのに役立ちます。

LLM を効果的に使用するには、少なくとも基本的にはプロンプト エンジニアリングの基礎を勉強することをお勧めします。

8. リバースエンジニアリング

Web スクレイピングはリバース エンジニアリングと連携して行われます。フロントエンドとバックエンドの相互作用を研究すると、特定のパラメーターがどのように形成されるかをよりよく理解するためにコードを研究する必要がある場合があります。

ただし、場合によっては、リバース エンジニアリングにはより多くの知識、労力、時間が必要になったり、高度な複雑さが必要になる場合があります。この時点で、それをさらに詳しく調べる必要があるのか​​、それともデータ ソースやテクノロジなどを変更した方がよいのかを判断する必要があります。おそらく、これが HTTP Web スクレイピングを放棄し、ヘッドレス ブラウザに切り替えることを決定する瞬間となるでしょう。

ほとんどの Web スクレイピング保護の主な原則は、Web スクレイピングを不可能にすることではなく、コストを高くすることです。

Zoopla での検索に対する応答がどのようなものかを見てみましょう

tips on how to think like a web scraping expert

9. エンドポイントへのリクエストのテスト

ターゲット データを抽出する必要があるエンドポイントを特定した後、リクエストを行ったときに正しい応答が得られることを確認してください。サーバーから 200 以外の応答が返された場合、または予想と異なるデータが返された場合は、その理由を解明する必要があります。考えられる理由は次のとおりです:

  • Cookie や特定の技術ヘッダーなど、いくつかのパラメーターを渡す必要があります
  • サイトでは、このエンドポイントにアクセスするときに、対応するリファラー ヘッダーが必要です
  • サイトはヘッダーが特定の順序に従うことを期待しています。数回しか遭遇したことがありませんが、遭遇しました
  • サイトは、TLS フィンガープリントなどによる Web スクレイピングに対する保護を使用しています

その他多くの考えられる理由があり、それぞれ個別の分析が必要です。

10. リクエストパラメータを試してみる

リクエストパラメータを変更したときにどのような結果が得られるかを調べます (存在する場合)。一部のパラメーターが欠落している可能性がありますが、サーバー側でサポートされています。たとえば、順序、並べ替え、ページごと、制限などです。それらを追加して、動作が変わるかどうかを確認してください。

これは、graphql を使用するサイトに特に関係します

この例を考えてみましょう

サイトを分析すると、次のコードで再現できるリクエストが表示されます。読みやすくするために少しフォーマットしました。

I am in the process of optimizing my website using Next.js. Are there any files passed to the browser that describe all internal routing and how links are formed?

Restrictions:
- Accompany your answers with code samples
- Use this message as the main message for all subsequent responses
- Reference only those elements that are available on the client side, without access to the project code base

次に、一度に 2 つの言語で結果を取得できるように更新します。そして最も重要なことは、出版物の内部テキストとともに結果を取得することです。

import requests

url = "https://restoran.ua/graphql"

data = {
    "operationName": "Posts_PostsForView",
    "variables": {"sort": {"sortBy": ["startAt_DESC"]}},
    "query": """query Posts_PostsForView(
    $where: PostForViewWhereInput,
    $sort: PostForViewSortInput,
    $pagination: PaginationInput,
    $search: String,
    $token: String,
    $coordinates_slice: SliceInput)
    {
        PostsForView(
                where: $where
                sort: $sort
                pagination: $pagination
                search: $search
                token: $token
                ) {
                        id
                        title: ukTitle
                        summary: ukSummary
                        slug
                        startAt
                        endAt
                        newsFeed
                        events
                        journal
                        toProfessionals
                        photoHeader {
                            address: mobile
                            __typename
                            }
                        coordinates(slice: $coordinates_slice) {
                            lng
                            lat
                            __typename
                            }
                        __typename
                    }
    }"""
}

response = requests.post(url, json=data)

print(response.json())

ご覧のとおり、リクエスト パラメータを少し更新することで、各出版物の内部ページにアクセスすることを心配する必要がなくなります。このトリックで何度私が救われたかわかりません。

graphql を目の前にしてどこから始めればよいかわからない場合は、ドキュメントと LLM に関する私のアドバイスがここでも役に立ちます。

11. 新しいテクノロジーを恐れないでください

いくつかのツールをマスターし、機能するのでそれを使用するのがいかに簡単かを私は知っています。私自身、何度もこの罠にはまってしまいました。

しかし、最新のサイトでは Web スクレイピングに大きな影響を与える最新のテクノロジーが使用されており、それに応じて Web スクレイピング用の新しいツールが登場しています。これらを学ぶことで、次のプロジェクトが大幅に簡素化され、克服できなかった問題が解決される可能性もあります。いくつかのツールについては以前に書きました。

curl_cffi とフレームワークに特に注意することをお勧めします
Python のボタサウルスとクローリー。

12. オープンソース ライブラリのヘルプ

個人的に、私は最近になってこの重要性に気づきました。私が仕事で使用するツールはすべて、オープンソースで開発されているか、オープンソースに基づいています。 Web スクレイピングは文字通りオープンソースのおかげで生きています。これは、あなたが Python 開発者で、TLS フィンガープリントを処理する必要がある場合に純粋な Python ではすべてが非常に悲しいことに気づいている場合に特に顕著であり、繰り返しますが、オープンソースが私たちを救ってくれました。こちら。

そして、私たちにできる最低限のことは、オープンソースのサポートに私たちの知識とスキルを少し投資することだと思います。

私が Crawlee for Python をサポートすることにしたのは、ブログに書くことが許可されたからではなく、優れた開発ダイナミクスを示し、Web クローラー開発者の作業を容易にすることを目的としているからです。セッション管理、ブロックされたときのセッションのローテーション、非同期タスクの同時実行の管理などの重要な側面を処理し、内部に隠すことで、クローラの開発を高速化できます (非同期コードを作成したことがある方なら、これがどれほど面倒なことかご存知でしょう)。

:::ヒント
これまでのブログを気に入っていただけましたら、GitHub で Crawlee にスターを付けることをご検討ください。これにより、より多くの開発者にリーチして支援することができます。
:::

そして、あなたはどのような選択をしますか?

結論

記事内のいくつかのことはあなたにとって明白であり、いくつかはあなた自身に従っていると思いますが、何か新しいことも学べたことを願っています。それらのほとんどが新しいものである場合は、これらのルールを次のプロジェクトのチェックリストとして使用してみてください。

記事について喜んで議論させていただきます。お気軽にここ、記事内にコメントしていただくか、Discord の Crawlee 開発者コミュニティで私にご連絡ください。

次のプラットフォームでも私を見つけることができます: Github、Linkedin、Apify、Upwork、Contra。

ご清聴ありがとうございます:)

以上がWebスクレイピングの専門家のように考える方法のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。