1. ホーム
  2. api

[解決済み] ウェブサイトからデータをスクレイピングする一番良い方法は何ですか?[クローズド]

2022-09-15 14:15:41

質問

ウェブサイトからコンテンツを抽出する必要がありますが、アプリケーションはそのデータにプログラムでアクセスするためのアプリケーションプログラミングインターフェースまたは他のメカニズムを提供していません。

という便利なサードパーティツールを見つけました。 インポート.io という便利なツールを見つけました。このツールは、ウェブページをスクレイピングしてデータセットを構築するためのクリック アンド ゴー機能を提供します。

この会社は Web ページのスクレイピングとデータセットの構築にどのような技術を使用しているのでしょうか?いくつかのウェブスクレイピングフレームワークを見つけました。 pjscrape & スクレイプ は、そのような機能を提供することができます

どのように解決するのですか?

あなたは間違いなく、優れた Web スクレイピング フレームワークで開始したいと思うでしょう。しかし、多くのスクレイピングの経験がなければ、あなたのデザインは pjscrape や scrapy よりもずっと悪くなってしまうでしょう。

注:ここでは、クローリングとスクレイピングという用語は基本的に互換性があるものとして使用しています。これはQuoraの質問に対する私の回答のコピーで、かなり長いです。

ツール

使用するブラウザに応じて、Firebug または Chrome 開発ツールのいずれかに精通してください。これは、データを取得するサイトをブラウズして、探しているデータを含む URL と、応答を構成するデータ形式をマップする際に、絶対に必要になります。

