Javaを介してWebサイトで検索するにはどうすればよいか疑問に思いました。まず、Webサイトで単語を検索したいと思います。それからウェブサイトは私にいくつかのリンクを返すつもりです。これらのリンクをクリックしたいと思います。彼らは私を別のページにリダイレクトし、最後に私はそのページからデータを取得します。HTMLページを解析するためにjsoupをチェックしましたが、Javaを使用してWebサイトで検索し、リンクをクリックする方法がわかりません。
3 に答える
ブラウザと同じように、HTTP リクエストを作成する必要があります。たとえば、Google Chrome の [ネットワーク] パネルを使用して、手動で検索を行うときに Chrome が行う HTTP リクエストを確認し、重要でないものは無視し、重要なものをシミュレートするコードを記述します。
要求する (「クリック」する) 適切な検索結果を見つけるには、そのためにも jsoup などを使用する必要があります。
代わりに Selenium を使用することもできますが、サイトが複雑な Javascript またはプラグインを使用して検索を実行しない限り、それは途方もなく重いものになります。
この例を見てください。HtmlUnitの最新の jar をダウンロードします。新しいプロジェクトを作成し、これらの jar をインポートして、次のクラスを追加します。必要な目的が得られることを願っています。
package com.examples.htmlunit;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.RefreshHandler;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTable;
import com.gargoylesoftware.htmlunit.html.HtmlTableRow;
public class YahooMail {
public static void main(String[] args) throws Exception {
// Create and initialize WebClient object
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2);
webClient.setThrowExceptionOnScriptError(false);
webClient.setRefreshHandler(new RefreshHandler() {
public void handleRefresh(Page page, URL url, int arg) throws IOException {
System.out.println("handleRefresh");
}
});
// visit Yahoo Mail login page and get the Form object
HtmlPage page = (HtmlPage) webClient.getPage("https://login.yahoo.com/config/login_verify2?.intl=us&.src=ym");
HtmlForm form = page.getFormByName("login_form");
// Enter login and passwd
form.getInputByName("login").setValueAttribute("@@@@@@@");
form.getInputByName("passwd").setValueAttribute("@@@@@@@");
// Click "Sign In" button/link
page = (HtmlPage) form.getInputByValue("Sign In").click();
// Click "Inbox" link
HtmlAnchor anchor = (HtmlAnchor)page.getHtmlElementById("WelcomeInboxFolderLink");
page = (HtmlPage) anchor.click();
// Get the table object containing the mails
HtmlTable dataTable = (HtmlTable) page.getHtmlElementById("datatable");
// Go through each row and count the row with class=msgnew
int newMessageCount = 0;
List rows = (List) dataTable.getHtmlElementsByTagName("tr");
for (HtmlTableRow row: rows) {
if (row.getAttribute("class").equals("msgnew")) {
newMessageCount++;
}
}
// Print the newMessageCount to screen
System.out.println("newMessageCount = " + newMessageCount);
//System.out.println(page.asXml());
}
}
まず、HTTP リクエスト プロトコルに慣れる必要があります。次に、Web サイトをソケット サーバーになるようにプログラミングし、接続時に意味のあるデータを送信するのは簡単なことです。ソケット、os、およびsysライブラリのみを使用して、PythonでWebサーバーを作成しました。
基本的な HTTP プロトコルは、クライアントがサーバーに送信するものです
GET /path/file.extension HTTP/1.0 <- 基本的に GET はリクエストのタイプで、/path/file.extension は基本的にリクエストされるファイルです。HTTP/1.0 はプロトコル Host: yourwebsite.url <- これが必要だとは思わない User-Agent: HTTPTool/1.0 <- 基本的には、Chrome や Firefox など、HTTP リクエストを送信するために使用している方法に似ています [空欄]
サーバーは、HTTP/1.0 200 OK のような応答を返します <- もう一度、プロトコル、次にメッセージ (404 が見つからないなど)。 Date: Mon, 19 Nov 2012 14:15:45 GMT <- This is'必要ですが、それを含めることもできます。 12313131 <- データの長さ (文字数)。this is NEEDED [blank]
< html >
< head >
< h2 >こんにちは< /h2 >
< /head >
< body >
Welcome to my poop
< /body >
< /html >
サーバーがデータを送信した後、サーバーは閉じますソケット。Java では、文字列の長さは次のとおりです:
String blah = "
Java のソケットの詳細については、http: //docs.oracle.com/javase/tutorial/networking/sockets/index.html
を参照してください。その後は、検索する単語を配列に格納し、クライアントに送信されるデータを処理します。また、POST を理解できるようになりたいと考えています。あとは、相手が見たいファイルを手に入れて渡すだけです。何かを検索すると、データベースで調べて、リンクを返すか、見つからないアイテムを返します。