0

Javaを介してWebサイトで検索するにはどうすればよいか疑問に思いました。まず、Webサイトで単語を検索したいと思います。それからウェブサイトは私にいくつかのリンクを返すつもりです。これらのリンクをクリックしたいと思います。彼らは私を別のページにリダイレクトし、最後に私はそのページからデータを取得します。HTMLページを解析するためにjsoupをチェックしましたが、Javaを使用してWebサイトで検索し、リンクをクリックする方法がわかりません。

4

3 に答える 3

1

ブラウザと同じように、HTTP リクエストを作成する必要があります。たとえば、Google Chrome の [ネットワーク] パネルを使用して、手動で検索を行うときに Chrome が行う HTTP リクエストを確認し、重要でないものは無視し、重要なものをシミュレートするコードを記述します。

要求する (「クリック」する) 適切な検索結果を見つけるには、そのためにも jsoup などを使用する必要があります。

代わりに Selenium を使用することもできますが、サイトが複雑な Javascript またはプラグインを使用して検索を実行しない限り、それは途方もなく重いものになります。

于 2012-11-13T20:07:59.710 に答える
1

この例を見てください。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());                 

}
}
于 2012-11-14T05:48:02.170 に答える
0

まず、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 を理解できるようになりたいと考えています。あとは、相手が見たいファイルを手に入れて渡すだけです。何かを検索すると、データベースで調べて、リンクを返すか、見つからないアイテムを返します。

于 2012-11-13T20:21:24.607 に答える