HTML と同様に HTTP の実用的な知識が必要であり、おそらく中間プロキシ ソフトウェアの適切な部分を見つけたいと思うことでしょう。HTTP リクエストとレスポンスを検査し、Cookie やセッション情報、クエリ パラメータがどのようにやり取りされているかを理解できる必要があります。Fiddler ( http://www.telerik.com/fiddler ) と Charles Proxy ( http://www.charlesproxy.com/ ) が人気のあるツールです。私は mitmproxy ( http://mitmproxy.org/ ) をよく使います。私はマウスよりもキーボード派なので。

コンソール/シェル/REPL タイプの環境のようなもので、コードのさまざまな部分を試して即座にフィードバックできるものは、非常に貴重なものです。このようなリバース エンジニアリングのタスクは、多くの試行錯誤が必要なので、これを簡単にするワークフローが必要でしょう。

言語

PHPは基本的にアウトです。このタスクにはあまり適しておらず、ライブラリ/フレームワークのサポートはこの分野では貧弱です。Python (Scrapy は素晴らしい出発点です) と Clojure/Clojurescript (信じられないほど強力で生産的ですが、大きな学習曲線です) はこの問題に対する素晴らしい言語です。あなたは新しい言語を学びたくないし、すでにJavascriptを知っているので、私は間違いなくJSに固執することをお勧めします。私はpjscrapeを使ったことがありませんが、彼らのドキュメントをざっと読んだところでは、かなり良さそうです。それはよく適しており、私が以下に説明する問題への優れたソリューションを実装しています。

正規表現に関するメモ。 html を解析するために正規表現を使用しないでください。 多くの初心者が、すでに正規表現に慣れているためにこれを行います。xpath や CSS セレクタを使って html を操作し、正規表現を使うのは html ノード内の実際のテキストからデータを抽出するときだけにしてください。これはもう当たり前のことかもしれないし、やってみればすぐにわかることなのですが、多くの人がなぜかこの道を進んで時間を浪費しています。xpathやCSSセレクタは正規表現よりずっと簡単で、この問題を解決するために作られたものなので、怖がらないでください。

Javascriptを多用するサイト

昔は、http リクエストを行い、HTML 応答を解析するだけでした。現在では、標準の HTML HTTP リクエスト/レスポンスと、ターゲット サイトの javascript 部分によって行われる非同期 HTTP 呼び出しが混在するサイトに対処する必要があるのはほぼ確実です。このとき、プロキシソフトやfirebug/devtoolsのネットワークタブが非常に役に立ちます。これらの応答は html かもしれないし、json かもしれない、まれに xml や他のものかもしれない。

この問題には2つのアプローチがあります。

低レベルのアプローチ。

サイトのJavaScriptが呼び出しているajaxのURLと、それらの応答がどのようなものかを把握し、同じリクエストを自分で行うことができます。つまり http://example.com/foobar から json レスポンスを取得し、1 つのデータを抽出する必要があります。 http://example.com/api/baz?foo=b ... から json レスポンスを取得して、もう一方のデータを取得する必要があります。正しいクッキーやセッションパラメータを渡すように意識する必要があります。非常にまれなことですが、ajax呼び出しに必要なパラメータのいくつかが、サイトのjavascriptで行われたクレイジーな計算の結果であることがあり、これをリバースエンジニアリングすると、厄介なことになります。

埋め込みブラウザーのアプローチ。

なぜhtmlにあるデータとajaxの呼び出しから入ってくるデータをうまく処理する必要があるのでしょうか?セッションと Cookie のデータをすべて管理する必要があるのでしょうか? サイトを閲覧する際には、ブラウザとサイトのJavaScriptがそれを行うので、その必要はありません。それが重要なのです。

phantomjsのようなヘッドレスブラウザエンジンにページを読み込ませれば、ページを読み込み、javascriptを実行し、すべてのajaxコールが完了したときにそれを教えてくれるでしょう。適切なクリックをトリガーするため、またはサイトの JavaScript が適切なデータをロードするために必要なものであれば、独自の JavaScript を注入することができます。

完成したhtmlを吐き出させ、それをパースするか、パースとデータフォーマットを行うjavascriptをページに注入し、データを吐き出すか(おそらくjson形式で)です。この2つのオプションは自由に組み合わせることができます。

どのようなアプローチが最適ですか?

低レベルのアプローチに慣れていて、快適である必要があることは確かです。埋め込みブラウザーによるアプローチは何にでも使えますし、実装がはるかに簡単で、スクレイピングにおける最も厄介な問題のいくつかを解決することができます。また、かなり複雑な機械であるため、理解する必要があります。HTTP リクエストとレスポンスだけでなく、リクエスト、埋め込みブラウザーのレンダリング、サイトの javascript、注入された javascript、独自のコード、埋め込みブラウザー プロセスとの 2 方向の対話があります。

埋め込みブラウザーは、レンダリングのオーバーヘッドにより、規模が大きくなるとかなり遅くなりますが、多くの異なるドメインをスクレイピングしない限り、ほとんど問題にはならないでしょう。要求を制限する必要があるため、単一のドメインの場合、レンダリング時間はまったく無視できるほど小さくなります。

レート リミット/ボットの動作

このことをよく理解しておく必要があります。ターゲットとなるドメインへのリクエストは、適度な速度で行う必要があります。Web サイトをクロールするときは、行儀のよいボットを書く必要があります。これは robots.txt を尊重し、サーバーに要求を叩きつけないことを意味します。これはサービス拒否攻撃とみなされる可能性があるため、ここでの間違いや過失は非常に非倫理的です。1req/sは、Googleのクローラーが実行する最大値ですが、あなたはGoogleではないので、おそらくGoogleほど歓迎されていないでしょう。できるだけ低速に保ちましょう。私は、各ページのリクエストの間に2~5秒をお勧めします。

ボットを識別するユーザーエージェント文字列でリクエストを識別し、その目的を説明するボット用のウェブページを用意します。このURLはエージェント文字列に含まれます。

サイトがあなたをブロックしたい場合、あなたは簡単にブロックすることができます。サイト側の賢いエンジニアは簡単にボットを特定することができ、数分の作業でスクレイピングコードを変更したり、それを不可能にするために数週間の作業を行うことができます。もし、敵対関係にあれば、ターゲットサイトの賢いエンジニアは、クローラーを書く天才的なエンジニアを完全に妨害することができる。スクレイピングコードは本質的に脆弱であり、これは簡単に利用される。このような反応を引き起こすようなものは、いずれにしても非倫理的であることはほぼ間違いないので、行儀の良いボットを書き、この点については心配しないようにしましょう。

テスト

ユニットテストや統合テストの担当者ではない?残念ですね。あなたはこれからそうならねばなりません。サイトは頻繁に変更され、あなたはコードを頻繁に変更することになります。これは課題の大きな部分です。

現代のウェブサイトのスクレイピングには多くの可動部があり、良いテストプラクティスは多くの助けになります。この種のコードを書いている間に遭遇するバグの多くは、破損したデータを黙って返すだけのタイプになります。リグレッションをチェックするための良いテストがなければ、気づかないうちにデータベースに無駄な破損データを保存していたことに気づくことになるでしょう。このプロジェクトでは、データの検証(使用する良いライブラリを見つけること)とテストについて非常によく知ることができます。包括的なテストを必要とし、テストが非常に困難であることを併せ持つ問題は、他にはあまりありません。

テストの2番目の部分は、キャッシュと変更検知を含みます。コードを書いている間、理由もなく何度も何度も同じページについてサーバーを叩くようなことはしたくありません。ユニットテストを実行しながら、テストが失敗するのはコードが壊れたからなのか、それともウェブサイトが再設計されたからなのかを知りたいと思うでしょう。関係する URL のキャッシュされたコピーに対してユニットテストを実行します。キャッシュ プロキシはここで非常に役立ちますが、適切に設定し使用するのが難しいです。

また、サイトが変更されたかどうかを知りたいと思うでしょう。もし、サイトが再設計され、クローラーが壊れたとしても、ユニットテストはキャッシュされたコピーに対して実行されているため、パスします! そのため、実際のサイトに対して頻繁に実行されるわけではない別の小さな統合テストのセットか、クローリングコードに適切なロギングとエラー検出を行い、問題を正確に記録し、警告を発してクロールを停止させる必要があります。これで、キャッシュを更新し、ユニットテストを実行し、変更する必要があるものを確認することができます。

法的な問題

ここでの法律は、あなたが愚かなことをした場合、少し危険なものになる可能性があります。法律が絡むと、wgetやcurlを"ハッキングツール"と常々言っている人たちを相手にすることになります。あなたはこれを望まないでしょう。

この状況の倫理的な現実は、URL を要求していくつかのデータを見るためにブラウザソフトウェアを使用することと、URL を要求していくつかのデータを見るために独自のソフトウェアを使用することに違いはないということです。Google は世界最大のスクレイピング企業であり、彼らはそのために愛されています。ユーザーエージェントでボットの名前を特定し、ウェブクローラーの目標と意図についてオープンにすることは、法律がGoogleを理解しているため、ここで役に立ちます。もし、偽のユーザーアカウントを作ったり、アクセスしてはいけない領域(robots.txtによって"blocked"されているか、ある種の認可悪用のため)にアクセスするなど、いかがわしいことをしているなら、倫理に反することをしていると自覚して、法律の技術に対する無知は、ここで余計に危険となるでしょう。ばかげた状況ですが、実際にあることなのです。

文字通り、立派な市民として新しい検索エンジンを作ろうとして、ミスをしたり、ソフトウェアにバグがあったりすると、ハッカーとみなされる可能性があるのです。現在の政治的現実を考えると、望むところではありません。

この巨大なテキストの壁を書くのは誰なのでしょうか?

私はこれまでの人生で、たくさんのウェブクローリング関連のコードを書いてきました。私は、コンサルタント、従業員、およびスタートアップの創設者として、10 年以上にわたって Web 関連のソフトウェア開発を行ってきました。初期のころは、Perl のクローラー/スクレイパーと php の Web サイトを書いていました。Jesse James Garrettがajaxと名付ける前、XMLHTTPRequestがアイデアとなる前、csvデータをロードする隠しiframeをウェブページに埋め込んでajaxを行っていた頃。jQueryもjsonもない時代です。私は30代半ばですが、このビジネスでは古株とみなされるようです。

一度はメディア企業の大規模なチームのために(Perlで)、そして最近では検索エンジンのスタートアップのCTOとして小規模なチームのために(Python/Javascriptで)、大規模なクロール/スクレイピングシステムを2回書きました。現在はコンサルタントとして、主にClojure/Clojurescript(一般的に素晴らしい専門言語で、クローラー/スクレイパーの問題を楽しくするライブラリがあります)でコーディングしています。

私は、クローリング対策ソフトウェアのシステムも書いて成功させました。その気になれば、ほとんどスクラップされないサイトを書くことも、気に入らないボットを特定して妨害することも、驚くほど簡単にできるようになるのです。

私は、クローラー、スクレーパー、パーサーを書くことが、他のどのタイプのソフトウェアよりも好きです。やりがいがあり、楽しく、驚くべきものを作るために使用することができます。