我想知道如何通过java在网站上进行搜索。我想先在网站上搜索一个单词。然后网站将返回一些链接。我想点击这些链接。他们会将我重定向到另一个页面,最后我将从该页面获取数据。我检查了jsoup以解析html页面,但我不知道如何在网站上搜索并使用java点击链接。
答案 0 :(得分:1)
您需要make HTTP requests,就像浏览器一样。使用例如Network panel in Google Chrome可以查看当您手动执行搜索时,Chrome会向Chrome发出的请求,忽略那些无关紧要的内容,并编写代码来模拟执行此操作的内容。
为了找到要求的正确搜索结果(“点击”),您还需要使用像jsoup这样的东西。
您可以使用Selenium,但这将是非常重量级的,除非该网站使用一些复杂的Javascript或插件进行搜索,这是不太可能的。
答案 1 :(得分:0)
首先,您应该熟悉HTTP请求协议。然后,将网站编程成为套接字服务器是一件简单的事情,当连接到您时,发送有意义的数据。 我只使用socket,os和sys库在Python中创建了一个Web服务器。
基本的HTTP协议是 客户端将发送服务器
GET /path/file.extension HTTP / 1.0< - 基本上GET是请求的类型,/ path / file.extension基本上是被请求的文件。和HTTP / 1.0是协议 主持人:yourwebsite.url< - 我不相信这是必要的 User-Agent:HTTPTool / 1.0< - 基本上就像他们用来发送HTTP请求的方法,比如Chrome或Firefox [空白]
服务器会响应类似的
HTTP / 1.0 200 OK< - 再一次,协议,然后是消息(404找不到,等等)
日期:星期一,2012年11月19日14:15:45 GMT< - 这不是必要的,但你不妨包括它
内容类型:text / html< - 您发送的内容类型,html是text / html还有图片拉链等。只是谷歌它(它很简单)
Content-Length:12313131< - 数据的长度(以字符为单位)。这是需要的
[空白]
< html>
<头>
< h2> Hi< / h2>
< / head>
<身体>
欢迎来到我的便便
< / body>
< / html>
然后在服务器发送数据后,它会关闭套接字。
在Java中,字符串长度为:
String blah =“foobar”;
int length = blah.length();
有关Java中套接字的更多信息,请阅读:http://docs.oracle.com/javase/tutorial/networking/sockets/index.html
之后,存储要在数组中查找的单词并处理发送到客户端的数据。您还希望能够理解POST。之后,您只需获取他们想要查看的文件,然后将其提供给他们。当他们搜索某些内容时,在数据库中查找它会返回该链接或返回未找到的项目。
答案 2 :(得分:0)
看看这个例子。下载HtmlUnit的最新jar。创建新项目导入这些jar并添加folloing类。希望你达到你所要求的目标。
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());
}
}