HTMLスクレイピングのオプション?[閉まっている]


406

HTMLスクレイピング用のPythonパッケージであるBeautiful Soupを試すことを考えています。私が見るべき他のHTMLスクレイピングパッケージはありますか?Pythonは必須ではありません。実際、他の言語についても聞きたいと思っています。

これまでの話:



タグスープリンクが停止しています。
Tapper7

HtmlUnitは、Javaブラウザーの完全な実装であり、パーツに分解することはできません(htmlページだけをダウンロードてスクレイプすることはできません。参照されたすべてのファイルをダウンロードし、スクリプトを実行します)。そのため、ここに属しているとは思いません。
マークジェロニムス

Stock Javaは、XPath式を使用してHTMLを処理できますが、問題がないわけではありません。パーサーパーツ(DocumentBuilder)は、正しくないHTMLをチョークし、100%正しいHTMLは、実際にはWebでは非常にまれです。したがって、パーサーをJTidyに置き換えるのが好きです。XPathについては、Java独自のXPathExpressionものを使用できます(Java 1.5以降に存在します)
Mark Jeronimus

回答:



44

.NETの世界では、HTML Agility Packをお勧めします。上記のオプション(HTMLSQLなど)ほど単純ではありませんが、非常に柔軟です。整形式のHTMLを整形式のXMLであるかのように操作できるため、XPATHを使用したり、ノードを繰り返し処理したりできます。

http://www.codeplex.com/htmlagilitypack


2
linqとそれを組み合わせると、HTMLSQLのように見えますか?
Bless Yahu

3
SharpQueryを組み合わせると、jQueryのようになります。code.google.com/p/sharp-query
mpen

1
HTML Agility Packは、私が試した多数のHTMLドキュメントのDOMを正しく構成できません。
アッシュベルリン-テイラー

37

BeautifulSoupは、HTMLスクレイピングに最適な方法です。以前の仕事で私はたくさんの削り取りをしていたので、始めたときにBeautifulSoupについて知っていればいいのに。これは、より多くの便利なオプションを備えたDOMのようなもので、より多くのpythonicです。Rubyを試してみたい場合、BeautifulSoupを移植してRubyfulSoupと呼んでいますが、しばらく更新されていません。

他の便利なツールは、標準のPythonライブラリの一部であるHTMLParserまたはsgmllib.SGMLParserです。これらは、タグを入力/終了し、HTMLテキストに遭遇するたびにメソッドを呼び出すことで機能します。あなたがそれに精通しているなら、彼らはExpatのようです。これらのライブラリは、非常に大きなファイルを解析し、DOMツリーの作成に時間がかかり、コストがかかる場合に特に役立ちます。

正規表現はあまり必要ありません。BeautifulSoupは正規表現を処理するので、その能力が必要な場合はそこで利用できます。速度とメモリフットプリントを小さくする必要がない限り、BeautifulSoupを使用すると言います。Pythonでより良いHTMLパーサーを見つけたら、私に知らせてください。



19

Python lxmlライブラリーは、libxml2およびlibxsltライブラリーのPythonicバインディングとして機能します。特に、XPathのサポートとインメモリXML構造のプリティプリントが気に入っています。また、壊れたHTMLの解析もサポートします。そして、lxmlよりも速くXMLを解析する他のPythonライブラリ/バインディングを見つけることができないと思います。



16

Pythonには、Beatiful Soupに加えて、HTMLスクレイピング用のいくつかのオプションがあります。他にもいくつかあります:

  • mechanize:perlに似ていWWW:Mechanizeます。ブラウザのようなオブジェクトでWebページを操作できます
  • lxml:へのPythonバインディングlibwww。要素をトラバースおよび選択するためのさまざまなオプションをサポート(XPathやCSSの選択など)
  • scrapemark:テンプレートを使用してHTMLから情報を抽出する高レベルのライブラリ。
  • pyquery:XMLドキュメントに対するクエリのようなjQueryを作成できます。
  • scrapy:高レベルのスクレイピングおよびWebクロールフレームワーク。スパイダーの作成、データマイニング、監視および自動テストに使用できます。

1
Python標準ライブラリにはHTMLパーサーが組み込まれています...なぜそれを使用しないのですか?docs.python.org/2.7/library/htmlparser.html
ArtOfWarfare 2015



