簡體   English   中英

從Java應用程序發送帶有參數的POST請求時出現問題

[英]Problem sending a POST Request with Parameters From a Java app

有一個帶有搜索引擎的網頁:

http://www.nukat.edu.pl/cgi-bin/gw_48_1_12/chameleon?sessionid=2010010122520520752&skin=default&lng=pl&inst=consortium&search=KEYWORD&function=SEARCHSCR&SourceScreen=NOFUNC&elementcount=1&pos=1&submit=TabData

我想從Java應用程序中使用其搜索引擎。

目前,我正在嘗試發送一個非常簡單的請求-僅填充一個字段,而沒有邏輯運算符。

這是我的代碼:

try {
    URL url = new URL( nukatSearchUrl );
    URLConnection urlConn = url.openConnection();
    urlConn.setDoInput( true );
    urlConn.setDoOutput( true );
    urlConn.setUseCaches( false );
    urlConn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded" );
    BufferedWriter out = new BufferedWriter( new OutputStreamWriter( urlConn.getOutputStream() ) );
    String content = "t1=" + URLEncoder.encode( "Duma Key", "UTF-8" );
    out.write( content );
    out.flush();
    out.close();
    BufferedReader in = new BufferedReader( new InputStreamReader( urlConn.getInputStream() ) );

    String rcv = null;
    while ( ( rcv = in.readLine() ) != null ) {
        System.out.println( rcv );
    }
    fd.close();
    in.close();
} catch ( Exception ex ) {
    throw new SearchEngineException( "NukatSearchEngine.search() : " + ex.getMessage() );
}

我一直得到的不幸的是主要站點-看起來像這樣:

<cant post the link to the main site :/>

不是我期望的搜索結果。

這有什么問題嗎?

網址可能有誤,或者您的請求可能不完整。 您需要檢查HTML源代碼(右鍵單擊頁面> 查看源代碼 ),並使用與<form action>中定義的URL相同的URL,並收集所有請求參數(包括來自隱藏輸入字段和打算“按下”按鈕的參數)! )以用於您的查詢字符串。

也就是說,在大多數情況下,這樣做是違反政策的,並且可能導致您的IP被列入黑名單。 請檢查他們的robots.txt和“使用條款”-如果有的話,我不懂波蘭語。 他們的robots.txt至少說每個人都不允許以編程方式訪問整個網站 使用它需要您自擔風險。 您已被警告。 最好與他們聯系,詢問他們是否有任何公共Web服務,然后改用它。

您始終可以使用從真實Web瀏覽器中提取的真實外觀的字符串來欺騙user-agent請求標頭,以最大程度地減少Bozho指出的被識別為漫游器的風險,但是您仍然可以根據訪問者來抓住它圖/統計。

閱讀BalusC的答案后,我對此不做任何進一步的介紹。 但是,如果您不必擔心將其列入黑名單,則可以使用以下幾點建議:

  • User-Agent標頭設置為假裝為瀏覽器。 例如

     urlConn.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 GTB6"); 
  • 您可以使用Selenium WebDriver在firefox中模擬人類用戶

Live HTTP標頭Firefox擴展是查看所有需要復制的所有活動的簡便方法。 要查看頁面上的所有表單元素, Firebug很有用。 最后,我經常使用我控制的假服務器來查看瀏覽器發送的內容,並與我的應用程序進行比較。 我推出了自己的服務器,只是一台小型Java服務器,可以打印出發送給它的所有內容-反向telnet(如果願意)。

另一個要注意的是,某些站點基於User-Agent拒絕訪問,即您可能需要讓您的應用程序假裝是Firefox。 這是非常糟糕的做法,並且有些不誠實。 如BalusC所述,請檢查其使用政策和robots.txt! 我還建議您尋求許可,如果您打算將您的應用程序散布開來。

最后,我碰巧正在做類似的事情,您可能會發現以下代碼很有用(它將鍵的映射->值列表寫入正確的POST格式):

        StringBuilder builder = new StringBuilder();
        try {
            boolean first = false;
            for(Entry<String,List<String>> entry : data.entrySet()) {
                for(String value : entry.getValue()) {
                    if(first) {
                        first = false;
                    }
                    else {
                        builder.append("&");
                    }
                    builder.append(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" + URLEncoder.encode(value, "UTF-8"));   
                }
            }
        } catch (UnsupportedEncodingException e1) {
            return false;
        }
        conn.setDoOutput(true);
        try {
            OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
            wr.write(builder.toString());
            wr.flush();
            conn.connect();
        } catch (IOException e) {
            return(false);
        }

除用戶代理外,它還可以使用Cookie來檢查是否從搜索頁面發送了搜索。

HttpClient非常適合自動提交表單,包括處理所有cookie並假裝成為瀏覽器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM