0

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

4

3 回答 3

1

看看这个例子。下载最新的 jar 的HtmlUnit。创建新项目导入这些 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 回答
1

您需要发出 HTTP 请求,就像浏览器一样。例如,使用Google Chrome 中的网络面板查看当您手动进行搜索时 Chrome 发出的 HTTP 请求,忽略无关紧要的请求并编写代码来模拟那些执行的请求。

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

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

于 2012-11-13T20:07:59.710 回答
0

首先,您应该熟悉 HTTP 请求协议。然后,将您的网站编程为一个套接字服务器并在连接到您时发送有意义的数据是一件简单的事情。我只使用 socket、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 <- 基本上就像他们用来发送 HTTP 请求的方法,比如 Chrome 或 Firefox [空白的]

服务器会响应类似于 HTTP/1.0 200 OK <- 再次是协议,然后是消息(未找到 404 等)日期:星期一,2012 年 11 月 19 日 14:15:45 GMT <- 这不是' t 必要,但您也可以将其包含在内 Content-Type: text/html <- 您发送的内容类型,html 是 text/html 还有一些用于图像 zips 等。只需谷歌它(这很简单) Content-Length: 12313131 <- 数据的长度(以字符为单位)。this is NEEDED [blank]
<html>
<head>
<h2>Hi</h2>
</head>
<body>
欢迎来到我的便便
</body>
</html>
然后服务器发送数据后关闭插座。在 Java 中,字符串长度为:
String blah = "

有关 Java 中的套接字的更多信息,请阅读:http
://docs.oracle.com/javase/tutorial/networking/sockets/index.html 之后,只需将要查找的单词存储在数组中,然后处理发送给客户端的数据。您还希望能够理解 POST。之后,您所做的就是获取他们想要查看的文件,然后将其提供给他们。当他们搜索某些东西时,在数据库中查找它会返回链接或返回未找到的项目。

于 2012-11-13T20:21:24.607 回答