あなたは間違いなく良い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からhtmlをプルして1つのデータを抽出し、次にhttp://example.com/api/baz?foo=b ... からjson応答をプルする必要があります。他のデータを取得します。正しいCookieまたはセッションパラメータを渡すことに注意する必要があります。これは非常にまれですが、場合によってはajax呼び出しに必要な一部のパラメーターが、サイトのJavaScriptで行われたクレイジーな計算の結果であり、これをリバースエンジニアリングするのは煩わしい場合があります。
組み込みブラウザーのアプローチ:
どのデータがhtmlにあり、どのデータがajax呼び出しから入ってくるのかを理解する必要があるのはなぜですか?そのすべてのセッションとCookieデータを管理していますか?サイトを閲覧するときに、ブラウザとサイトのJavaScriptがそうする必要はありません。それがポイントです。
phantomjsなどのヘッドレスブラウザーエンジンにページをロードするだけの場合は、ページがロードされ、JavaScriptが実行され、すべてのajax呼び出しが完了したことが通知されます。適切なクリックをトリガーするために必要な場合、またはサイトのJavaScriptをトリガーして適切なデータをロードするために必要な場合は、独自のJavaScriptを挿入できます。
これで2つのオプションがあります。完成したhtmlを吐き出して解析するか、解析とデータのフォーマットを行い、データを吐き出すページにJavaScriptを挿入します(おそらくjson形式で)。これら2つのオプションも自由に組み合わせることができます。
どのアプローチが最適ですか?
状況によって異なりますが、低レベルのアプローチに精通し、快適である必要があります。組み込みブラウザーのアプローチは何でも機能します。実装がはるかに簡単になり、スクレイピングの最も難しい問題がいくつかなくなります。また、理解する必要があるかなり複雑な機械でもあります。これは、HTTPリクエストとレスポンスだけでなく、リクエスト、埋め込みブラウザのレンダリング、サイトのJavaScript、挿入されたJavaScript、独自のコード、埋め込みブラウザプロセスとの双方向のやり取りです。
埋め込みのブラウザーは、レンダリングのオーバーヘッドのため、スケールがはるかに遅くなりますが、多くの異なるドメインをスクレイピングしている場合を除いて、ほとんど問題になりません。リクエストをレート制限する必要があるため、単一ドメインの場合、レンダリング時間は完全に無視できます。
レート制限/ボットの動作
このことを十分に認識する必要があります。ターゲットドメインに妥当な割合でリクエストを送信する必要があります。ウェブサイトをクロールするときは、適切に動作するボットを作成する必要があります。つまり、robots.txtを尊重し、リクエストでサーバーを攻撃することはありません。ここでのミスや過失は、サービス拒否攻撃と見なされる可能性があるため、非常に非倫理的です。許容可能なレートは、質問者によって異なります。1req/ sはGoogleクローラーが実行される最大値ですが、Googleではなく、Googleほど歓迎されていません。できるだけ遅くしてください。各ページリクエストの間隔は2〜5秒にすることをお勧めします。
ボットを識別するユーザーエージェント文字列を使用してリクエストを識別し、ボットがその目的を説明するWebページを用意します。このURLはエージェント文字列に含まれます。
サイトがあなたをブロックしたい場合、あなたは簡単にブロックされます。エンドのスマートエンジニアはボットを簡単に識別でき、エンドでの数分の作業により、数週間の作業でエンドのスクレイピングコードが変更されたり、まったく不可能になったりする可能性があります。関係が敵対的である場合、ターゲットサイトのスマートエンジニアは、クローラを作成する天才エンジニアを完全に悩ませることができます。スクレイピングコードは本質的に壊れやすく、これは簡単に悪用されます。とにかく、この応答を引き起こすものはほとんど間違いなく非倫理的です。そのため、適切に動作するボットを作成し、これについて心配する必要はありません。
テスト中
単体/統合テスト担当者ではありませんか?残念な。あなたは今、一つになる必要があります。サイトは頻繁に変更され、コードも頻繁に変更されます。これは大きな課題です。
最新のWebサイトのスクレイピングには多くの可動部分があり、適切なテスト方法が役立ちます。このタイプのコードの作成中に遭遇するバグの多くは、破損したデータを静かに返すタイプです。退行をチェックするための適切なテストがなければ、気付かないうちに、役に立たない破損したデータをデータベースにしばらく保存していることがわかります。このプロジェクトは、データの検証(使用するいくつかの優れたライブラリを見つける)とテストに非常に慣れます。包括的なテストが必要であり、テストが非常に難しいことを組み合わせた他の多くの問題はありません。
テストの2番目の部分には、キャッシュと変更の検出が含まれます。コードを書いている間、理由もなく同じページのサーバーを何度も何度も叩きたくありません。ユニットテストの実行中に、コードが破損したため、またはWebサイトが再設計されたためにテストが失敗したかどうかを知りたい場合。関連するURLのキャッシュされたコピーに対してユニットテストを実行します。キャッシングプロキシはここでは非常に便利ですが、適切に構成して使用するにはトリッキーです。
また、サイトが変更されたかどうかも知りたいです。彼らがサイトを再設計し、クローラーが壊れた場合、それらはキャッシュされたコピーに対して実行されているため、ユニットテストは依然として成功します!ライブサイトに対してまれに実行される別の小さな統合テストセット、または正確な問題をログに記録し、問題を警告してクロールを停止するクロールコードでの適切なログ記録とエラー検出のいずれかが必要になります。これで、キャッシュを更新し、ユニットテストを実行して、何を変更する必要があるかを確認できます。
法的問題
あなたが愚かなことをするなら、ここの法律は少し危険かもしれません。法律が関与する場合、あなたは定期的にwgetやcurlを「ハッキングツール」と呼ぶ人々を扱っています。あなたはこれを望まない。
状況の倫理的現実は、ブラウザソフトウェアを使用してURLを要求して一部のデータを確認することと、独自のソフトウェアを使用してURLを要求して一部のデータを確認することの間に違いがないことです。Googleは世界最大のスクレイピング会社であり、彼らは愛されています。ユーザーエージェントでボットの名前を特定し、ウェブクローラーの目標と意図についてオープンであることは、法律がGoogleとは何かを理解しているため、ここで役立ちます。偽のユーザーアカウントを作成したり、禁止する必要のあるサイトの領域にアクセスしたり(robots.txtで「ブロック」されたり、何らかの承認の悪用のため)のような不審なことを行っている場合は、倫理に反する行為を行っていることに注意してください。法律がテクノロジーを知らないことは、ここでは非常に危険です。ばかげた状況ですが、実際の状況です。
立派な市民として、新しい検索エンジンを試して構築し、間違いを犯したり、ソフトウェアにバグを犯したりして、ハッカーと見なされる可能性があります。現在の政治的現実を考慮したいものではありません。
とにかく私はこの巨大なテキストの壁を誰に書けばいいのでしょうか?
私は人生でWebクロール関連のコードをたくさん書いてきました。私はコンサルタント、従業員、スタートアップの創設者として、10年以上にわたってWeb関連のソフトウェア開発を行ってきました。初期の頃は、perlクローラー/スクレーパーとphpウェブサイトを書いていた。XMLHTTPRequestがアイデアになる前に、Jesse James Garrettがajaxと命名する前に、csvデータをWebページにロードしてajaxを実行する隠しiframeを埋め込んでいたとき。jQueryの前、jsonの前。私は30代半ばです。明らかにこのビジネスでは古代と考えられています。
大規模なクロール/スクレイピングシステムを2回記述しました。1つはメディア会社の大規模なチーム向け(Perl)、最近は小規模なチーム向けに(Python / Javascriptの)検索エンジン新興企業のCTOとして作成しました。私は現在コンサルタントとして働いており、主にClojure / Clojurescriptでコーディングしています(一般に素晴らしいエキスパート言語であり、クローラー/スクレーパーの問題を楽にするライブラリーがあります)
成功したクロール防止ソフトウェアシステムも作成しました。嫌いなボットを特定したり妨害したりする場合は、非常に簡単に解読できないサイトを作成するのが非常に簡単です。
私は、他のどのタイプのソフトウェアよりもクローラー、スクレーパー、パーサーを書くことが好きです。やりがいがあり、楽しく、素晴らしいものを作成するために使用できます。