通过java在网站上进行搜索

通过java在网站上进行搜索,java,html-parsing,Java,Html Parsing,我想知道如何通过java在网站上进行搜索。我想先在网站上搜索一个词。然后网站会返回一些链接给我。我想点击这些链接。他们会将我重定向到另一个页面,最后我会从该页面获取数据。为了解析html页面,我检查了jsoup,但我不知道如何使用java在网站上进行搜索并单击链接 你需要这样做,就像浏览器一样。例如,使用来查看Chrome在手动搜索时发出的HTTP请求,忽略无关紧要的请求,并编写代码来模拟这些请求 为了找到要请求的正确搜索结果(“单击”),您还需要使用类似于jsoup的东西 您可以使用Selen

我想知道如何通过java在网站上进行搜索。我想先在网站上搜索一个词。然后网站会返回一些链接给我。我想点击这些链接。他们会将我重定向到另一个页面,最后我会从该页面获取数据。为了解析html页面,我检查了jsoup,但我不知道如何使用java在网站上进行搜索并单击链接

你需要这样做,就像浏览器一样。例如,使用来查看Chrome在手动搜索时发出的HTTP请求,忽略无关紧要的请求,并编写代码来模拟这些请求

为了找到要请求的正确搜索结果(“单击”),您还需要使用类似于jsoup的东西


您可以使用Selenium,但这将是一个荒谬的重量级,除非该站点使用一些复杂的Javascript或插件进行搜索,这是不可能的。

首先,您应该熟悉HTTP请求协议。然后,只需将您的网站编程为套接字服务器,并在连接到您时发送有意义的数据。 我只使用套接字、操作系统和sys库,用Python制作了一个Web服务器

基本的HTTP协议是 客户端将发送服务器


GET/path/file.extension HTTP/1.0看看这个例子。下载最新的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());                 

}
}

你能进一步说明搜索功能吗?什么是链接的理想来源?Apache Lucene可能会对您有所帮助。网站上有一个搜索框。我想搜索药物的属性。所以当我在搜索框上写下药物名称时,它会返回一个链接。所以我点击这个链接。我在另一个html页面上显示药物的属性。我首先想,我可以通过URL连接来获取html页面,但看起来更简单、更快。@AhmetTanakol你说得不太有道理。在最初的问题中,您似乎提到了三个页面(搜索页面、搜索结果页面、页面“重定向到”)。如果您知道搜索请求是如何形成的,那么可以省略第一页,但这仍然会留下两页,而不是一页。但是你现在说的好像你只需要得到一个页面。我将在我的谷歌应用程序引擎项目中使用,所以我真的在寻找一些不是重量级或难以使用的东西是的,只是重申一下,我是说你不应该使用Selenium,你应该使用HTTP请求API。顺便说一下,谷歌应用引擎有自己的抓取网页服务。不管你是使用它还是JDK,JDK的实现都是为了在应用程序引擎上使用fetch服务。好的,让我检查fetch服务,实际上我已经做了你说的。我打开了tcp连接以逐字节读取网站,但随后必须再次解析返回的html页面。我希望能找到另一个解决方案。实际上,在进一步阅读了你想要做的事情之后,你可以做的是,你可以在维基百科上搜索这种药物。此处>将返回可能链接的数组(?)。那么这个链接就是en.wikipedia.org/wiki/是指向您页面的链接。我只是把它们全部循环并链接起来。@AhmetTanakol如果你已经这样做了,你应该在问题中说明这一点!