11

Adrian Holovaty(Djangoの名声)のtemplatemakerユーティリティは、非常に興味深いアプローチを使用します。同じページのバリエーションをフィードし、変数データの「穴」の場所を「学習」します。これはHTML固有ではないため、他のプレーンテキストコンテンツをスクレイピングするのにも適しています。プレーンテキストに変換されたPDFとHTMLにも使用しました(それぞれpdftotextとlynxを使用)。


大きなHTMLページでtemplatemakerをどのように機能させましたか?些細なことをしないとクラッシュすることがわかりました。
hoju

大きなHTMLページがなかったと思います。code.google.com/p/templatemaker/issues/listには、その問題について報告されている問題は存在しないようです。そのため、そこにテストケースを送信するのがおそらく適切です。エイドリアンがライブラリを維持しているようには見えません。彼はきっとたくさんの削り取りをしているので、彼が最近EveryBlockで何を使っているのだろう。
akaihola

10

私はスクリーンスクレーパーを知っており、気に入っています。

スクリーンスクレイパーは、ウェブサイトからデータを抽出するためのツールです。スクリーンスクレイパーは自動化します:

* Clicking links on websites
* Entering data into forms and submitting
* Iterating through search result pages
* Downloading files (PDF, MS Word, images, etc.)

一般的な用途:

* Download all products, records from a website
* Build a shopping comparison site
* Perform market research
* Integrate or migrate data

テクニカル:

* Graphical interface--easy automation
* Cross platform (Linux, Mac, Windows, etc.)
* Integrates with most programming languages (Java, PHP, .NET, ASP, Ruby, etc.)
* Runs on workstations or servers

スクリーンスクレイパーの3つのエディション:

* Enterprise: The most feature-rich edition of screen-scraper. All capabilities are enabled.
* Professional: Designed to be capable of handling most common scraping projects.
* Basic: Works great for simple projects, but not nearly as many features as its two older brothers.

残念ながらBasicバージョンでさえFOSSではありません。ビールのように無料だけのようです。
Andreas Kuckartz 14

9

まず、問題のサイトが、必要なデータにアクセスするためのAPIサーバーまたはRSSフィードを提供しているかどうかを確認します。


8

Stack Overflowのスクレイピングは、ShoesおよびHpricotを使用すると特に簡単です

require 'hpricot'

Shoes.app :title => "Ask Stack Overflow", :width => 370 do
  SO_URL = "http://stackoverflow.com"
  stack do
    stack do
      caption "What is your question?"
      flow do
        @lookup = edit_line "stackoverflow", :width => "-115px"
        button "Ask", :width => "90px" do
          download SO_URL + "/search?s=" + @lookup.text do |s|
            doc = Hpricot(s.response.body)
            @rez.clear()
            (doc/:a).each do |l|
              href = l["href"]
              if href.to_s =~ /\/questions\/[0-9]+/ then
                @rez.append do
                  para(link(l.inner_text) { visit(SO_URL + href) })
                end
              end
            end
            @rez.show()
          end
        end
      end
    end
    stack :margin => 25 do
      background white, :radius => 20
      @rez = stack do
      end
    end
    @rez.hide()
  end
end

8

Perlの別のオプションは、RubyのScrapiに基づくWeb :: Scraper です。簡単に言えば、簡潔で簡潔な構文により、堅牢なスクレイパーをデータ構造に直接取り込むことができます。


7

JavaではHtmlUnitである程度成功しました。これは、Web UIで単体テストを作成するためのシンプルなフレームワークですが、HTMLスクレイピングにも同様に役立ちます。


また、必要に応じてJavaScriptの実行を評価するために使用することもできます:)
David




5

RubyではHpricotを使用しています。例として、これは私がHireThingsアカウントの6ページからすべての本のタイトルを取得するために使用するコードのスニペットです(この情報を1つのページに提供していないようです)。

pagerange = 1..6
proxy = Net::HTTP::Proxy(proxy, port, user, pwd)
proxy.start('www.hirethings.co.nz') do |http|
  pagerange.each do |page|
    resp, data = http.get "/perth_dotnet?page=#{page}" 
    if resp.class == Net::HTTPOK
      (Hpricot(data)/"h3 a").each { |a| puts a.innerText }
    end
  end
