0

我想在网页上获取一些数据,所以我使用 java 向服务器发送 http 请求

我已经尝试过 URLConnection 和 Jsoup,但它们都无法得到正确的响应

如果在浏览器浏览 url

http://www.hkprinters.org/sc/member_search.asp?page=1&mode=view

响应正确,得到搜索结果

但是使用java,我只能得到搜索,没有结果。

为什么响应不正确以及如何获得正确的响应?

import java.io.*;
import java.util.*;
import java.net.*;
import org.json.*;

class HttpRequest
{
    public static void main(String[] args) throws Exception
    {
        URL url = new URL("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view");
        URLConnection conn = url.openConnection();
        conn.setDoOutput(true);
        OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
        wr.flush();

        BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("station.txt")));

        String line;
        while((line=rd.readLine())!=null)
        {
            out.write(line);
        }
        out.close();
    }


}






import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.jsoup.*;

public class read_line2 {

    public static void main(String args[]) {
        try {
            Document doc = Jsoup.connect("http://www.hkprinters.org/en/member_search.asp?page=1&mode=view").get();
            Document doc = Jsoup.parse(input, null);
            Elements newHeadlines = doc.select("*");
            System.out.println(newHeadlines);

        } catch (Exception e) {
        }
    }
}

更新:

我想先解释正确和错误的结果。

正确的是搜索表单+搜索结果数据(如公司名称、地址、电话),我要这些数据。

不正确的是:

<title>db</title>
<title>func</title>
<!DOCTYPE HTML PUBLIC
........
<input type="hidden" name="hdnMode" value="search"/></form>
</table>
<font size="2"><br/>

如果用浏览器查看,只能看到搜索表单,看不到结果。

新发现是:我现在可以使用浏览器得到不正确的结果。如果您关闭浏览器并再次打开,然后浏览http://www.hkprinters.org/en/member_search.asp?page=1&mode=view

那么你会得到不正确的结果,这个结果和 JAVA 的结果完全一样

<title>db</title>
<title>func</title>
<!DOCTYPE HTML PUBLIC
........
<input type="hidden" name="hdnMode" value="search"/></form>
</table>
<font size="2"><br/>

现在,如果您可以点击提交(无需输入任何内容),那么搜索结果将再次显示,现在即使您只浏览http://www.hkprinters.org/en/member_search.asp?page=1&mode=view ( get 方法),搜索结果仍然显示。

所以我猜这个页面在我第一次点击提交按钮时会将帖子数据保存到会话中,之后,每次我浏览这个页面时,它都会从会话中找到搜索键,所以即使我使用 get 方法发送页面和模式,它仍然给我搜索结果。

但我不知道如何使用 JAVA 实现相同的会话,有什么例子吗?

4

5 回答 5

2

如果您没有在请求中发送任何内容,请评论以下几行:

conn.setDoOutput(true);
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.flush();
于 2012-08-14T16:18:30.397 回答
1

尝试使用 java.net.HttpURLConnection 而不是 URLConnection。

于 2012-08-14T16:04:59.200 回答
1

我建议使用Apache http 客户端。
您将更好地控制正在使用的 HTTP 方法(GET、PUT 等...)
此 HTTP 客户端被广泛使用。
您将拥有更好的 API 来处理响应(当然可以使用 URLConnection,但是这个框架简化了事情。

于 2012-08-14T15:59:28.917 回答
1

我检查了提供的 URL 的源代码。它在 HTML 标记中有一些错误。这可能是在某些浏览器中未提交表单的原因。这取决于您的浏览器对不良标记的宽容程度。例如,元素定义在 /tr 和 tr 元素之间,这意味着在表中:

...
</tr>
<form action="member_search.asp" method="post" name="frmSearch" 
    onSubmit="return checkSearchForm();">
<tr class="copy"> 
...

我还可以看到用于提交的方法是 POST,但我在您的代码中没有看到任何设置来提供搜索表单中显示的搜索参数。

我的建议是,您尝试检查您的客户对不同页面的请求,您可以证明该页面生成良好。

于 2012-08-14T16:41:05.553 回答
0

在你写完之后调用 HttpURLConnection.getResponseCode(),如果你需要写任何东西,这看起来很可疑,但是在你读任何东西之前,如果你真的需要读任何东西,这也可能是可疑的。如果你只是做 I/O,你会受到一些 HTTP 状态码被映射到 IOExceptions 的摆布。

于 2012-08-15T11:11:46.890 回答