Webサイトからデータをスクレイピングする最良の方法は何ですか?[閉まっている]


107

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

Webページをスクレイピングしてデータセットを構築するためのクリックアンドゴー機能を提供するImport.ioと呼ばれる便利なサードパーティツールを見つけました。データをローカルに保持し、サブスクリプションプランをサブスクライブしたくないだけです。 。

この会社は、Webページをスクレイピングしてデータセットを構築するためにどのようなテクニックを使用していますか?私はいくつかのWebスクレイピングフレームワークpjscrapeScrapyがそのような機能を提供できることを発見しました


4
PHPは確かに問題外ではありません。明らかにそれは間違いです。gist.github.com/krakjoe/b1526fcc828621e840cb
Joe Watkins、

@JoeWatkinsは本当にクールに見えますが、実行するには特別なPHP構成が必要ですか?そして、以下に提供されているツール/言語と比較した場合のパフォーマンスはどうですか?
0x1ad2 14

1
PHPとpthreadのスレッドセーフビルドが必要です。github.com/krakjoe /pthreads/ blob/master/README.mdを読んでください。ヘルプが必要な場合は、チャットで私を見つけることができます。私または他の誰か:)
Joe Watkins

@ 0x1ad2ローカルでデータを保持したい場合は、Web APIの代わりにソフトウェア(datascraping.co)を試してください。ほとんどのツールはXpath、CSSセレクター、REGEXを使用してWebサイトからデータを抽出し、Data Scraping Studioはこれら3つの機能をすべてサポートしています。
Vikash Rathee

2つの方法があります。1つは、多大な労力を必要とするフリー/オープンソースライブラリを使用して独自にロールアウトする方法です。文字通り、scrape.itを使用して任意のサイトのajax Webクローラーを生成できます。これは有料ツールですが、import.ioやkimonoなどの無料ツールでレンダリングできない場合に機能しました。
私の愛のPython

回答:


271

あなたは間違いなく良い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でコーディングしています(一般に素晴らしいエキスパート言語であり、クローラー/スクレーパーの問題を楽にするライブラリーがあります)

成功したクロール防止ソフトウェアシステムも作成しました。嫌いなボットを特定したり妨害したりする場合は、非常に簡単に解読できないサイトを作成するのが非常に簡単です。

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


4
私は以前、PHPが悪い選択であることに同意していましたが、適切なライブラリがあればそれほど悪くありません。正規表現と配列/ stingの操作は不格好ですが、プラス面では、どこでも高速です。
pguardiario 2014年

3
これを楽しいものにするライブラリがいくつかあり、それを非常に単純かつ非常に簡単にするライブラリがいくつかある環境では、なぜ「それほど悪くない」ことで満足するのでしょうか。私は同意します。これはPHP(およびFORTRAN、C、VBなど)で実行できますが、問題が本当に単純なものでない限り、適切なツールを使用して作業を行う方がはるかに優れています。そして再び、あなたが解決する信じられないほど単純な問題がない限り...正規表現が至る所にあるということは何が問題なのでしょうか?ライブラリのインストールは、ほとんどすべてのスクレイピングの問題よりもはるかに簡単です。そして実際には、この問題では正規表現はかなり遅いことがよくあります。
ジェシーシャーロック

5
あなたは正しいかもしれないが、私は事実を知って、私は簡単にPHPのようにそれを行うことはできません。PHPから離れる前は、10年近くプロフェッショナルなPHPの経験がありました。Pythonで大規模なスクレイピングシステムを構築するためにフルタイムで1年以上費やしましたが、PHPで利用できないいくつかの優れたライブラリなしで実行したり、Pythonで利用できる簡潔なメタプログラミング手法なしで実行したりすることは想像できません。さらに強力なメタプログラミング機能を取得するためにClojureに移行したのもこのためです。
ジェシーシャーロック

4
Enliveは、プロジェクト固有のコードに対するClojure自体の能力とともに、最大の勝者です。スキーマは、情報抽出コードの大部分を占める優れた検証ライブラリです。私は現在、MahoutのようなJavaの世界との簡単な相互運用や、いくつかの種類のjs実行のNashorn / Rhinoに本当に満足しています。そして、Clojureの人々は、このgithub.com/shriphani/subotaiのようにlibを書くタイプなので、あなたがそうする必要はありません。...次のコメントに続く...
ジェシーシャーロック14

3
また、実際のブラウザーが必要で、phantomjs / casperjsを使用する必要がある場合、clojurescript(cljxを使用してcljとcljsの間で共有されるコードであることが多い)を使用して、ページに挿入するjsをclojurescriptの代わりに書き込むことは非常に良いこともわかりました。Core.asyncは、サーバー上で並行性の高いクロールコードを調整するだけでなく、js環境内でコールバックの地獄から抜け出すのに最適です(phantomjs内のcore.async cljsコードでブラウザーの自動化を調整することは、他の方法と比べて天国です)。
ジェシーシャーロック

21

はい、あなたはそれを自分で行うことができます。それは、ページのソースを取得し、必要に応じてそれらを解析するだけの問題です。

さまざまな可能性があります。優れたコンボは、python-requests(urllib2の上に構築されurllib.request、Python3にあります)とBeautifulSoup4を使用することです。これには、要素を選択するメソッドがあり、CSSセレクターも許可されます。

import requests
from BeautifulSoup4 import BeautifulSoup as bs
request = requests.get("http://foo.bar")
soup = bs(request.text) 
some_elements = soup.find_all("div", class_="myCssClass")

一部は、xpath解析またはjqueryのようなpyquery、lxmlなどを好みます

必要なデータがJavaScriptによって生成された場合、上記は機能しません。python-ghostまたはSeleniumが必要です。私は後者をPhantomJSと組み合わせることを好み、インストールがはるかに軽くて簡単で、使いやすいです:

from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)

独自のソリューションを開始することをお勧めします。そうすることで、Scrapyの利点を理解できます。

PS:https : //github.com/scrapy/scrapelyをご覧ください。

pps:Portiaを見て、プログラミングの知識がなくても視覚的に情報の抽出を開始してくださいhttps : //github.com/scrapinghub/portia


anwserに感謝します。唯一の問題は、Pythonが私のスキルに含まれていないことです。同じタスクを実行できる他の優れたプログラミング言語はありますか?主にPHPとJavascriptを使用しています。
0x1ad2 14年

混乱してしまい申し訳ありませんが(私の質問ではPythonフレームワークについて言及しました)、Pythonが最善の方法である場合は、それを学ぶことができます。
0x1ad2 2014年

Pythonは、スクレイピーを非常に簡単にします。習得も簡単です。現時点で最高のパフォーマンスを発揮するスクレーパーはスクレイピーです。彼らはまた非常に良いドキュメントを持っています。
アビシェク2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.