HTMLスクレイピングのオプションは?[閉まっている]
-
08-06-2019 - |
質問
試してみようと思っています 美しいスープ, 、HTML スクレイピング用の Python パッケージ。他に検討すべき HTML スクレイピング パッケージはありますか?Python は必須ではありません。実際、他の言語についても聞くことに興味があります。
これまでの話:
- パイソン
- ルビー
- 。ネット
- パール
- ジャワ
- JavaScript
- PHP
- それらのほとんどは
解決
Ruby の世界で Beautiful Soup に相当するのは、why_the_lucky_stiff です。 プリコット.
他のヒント
.NET の世界では、HTML Agility Pack をお勧めします。上記のオプション (HTMLSQL など) ほど単純ではありませんが、非常に柔軟です。これにより、整形式の XML であるかのように、整形式の HTML を操作できるため、XPATH を使用したり、単にノードを反復処理したりすることができます。
BeautifulSoup は HTML スクレイピングに最適な方法です。前職ではスクレイピングをたくさん行っていたので、仕事を始めたときに BeautifulSoup について知っていればよかったと思います。これは、より多くの便利なオプションを備えた DOM に似ており、より Python 的です。Ruby を試してみたい場合は、RubyfulSoup という名前で BeautifulSoup が移植されましたが、しばらく更新されていません。
その他の便利なツールとしては、標準 Python ライブラリの一部である HTMLParser または sgmllib.SGMLParser があります。これらは、タグを入力または終了し、HTML テキストに遭遇するたびにメソッドを呼び出すことによって機能します。よく知っている人にとっては、彼らは海外駐在員のようなものです。これらのライブラリは、非常に大きなファイルを解析する予定があり、DOM ツリーの作成に時間がかかりコストがかかる場合に特に役立ちます。
正規表現はあまり必要ありません。BeautifulSoup は正規表現を処理するため、その機能が必要な場合はそれを利用できます。速度とメモリ使用量を小さくする必要がない限り、BeautifulSoup を使用することをお勧めします。Python でより優れた HTML パーサーを見つけたら、私に知らせてください。
見つけました HTMLSQL スクリーンスクレイピングを行うための非常に簡単な方法です。結果が得られるまでに文字通り数分かかります。
クエリは非常に直感的です。次のようなものです。
SELECT title from img WHERE $class == 'userpic'
現在、同じアプローチをとる他の代替手段がいくつかあります。
パイソン lxml ライブラリは、libxml2 ライブラリと libxslt ライブラリの Python バインディングとして機能します。特に XPath サポートとメモリ内の XML 構造のきれいな出力が気に入っています。壊れた HTML の解析もサポートしています。そして、lxml よりも速く XML を解析する Python ライブラリ/バインディングは他に見つからないと思います。
Perl の場合は、WWW::Mechanize があります。
Python には、Beatiful Soup に加えて、HTML スクレイピング用のオプションがいくつかあります。他にも次のようなものがあります。
- 機械化する:パールに似ている
WWW:Mechanize
. 。Web ページと対話するためのブラウザーのようなオブジェクトを提供します - lxml:Python バインディング
libwww
. 。要素を走査して選択するためのさまざまなオプションをサポートします (例: XPath および CSS の選択) - 擦り傷:テンプレートを使用して HTML から情報を抽出する高レベルのライブラリ。
- パイクエリ:XML ドキュメントに対して jQuery のようなクエリを作成できます。
- こすれた:高レベルのスクレイピングおよび Web クローリング フレームワーク。スパイダーの作成、データマイニング、監視および自動テストに使用できます。
「Simple HTML DOM Parser」は PHP に適したオプションです。jQuery または JavaScript セレクターに慣れている場合は、すぐに使いこなせるでしょう。
Java についてまだ JSOUP について誰も言及していないのはなぜですか? http://jsoup.org/
の テンプレートメーカー Adrian Holovaty のユーティリティ ( ジャンゴ fame) は非常に興味深いアプローチを使用しています。同じページのバリエーションをフィードすると、変数データの「穴」がどこにあるかを「学習」します。これは HTML 固有ではないため、他のプレーンテキスト コンテンツをスクレイピングするのにも適しています。私はこれを、プレーンテキストに変換された PDF と HTML にも使用しました (それぞれ pdftotext と lynx を使用)。
まず、問題のサイトが、必要なデータにアクセスするための API サーバーまたは RSS フィードを提供しているかどうかを調べます。
私は知っていますし、愛しています スクリーンスクレーパー.
Screen-Scraper は、Web サイトからデータを抽出するためのツールです。Screen-Scraper は以下を自動化します。
* 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.
Perl の別のオプションは次のとおりです ウェブ::スクレーパー これはRubyに基づいています スクラピ. 。一言で言えば、優れた簡潔な構文を使用すると、堅牢なスクレイパーをデータ構造に直接取得できます。
スタック オーバーフローのスクレイピングは、次の場合に特に簡単です。 靴 そして プリコット.
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
私はある程度の成功を収めてきました HTMLユニット, 、Javaでは。これは、Web UI で単体テストを作成するためのシンプルなフレームワークですが、HTML スクレイピングにも同様に役立ちます。
.NET 用の別のツールは次のとおりです。 MhtBuilder
こんな解決策もあります: nettyHTTPクライアント
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
かなり完成しました。これより前に行うのは、ライブラリのインポートとプロキシの設定だけです。
私は Python で Beautiful Soup をよく使用しました。これは、正規表現チェックよりもはるかに優れています。 ドム, HTML の形式が正しくない場合でも。正規表現よりも単純な構文を使用して、HTML タグとテキストをすばやく検索できます。要素を見つけたら、その要素とその子を反復処理できます。これは、正規表現を使用するよりもコードの内容を理解するのに役立ちます。私が何年も前にスクリーンスクレイピングをたくさんしなければならなかったときに、Beautiful Soup があればよかったのにと思います。人々が検証を始める前の HTML 構造は貧弱だったため、これがあれば多くの時間と頭痛の種を節約できただろうにと思います。
のために設計されたにもかかわらず、 。ネット ウェブテスト、私はこれを使用してきました ワティン この目的のためのフレームワーク。DOM ベースであるため、HTML、テキスト、または画像をキャプチャするのは非常に簡単です。最近、これを使用してリンクのリストをダンプしました。 メディアウィキ Excel スプレッドシートへの All Pages 名前空間クエリ。次の 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++ 開発中)、 大騒ぎ (C)、 ツインザム (C#;今後)。
Perl を使わないのは愚か者です。ここに炎が来ます..
次のモジュールを骨抜きにし、周囲の削り取りを行います。
use LWP
use HTML::TableExtract
use HTML::TreeBuilder
use HTML::Form
use Data::Dumper
利用した LWP そして HTML::ツリービルダー Perl を使用しており、非常に便利であることがわかりました。
LWP (libwww-perl の略) を使用すると、Web サイトに接続して HTML をスクレイピングできます。 ここでモジュールを入手できます そしてオライリーの本 ここでオンラインになっているようです.
TreeBuilder を使用すると、HTML からツリーを構築できます。 ドキュメントとソースは次の場所で入手できます。 HTML::TreeBuilder - HTML 構文ツリーを構築するパーサー.
ただし、このようなアプローチにはまだ面倒な作業が多すぎる可能性があります。見ていない 機械化モジュール 別の回答で提案されているので、そうするかもしれません。
Javaでは、次のように使用できます。 タグスープ.
さて、あなたが持っているブラウザだけを使用してクライアント側からそれを実行したい場合は、 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")
私は Google スプレッドシートの ImportXML(URL, XPath) 関数が好きです。
XPath 式が複数の値を返す場合、列の下のセルを繰り返します。
最大50個まで持つことができます importxml()
1 つのスプレッドシート上で関数を実行できます。
RapidMiner の Web プラグインも非常に使いやすいです。投稿を行ったり、Cookie を受け入れたり、 ユーザーエージェント.
Aptana の Jaxer + jQuery を使用してページを解析することにも大きな成功を収めました。本質的にはそれほど高速でも「スクリプト的」でもありませんが、jQuery セレクター + 本物の JavaScript/DOM は、より複雑な (または不正な) ページの命の恩人です。