0

Webページでデータを取得したいので、Javaを使用してhttpリクエストをサーバーに送信します

URLConnection と Jsoup を試しましたが、どちらも正しい応答を得ることができません

ブラウザでURLを閲覧する場合

http://www.hkprinters.org/en/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/>

今、送信をクリックすることができれば (何も入力する必要はありません)、検索結果が再び表示されます 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

URLConnectionではなくjava.net.HttpURLConnectionを使用してみてください。

于 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 に答える