実験用にJavaベースのWebクローラーを作成したいと思いました。Java時間ですが、2つの重要な質問があります。
プログラムはどのようにWebページに「アクセス」または「接続」しますか?簡単な説明をお願いします。 (ハードウェアからソフトウェアまでの抽象化のレイヤーの基本を理解しています。ここではJava抽象化)に興味があります)
どのライブラリを使用すればよいですか? Webページに接続するためのライブラリ、HTTP/HTTPSプロトコル用のライブラリ、およびHTML解析用のライブラリが必要だと思います。
これは、プログラムがWebページに「アクセス」または「接続」する方法です。
URL url;
InputStream is = null;
DataInputStream dis;
String line;
try {
url = new URL("http://stackoverflow.com/");
is = url.openStream(); // throws an IOException
dis = new DataInputStream(new BufferedInputStream(is));
while ((line = dis.readLine()) != null) {
System.out.println(line);
}
} catch (MalformedURLException mue) {
mue.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
is.close();
} catch (IOException ioe) {
// nothing to see here
}
}
これは、htmlページのソースをダウンロードします。
HTML解析については this を参照してください
コンテンツの解析には Apache Tika を使用しています。
私はcrawler4jを好みます。 Crawler4jは、オープンソースのJavaクローラーで、Webをクロールするためのシンプルなインターフェースを提供します。数時間でマルチスレッドWebクローラーをセットアップできます。
HttpClientライブラリ を使用することをお勧めします。あなたは例を見つけることができます ここ 。
私は誰も言及しないことを提案する別の解決策を考え出します。 Selenum というライブラリがあります。これは、テスト目的でWebアプリケーションを自動化するために使用されるオープンソースの自動化テストツールですが、これだけに限定されません。人間が行うのと同じように、Webクローラーを作成して、この自動化テストツールを利用できます。
実例として、私はそれがどのように機能するかをよりよく理解するための簡単なチュートリアルを提供します。この投稿を読んで退屈している場合は、こちらをご覧ください Video このライブラリがWebページをクロールするために提供できる機能を理解してください。
はじめにSeleniumは、独自のプロセスで共存し、Javaプログラムでアクションを実行するさまざまなコンポーネントで構成されています。このメインコンポーネントはWebdriverと呼ばれ、作成するためにプログラムに含める必要があります。正常に動作しています。
次の site にアクセスして、お使いのコンピューターのOS(Windows、Linux、またはMacOS)の最新リリースをダウンロードしてください。これは、chromedriver.exeを含むZipアーカイブです。コンピューターに保存し、C:\ WebDrivers\User\chromedriver.exeのように便利な場所に展開します。この場所は後で使用しますJavaプログラム。
次のステップは、jarライブラリーをインクルードすることです。 Mavenプロジェクトを使用してJava programmをビルドしていると仮定すると、pom.xmlにfollow依存関係を追加する必要があります
<dependency>
<groupId>org.seleniumhq.Selenium</groupId>
<artifactId>Selenium-Java</artifactId>
<version>3.8.1</version>
</dependency>
Seleniumから始めましょう。最初のステップは、ChromeDriverインスタンスを作成することです。
System.setProperty("webdriver.chrome.driver", "C:\WebDrivers\User\chromedriver.exe);
WebDriver driver = new ChromeDriver();
次の例は、Webページを開き、いくつかの有用なHtmlコンポーネントを抽出する単純なプログラムを示しています。手順をわかりやすく説明するコメントが付いているのでわかりやすい。オブジェクトをキャプチャする方法を理解するために簡単に見てください
//Launch website
driver.navigate().to("http://www.calculator.net/");
//Maximize the browser
driver.manage().window().maximize();
// Click on Math Calculators
driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();
// Click on Percent Calculators
driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();
// Enter value 10 in the first number of the percent Calculator
driver.findElement(By.id("cpar1")).sendKeys("10");
// Enter value 50 in the second number of the percent Calculator
driver.findElement(By.id("cpar2")).sendKeys("50");
// Click Calculate Button
driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr[2]/td/input[2]")).click();
// Get the Result Text based on its xpath
String result =
driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/font/b")).getText();
// Print a Log In message to the screen
System.out.println(" The Result is " + result);
作業が終了したら、ブラウザウィンドウを次のようにして閉じることができます。
driver.quit();
このライブラリを使用するときに実装できる機能が多すぎます。たとえば、chromeを使用しているとすると、コードに追加できます
ChromeOptions options = new ChromeOptions();
WebDriverを使用してChrome ChromeOptionsを使用した拡張機能を開く方法をご覧ください。
options.addExtensions(new File("src\test\resources\extensions\extension.crx"));
これはシークレットモードを使用するためのものです
options.addArguments("--incognito");
これはJavaScriptと情報バーを無効にするためのものです
options.addArguments("--disable-infobars");
options.addArguments("--disable-javascript");
これは、ブラウザーをサイレントにスクレイピングさせ、バックグラウンドでクロールするブラウザーを非表示にする場合に使用します。
options.addArguments("--headless");
あなたがそれを終えたら
WebDriver driver = new ChromeDriver(options);
要約すると、Seleniumが何を提供しなければならないかを見て、これまでにこの投稿で提案した他のソリューションと比較して、Seleniumをユニークな選択にします。
jsoup は他より優れていると思います。jsoupはJava 1.5以上、Scala、Android、OSGi、Google App Engineで動作します。
どのようにして実行できるかを知りたい場合は、これらの既存のプロジェクトをご覧ください。
典型的なクローラープロセスは、フェッチ、解析、リンク抽出、および出力の処理(格納、インデックス付け)で構成されるループです。悪魔は詳細にありますが、どのように「礼儀正しく」尊重するかはrobots.txt
、メタタグ、リダイレクト、レート制限、URLの正規化、無限の深さ、再試行、再訪問など。
Norconex HTTP Collector 。の厚意によるフロー図
利用可能なクローラーのリストは次のとおりです。
https://Java-source.net/open-source/crawlers
しかし、私は Apache Nutch を使用することをお勧めします
HttpUnitは主に単体テストWebアプリケーションで使用されますが、Webサイトを横断し、リンクをクリックして、テーブルとフォーム要素を分析し、すべてのページに関するメタデータを提供します。単体テストだけでなく、Webクロールにも使用します。 - http://httpunit.sourceforge.net/
あなたは探検することができます。ApachedroidまたはApache nutchは、Javaベースのクローラーの感触を得るために