从Java应用程序发送带有参数的POST请求时出现问题

时间:2010-01-01 21:50:26

标签: java html post

有一个带搜索引擎的网页:

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 :/>

不是我期待的搜索结果。

这里可能有什么问题?

4 个答案:

答案 0 :(得分:2)

网址可能有误或您的请求可能不完整。您需要检查HTML源代码(右键单击页面&gt; 查看源代码)并使用与<form action>中定义的相同的网址,并收集所有请求参数(包括那些来自隐藏输入字段和您打算“按”的按钮!)用于查询字符串。

也就是说,这样做在大多数情况下都违反了政策,并可能导致您的IP被列入黑名单。请检查他们的robots.txt和“使用条款” - 如果有的话,我不懂波兰语。 Their robots.txt至少说每个人都不允许以编程方式访问整个网站。根据自己的风险使用它。你被警告过了。更好地联系他们并询问他们是否有任何公共网络服务,然后使用它。

您总是可以使用从真正的Web浏览器中提取的真实字符串来欺骗user-agent请求标头,以最大限度地降低被Bozho指出的被识别为机器人的风险,但您仍然可以被抓住根据访客模式/统计数据。

答案 1 :(得分:2)

在阅读了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中模拟人类用户

答案 2 :(得分:1)

查看需要复制的所有活动的简便方法是Live HTTP Headers Firefox Extension。要查看页面上的所有表单元素,Firebug非常有用。最后,我经常使用我控制的假服务器来查看浏览器发送的内容,并与我的应用程序进行比较。我自己滚动,只是一个小型Java服务器打印出发送给它的所有内容 - 反向telnet,如果你愿意的话。

另一个注意事项是某些网站拒绝基于用户代理的访问,即您可能需要让您的应用程序假装它是Firefox。这是非常糟糕的做法,有点不诚实。正如BalusC所提到的,请检查他们的使用政策和robots.txt!如果您打算传播您的申请,我还建议您同意。

最后,我碰巧正在处理类似的事情,您可能会发现以下代码很有用(它将键的映射 - &gt;值列表写入正确的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);
        }

答案 3 :(得分:0)

除了用户代理之外,它还可以使用cookie来检查搜索页面是否正在发送搜索。

HttpClient适用于自动提交表单,包括处理任何Cookie并伪装成浏览器。