スクリーンスクレイピングに関する良いチュートリアルを教えてください。私の大学が各クラスのすべてのデータをアップロードするために使用する Web ページがあります。サイトのホームページにアクセスするには、ログイン ボタンのあるエントリ画面があります。押すと、ユーザー名とパスワードを求めるフローティング ダイアログが表示されます。すると、そのままホームページに飛べます。承認を要求している場所がわからず、プログラムでサイトからデータを取得できるようにしたいと考えています。私が必要とするデータは、ログインを含むさらに多くの画面を通過しますが、ID とパスワードを使用してこの最初の画面を通過できれば、十分満足です。できればJavaでこれが欲しいのですが、どの言語でも構いません
1 に答える
これは、ログイン ダイアログが元のページの一部ではなく、おそらく Ajax 呼び出しによって JavaScript によってその場で構築されているように思えます。
必要なのは、javaScript と Ajax をサポートするある種のヘッドレス ブラウザです。
はじめに、HtmlUnit (http://htmlunit.sourceforge.net/)をご覧ください。
HtmlUnit は「Java プログラム用の GUI レス ブラウザ」です。HTML ドキュメントをモデル化し、「通常の」ブラウザで行うのと同じように、ページの呼び出し、フォームへの入力、リンクのクリックなどを可能にする API を提供します。
かなり優れた JavaScript サポート (常に改善されています) があり、非常に複雑な AJAX ライブラリでも動作し、使用する構成に応じて Firefox または Internet Explorer のいずれかをシミュレートできます。
編集:ここに例があります:
スキャンしたいページ (http://qub.ac.uk/qol/) は基本認証を使用しているため、ポップアップする HTML 入力フォームではなく、ブラウザのダイアログであることに気付きました。スタート ページの [ログイン] ボタンを押すとhttps://qub.ac.uk/qol/
、そのように保護されたページが読み込まれます。
http://qub.ac.uk/qol/
テストのために、HtmlUnit を使用してセキュリティで保護されていないページから見出しを取得する方法のみを示します。もちろん、秘密の部分にはアクセスできないためです。
一般的にどのように機能するかを明確にする必要があると思います。HtmlUnit API の使用方法の詳細については、Web 上の優れたドキュメントやその他のリソースを参照してください。
package test;
import java.io.IOException;
import java.net.MalformedURLException;
import javax.xml.bind.DatatypeConverter;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.DomElement;
import com.gargoylesoftware.htmlunit.html.DomNodeList;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
public class Scraper {
public static void main(String[] args)
throws FailingHttpStatusCodeException, MalformedURLException,
IOException {
WebClient webClient = new WebClient();
String username = "user";
String password = "pw";
String authString = username + ":" + password;
String authEncoded = DatatypeConverter.printBase64Binary(authString
.getBytes());
webClient.addRequestHeader("Authorization", "Basic " + authEncoded);
HtmlPage page = webClient.getPage("http://qub.ac.uk/qol/");
// System.out.println(page.asXml());
DomNodeList<DomElement> headings = page.getElementsByTagName("h3");
for (DomElement e : headings) {
System.out.println("Got heading: " + e.getTextContent());
}
}
}