[英]Problem sending a POST Request with Parameters From a Java app
有一個帶有搜索引擎的網頁:
我想從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.