end 

ほぼ完成です。これの前に来るのは、ライブラリのインポートと私のプロキシの設定です。


5

PythonでBeautiful Soupをよく使用しました。HTMLの形式が適切でない場合でも、DOMを使用するように機能するため、正規表現チェックよりもはるかに優れています。正規表現よりも単純な構文でHTMLタグとテキストをすばやく見つけることができます。要素を見つけたら、その要素とその子を反復処理できます。これは、正規表現よりもコードの内容を理解するのに役立ちます。ビューティフルスープが何年も前にスクリーンスクレイピングを何度も行わなければならなかったといいのですが、HTML構造があまりにも貧弱で、人々が検証を始める前に、時間と頭痛を大幅に節約できたでしょう。


5

.NET Webテスト用に設計されていますが、私はこの目的のためにWatiNフレームワークを使用しています。DOMベースであるため、HTML、テキスト、画像のキャプチャは非常に簡単です。最近、MediaWiki All Pages名前空間クエリからのリンクのリストをExcelスプレッドシートにダンプするためにそれを使用しました。次のVB.NETコードの断片はかなり粗雑ですが、機能します。


Sub GetLinks(ByVal PagesIE As IE, ByVal MyWorkSheet As Excel.Worksheet)

    Dim PagesLink As Link
    For Each PagesLink In PagesIE.TableBodies(2).Links
        With MyWorkSheet
            .Cells(XLRowCounterInt, 1) = PagesLink.Text
            .Cells(XLRowCounterInt, 2) = PagesLink.Url
        End With
        XLRowCounterInt = XLRowCounterInt + 1
    Next
End Sub


3

あなたはPerlを使わないのはばかでしょう。

次のモジュールに骨組みを入れ、周りを削ってください。

use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper

3

私はLWPHTML :: TreeBuilderをPerlで使用しており、非常に便利であることがわかりました。

LWP(libwww-perlの略)を使用すると、Webサイトに接続してHTML を取得できます。ここモジュールを取得できます。O'Reillyの本は、ここでオンラインのようです

TreeBuilderを使用すると、HTMLからツリーを構築できます。ドキュメントとソースは、HTML :: TreeBuilder-HTML構文ツリーを構築するパーサーで利用できます

ただし、このアプローチのようなことを行うには、あまりにも多くの作業が必要になる場合があります。私は別の回答で提案されているMechanizeモジュールをまだ見ていません。



3

まあ、もしあなたがjcrawl.comを持っているブラウザだけを使ってクライアント側からそれをしたいなら。Webアプリケーション(http://www.jcrawl.com/app.html)からスクラップサービスを設計したら、生成されたスクリプトをHTMLページに追加するだけで、データの使用/表示を開始できます。

すべての廃棄ロジックは、JavaScriptを介してブラウザーで発生します。お役に立てれば幸いです。このリンクをクリックすると、Yahooテニスから最新のニュースを抽出するライブ例が表示されます。


2

あなたはおそらくすでにたくさん持っていますが、私はこれがあなたがやろうとしていることだと思います:

from __future__ import with_statement
import re, os

profile = ""

os.system('wget --no-cookies --header "Cookie: soba=(SeCreTCODe)" http://stackoverflow.com/users/30/myProfile.html')
with open("myProfile.html") as f:
    for line in f:
        profile = profile + line
f.close()
p = re.compile('summarycount">(\d+)</div>') #Rep is found here
print p
m = p.search(profile)
print m
print m.group(1)
os.system("espeak \"Rep is at " + m.group(1) + " points\""
os.remove("myProfile.html")


2

GoogleスプレッドシートのImportXML(URL、XPath)関数が好きです。

XPath式が複数の値を返す場合、列の下のセルを繰り返します。

importxml()1つのスプレッドシートに最大50の関数を含めることができます。

RapidMinerのWebプラグインも非常に使いやすいです。投稿を行い、Cookieを受け入れ、ユーザーエージェントを設定できます


2

また、AptanaのJaxer + jQueryを使用してページを解析することで大きな成功を収めました。それは本質的に高速または「スクリプトのような」ものではありませんが、jQueryセレクター+実際のJavaScript / DOMは、より複雑な(または不正な)ページでの命の恩人です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.