有一个带搜索引擎的网页:
我想从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 :/>
不是我期待的搜索结果。
这里可能有什么问题?
答案 0 :(得分:2)
网址可能有误或您的请求可能不完整。您需要检查HTML源代码(右键单击页面&gt; 查看源代码)并使用与<form action>
中定义的相同的网址,并收集所有请求参数(包括那些来自隐藏输入字段和您打算“按”的按钮!)用于查询字符串。
也就是说,这样做在大多数情况下都违反了政策,并可能导致您的IP被列入黑名单。请检查他们的robots.txt
和“使用条款” - 如果有的话,我不懂波兰语。 Their robots.txt
至少说每个人都不允许以编程方式访问整个网站。根据自己的风险使用它。你被警告过了。更好地联系他们并询问他们是否有任何公共网络服务,然后使用它。
您总是可以使用从真正的Web浏览器中提取的真实字符串来欺骗user-agent
请求标头,以最大限度地降低被Bozho指出的被识别为机器人的风险,但您仍然可以被抓住根据访客模式/统计数据。
答案 1 :(得分:2)
设置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
答案 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并伪装成浏览器。