web-dev-qa-db-ja.com

Webサイトからデータを削除する最善の方法は何ですか?

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

Webページのスクレイピングやデータセットの構築にクリックアンドゴー機能を提供する、 Import.io という便利なサードパーティ製ツールを見つけました。購読プランを購読したい.

この会社はWebページをこすってデータセットを作成するのにどのようなテクニックを使っていますか?私はいくつかのWebスクレイピングフレームワークを見つけました pjscrapeScrapy それらはそのような機能を提供できますか

107
0x1ad2

あなたは間違いなく良いWebスクレイピングフレームワークから始めたいと思うでしょう。後であなたはそれらがあまりにも制限的であると決めるかもしれません、そしてあなたはあなた自身のライブラリのスタックをまとめることができますがあなたの設計はpjscrapeまたはscrapyよりはるかに悪いでしょう。

注:ここでは、クロールとスクレイピングという用語を基本的に同じ意味で使用しています。これはあなたのQuoraの質問に対する私の答えのコピーです、それはかなり長いです。

ツール

お使いのブラウザに応じて、FirebugまたはChromeの開発ツールに精通してください。データを取得しているサイトを閲覧し、探しているデータが含まれているURLと応答を構成しているデータ形式を特定するために、これは絶対に必要です。

あなたは、HTMLだけでなくHTTPについての実用的な知識が必要であり、おそらくミドルプロキシソフトウェアの中で適当な人を見つけたいと思うでしょう。あなたは、HTTPリクエストとHTTPレスポンスを調べ、クッキーとセッション情報とクエリパラメータがどのように受け渡されているかを理解できる必要があります。 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を解析するために正規表現を使用しないでください。彼らはすでに正規表現に精通しているので初心者の多くはこれを行います。これは大きな間違いです。htmlをナビゲートするにはxpathまたはcssセレクターを使用し、htmlノード内の実際のテキストからデータを抽出するには正規表現のみを使用してください。これはすでにあなたには明白であるかもしれません、あなたがそれを試すとすぐに明白になりますが、多くの人々は何らかの理由でこの道を進むのに多くの時間を浪費します。 xpathやcssセレクタを怖がってはいけません。正規表現よりも習得が簡単で、この問題を解決するように設計されています。

Javascriptが多いサイト

昔は、httpリクエストをしてHTMLレスポンスを解析するだけでした。これで、ほぼ確実に、標準のHTML HTTPリクエスト/レスポンスと、ターゲットサイトのJavaScript部分によって行われた非同期HTTPコールが混在しているサイトを処理する必要があります。これがあなたのプロキシソフトウェアとfirebug/devtoolsのネットワークタブがとても便利になるところです。これらへの応答はhtmlかjsonかもしれませんが、まれにxmlか何か他のものになるでしょう。

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

低レベルのアプローチ:

あなたは、AjaxがサイトのJavascriptを呼び出しているのか、それらの応答がどのように見えるのかを把握し、それらを同じように要求することができます。そのため、 http://example.com/foobar からHTMLを取得して1つのデータを抽出してから http://example.com/)からjsonレスポンスを取得する必要があります。 api/baz?foo = b ...もう一方のデータを取得します。正しいCookieまたはセッションパラメータを渡すことに注意する必要があります。それは非常に稀ですが、時折ajax呼び出しに必要ないくつかのパラメータはサイトのjavascriptで行われたいくつかの狂った計算の結果になるでしょう、リバースエンジニアリングこれは面倒かもしれません。

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

HTMLにはどのようなデータがあり、Ajax呼び出しからどのようなデータが入ってくるのかを判断する必要があるのはなぜですか。そのセッションとCookieデータをすべて管理しますか?あなたがサイトを閲覧するときあなたがする必要はありません、ブラウザとサイトジャバスクリプトはそれをします。それがポイントです。

Phantomjsのようなヘッドレスブラウザエンジンにページをロードするだけの場合は、そのページがロードされます。javascriptを実行し、すべてのajax呼び出しが完了したことを通知します。適切なクリックをトリガーするために必要な場合、または適切なデータをロードするためにサイトのJavaScriptをトリガーするために必要なものであれば、独自のJavaScriptを注入することができます。

これで2つの選択肢があります。完成したHTMLを吐き出して解析するか、解析とデータのフォーマットを行い、データを吐き出す(おそらくjsonフォーマットの)ページにJavaScriptを挿入することです。これら2つのオプションを自由に組み合わせることもできます。

どちらのアプローチが一番いいですか?

それは、あなたが確かに低レベルのアプローチに精通し、快適になる必要があるでしょう、それは依存します。組み込みブラウザのアプローチはどんな場合でもうまくいきます。実装がはるかに簡単になり、スクレイピングにおける最も厄介な問題のいくつかが解消されます。それはまたあなたが理解する必要があるであろう機械のかなり複雑な部分です。 HTTPリクエストとレスポンスだけではなく、リクエスト、埋め込みブラウザのレンダリング、サイトのjavascript、インジェクトされたjavascript、独自のコード、そして埋め込まれたブラウザプロセスとの双方向の対話などです。

