HTMLスクレイピング用のPythonパッケージであるBeautiful Soupを試すことを考えています。私が見るべき他のHTMLスクレイピングパッケージはありますか?Pythonは必須ではありません。実際、他の言語についても聞きたいと思っています。
これまでの話:
- パイソン
- ルビー
- 。ネット
- Perl
- ジャワ
- JavaScript
- PHP
- それらのほとんど
XPathExpression
ものを使用できます(Java 1.5以降に存在します)
HTMLスクレイピング用のPythonパッケージであるBeautiful Soupを試すことを考えています。私が見るべき他のHTMLスクレイピングパッケージはありますか?Pythonは必須ではありません。実際、他の言語についても聞きたいと思っています。
これまでの話:
XPathExpression
ものを使用できます(Java 1.5以降に存在します)
回答:
Rubyの世界でBeautiful Soupに相当するのは、why_the_lucky_stiffのHpricotです。
.NETの世界では、HTML Agility Packをお勧めします。上記のオプション(HTMLSQLなど)ほど単純ではありませんが、非常に柔軟です。整形式のHTMLを整形式のXMLであるかのように操作できるため、XPATHを使用したり、ノードを繰り返し処理したりできます。
BeautifulSoupは、HTMLスクレイピングに最適な方法です。以前の仕事で私はたくさんの削り取りをしていたので、始めたときにBeautifulSoupについて知っていればいいのに。これは、より多くの便利なオプションを備えたDOMのようなもので、より多くのpythonicです。Rubyを試してみたい場合、BeautifulSoupを移植してRubyfulSoupと呼んでいますが、しばらく更新されていません。
他の便利なツールは、標準のPythonライブラリの一部であるHTMLParserまたはsgmllib.SGMLParserです。これらは、タグを入力/終了し、HTMLテキストに遭遇するたびにメソッドを呼び出すことで機能します。あなたがそれに精通しているなら、彼らはExpatのようです。これらのライブラリは、非常に大きなファイルを解析し、DOMツリーの作成に時間がかかり、コストがかかる場合に特に役立ちます。
正規表現はあまり必要ありません。BeautifulSoupは正規表現を処理するので、その能力が必要な場合はそこで利用できます。速度とメモリフットプリントを小さくする必要がない限り、BeautifulSoupを使用すると言います。Pythonでより良いHTMLパーサーを見つけたら、私に知らせてください。
Pythonには、Beatiful Soupに加えて、HTMLスクレイピング用のいくつかのオプションがあります。他にもいくつかあります:
WWW:Mechanize
ます。ブラウザのようなオブジェクトでWebページを操作できますlibwww
。要素をトラバースおよび選択するためのさまざまなオプションをサポート(XPathやCSSの選択など)'Simple HTML DOM Parser'はPHPに適したオプションです。jQueryまたはJavaScriptセレクターに慣れている場合は、ご自宅にいるようになります。
JavaのJSOUPについてまだ誰も言及していないのはなぜですか?http://jsoup.org/
Adrian Holovaty(Djangoの名声)のtemplatemakerユーティリティは、非常に興味深いアプローチを使用します。同じページのバリエーションをフィードし、変数データの「穴」の場所を「学習」します。これはHTML固有ではないため、他のプレーンテキストコンテンツをスクレイピングするのにも適しています。プレーンテキストに変換されたPDFとHTMLにも使用しました(それぞれpdftotextとlynxを使用)。
私はスクリーンスクレーパーを知っており、気に入っています。
スクリーンスクレイパーは、ウェブサイトからデータを抽出するためのツールです。スクリーンスクレイパーは自動化します:
* 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.
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
Perlの別のオプションは、RubyのScrapiに基づくWeb :: Scraper です。簡単に言えば、簡潔で簡潔な構文により、堅牢なスクレイパーをデータ構造に直接取り込むことができます。
.NETのもう1つのツールはMhtBuilderです。
このソリューションもあります:netty HttpClient
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
ほぼ完成です。これの前に来るのは、ライブラリのインポートと私のプロキシの設定です。
.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
HTML5解析アルゴリズムの実装:html5lib(Python、Ruby)、Validator.nu HTMLパーサー(Java、JavaScript、開発中のC ++)、Hubbub(C)、Twintsam(C#、近日公開)。
私はLWPとHTML :: TreeBuilderをPerlで使用しており、非常に便利であることがわかりました。
LWP(libwww-perlの略)を使用すると、Webサイトに接続してHTML を取得できます。ここでモジュールを取得できます。O'Reillyの本は、ここでオンラインのようです。
TreeBuilderを使用すると、HTMLからツリーを構築できます。ドキュメントとソースは、HTML :: TreeBuilder-HTML構文ツリーを構築するパーサーで利用できます。
ただし、このアプローチのようなことを行うには、あまりにも多くの作業が必要になる場合があります。私は別の回答で提案されているMechanizeモジュールをまだ見ていません。
まあ、もしあなたがjcrawl.comを持っているブラウザだけを使ってクライアント側からそれをしたいなら。Webアプリケーション(http://www.jcrawl.com/app.html)からスクラップサービスを設計したら、生成されたスクリプトをHTMLページに追加するだけで、データの使用/表示を開始できます。
すべての廃棄ロジックは、JavaScriptを介してブラウザーで発生します。お役に立てれば幸いです。このリンクをクリックすると、Yahooテニスから最新のニュースを抽出するライブ例が表示されます。
あなたはおそらくすでにたくさん持っていますが、私はこれがあなたがやろうとしていることだと思います:
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")
もともとChris Lovettによって開始され、MindTouchによって更新されたように見えるSgmlReaderを使用して.NETで結果を混合しました。
GoogleスプレッドシートのImportXML(URL、XPath)関数が好きです。
XPath式が複数の値を返す場合、列の下のセルを繰り返します。
importxml()
1つのスプレッドシートに最大50の関数を含めることができます。
RapidMinerのWebプラグインも非常に使いやすいです。投稿を行い、Cookieを受け入れ、ユーザーエージェントを設定できます。