組み込みブラウザもレンダリングのオーバーヘッドのためにスケールが非常に遅くなりますが、それはあなたが多くの異なるドメインを削り取っているのでなければ、ほとんど間違いなく問題にならないでしょう。リクエストをレート制限する必要がある場合、単一ドメインの場合、レンダリング時間は完全に無視できるほどになります。

レート制限/ボットの動作

あなたはこれをよく知っておく必要があります。あなたは、妥当な速度であなたのターゲットドメインにリクエストをする必要があります。 Webサイトをクロールするときは、正常に動作するボットを作成する必要があります。つまり、robots.txtを尊重し、サーバーを要求に晒さないでください。ここでの間違いや過失は、サービス拒否攻撃と見なすことができるので非常に非倫理的です。許容可能なレートはあなたが尋ねる人によって異なります、1req/sはGoogleクローラが動作する最大ですが、あなたはGoogleではなく、あなたはおそらくGoogleほど歓迎されていません。合理的な限り遅くしてください。各ページリクエストの間隔は2〜5秒です。

あなたのボットを識別するユーザーエージェント文字列であなたの要求を識別し、それが目的を説明しているあなたのボットのためのウェブページを持ってください。このURLはエージェント文字列に入ります。

サイトがあなたをブロックしたい場合は、ブロックしやすいでしょう。彼らの最後のスマートエンジニアは簡単にボットを識別することができ、彼らの最後の数分の作業はあなたの端のあなたのスクレイピングコードを変更する何週間もの作業を引き起こすか単にそれを不可能にすることができます。その関係が敵対的であれば、ターゲットサイトの賢いエンジニアは、クローラを書いている天才エンジニアを完全に悩ませることができます。スクレイピングコードは本質的に脆弱であり、これは簡単に悪用されます。この反応を誘発するものは、とにかくほぼ確実に非倫理的なものなので、行儀の良いボットを書いて、これについて心配しないでください。

テスト

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

現代のウェブサイトをこすることに関与する動く部分がたくさんあります、良いテストプラクティスは大いに役立ちます。この種のコードを書いている間に遭遇するバグの多くは、単に破損したデータを黙って返すタイプです。回帰をチェックするための良いテストがなければ、あなたは気付かずにしばらくの間あなたのデータベースに役に立たない壊れたデータを保存してきたことがわかります。このプロジェクトは、データの検証(使用するのに適したライブラリをいくつか見つける)とテストに非常に慣れ親しむでしょう。包括的なテストを必要とすることとテストするのが非常に困難であることを兼ね備えた他の多くの問題はありません。

テストの2番目の部分はキャッシュと変更検出です。あなたのコードを書いている間、あなたは同じページのために何度も何度も何度もサーバを叩いていたくはありません。単体テストを実行している間、コードを壊したため、またはWebサイトが再設計されたためにテストが失敗したかどうかを知りたいです。キャッシュされたURLのコピーに対してユニットテストを実行します。キャッシュプロキシはここでは非常に便利ですが、適切に設定して使用するには注意が必要です。

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

法的問題

あなたがばかなことをするならば、ここの法律はわずかに危険である場合があります。法律が関係するならば、あなたはwgetとcurlを「ハッキングツール」と定期的に呼ぶ人々を扱っています。あなたはこれが欲しくないです。

状況の倫理的な現実は、ブラウザソフトウェアを使用してURLを要求してデータを確認することと、独自のソフトウェアを使用してURLを要求してデータを確認することとの間に違いがないことです。グーグルは世界最大のスクラップ会社であり、彼らはそれに愛されています。ユーザーエージェントであなたのボットの名前を識別し、あなたのウェブクローラーの目的と意図についてオープンであることは法律がGoogleが何であるかを理解しているのでここで役に立ちます。偽のユーザーアカウントを作成したり、サイトの不適切な場所にアクセスしたり(robots.txtによって "ブロック"されたり、何らかの権限の悪用のために)されたりするなど、怪しげなことをしている場合そして法律の技術の無知はここでは非常に危険です。ばかげた状況ですが、本当の状況です。

文字通り、立派な市民として新しい検索エンジンを立ち上げようと試みること、あなたのソフトウェアに間違いを犯すこと、またはバグを抱えてハッカーとして見られることは可能です。現在の政治的現実を考慮してほしいものではありません。

とにかく、この巨大なテキストの壁を書くのは誰ですか?

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

私は大規模なクロール/スクレイピングシステムを2回作成しました。1回はメディア会社の大規模チーム用(Perl)、そして最近は検索エンジンスタートアップのCTOとしての小規模チーム用(Python/Javascript)です。私は現在Clojure/Clojurescript(一般的には素晴らしい専門家言語で、クローラ/スクレーパーの問題を喜ばせるライブラリを持っています)でコーディングしているコンサルタントとして働いています。

私は同様に成功したクロール防止ソフトウェアシステムを書いた。あなたがしたくない、またはあなたが気に入らないSabotageボットを識別したい場合は、非常に難解なサイトを書くことは非常に簡単です。

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

265
Jesse Sherlock

はい、あなたはそれを自分ですることができます。それは単にページのソースをつかみ、あなたが望むようにそれらを解析することの問題です。

さまざまな可能性があります。良い組み合わせは、 python-requests (Python 3ではurllib2の上に構築されていて、urllib.requestです)と 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

21
Ehvince