【发布时间】:2013-12-11 12:47:39
【问题描述】:
我正在尝试向网站发出 PHP GET 请求:
问题是,如果我将 Cookie 信息附加到请求的标头,该网站只会处理我的请求。
或者在图片方面,如果我在浏览器中禁用 cookie,我会得到:
这意味着该网站认识到这是我第一次“访问”该网站。
问题是,如果我现在使用右上角的搜索栏,它将不处理此请求: 它只会显示相同的(一般)屏幕。
例如:如果我有 cookie禁用并且我搜索“AAPL”,它不会显示任何结果。
现在,如果我启用了 cookie,请求就会得到很好的处理:
因此显示“AAPL”结果。
你也可以自己试试:
启用 cookie,访问 http://www.pennystocktweets.com/user_posts/feeds?cat=search&lptyp=prep&usrstk=AAPL
使用 cookie禁用,再次访问该链接:http://www.pennystocktweets.com/user_posts/feeds?cat=search&lptyp=prep&usrstk=AAPL
现在比较答案,只有第一个是正确的。
这意味着网站只有在客户端下载了一个 cookie,然后向服务器发出另一个(新的)GET 请求并附加了这个 cookie 信息之后才能工作。
(这是否意味着网站需要会话cookie才能正常运行?)
现在我正在尝试使用Apache HttpClient 模仿请求,如下所示:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
public class downloadTweets {
private String cookies;
private HttpClient client = new DefaultHttpClient();
private final String USER_AGENT = "Mozilla/5.0";
public static void main(String[] args) throws Exception {
String ticker = "AAPL";
String lptyp = "prep";
int opid = 0;
int lpid = 0;
downloadTweets test = new downloadTweets();
String url = test.constructURL(ticker, lptyp, opid, lpid);
// make sure cookies is turn on
CookieHandler.setDefault(new CookieManager());
downloadTweets http = new downloadTweets();
String page = http.GetPageContent(url, ticker);
System.out.println(page);
}
public String constructURL(String ticker, String lptyp, int opid, int lpid)
{
String link = "http://www.pennystocktweets.com/user_posts/feeds?cat=search" +
"&lptyp=" + lptyp +
"&usrstk=" + ticker;
if (opid != 0)
{
link = link +
"&opid=" + opid +
"&lpid=" + lpid;
}
return link;
}
private String GetPageContent(String url, String ticker) throws Exception {
HttpGet request = new HttpGet(url);
String RefererLink = "http://www.pennystocktweets.com/search/post/" + ticker.toUpperCase();
request.setHeader("Host", "www.pennystocktweets.com");
request.setHeader("Connection", "Keep-alive");
request.setHeader("Accept", "*/*");
request.setHeader("X-Requested-With", "XMLHttpRequest");
request.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36");
request.setHeader("Referer", RefererLink);
request.setHeader("Accept-Language", "nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4,fr;q=0.2");
HttpResponse response = client.execute(request);
int responseCode = response.getStatusLine().getStatusCode();
System.out.println("\nSending 'GET' request to URL : " + url);
System.out.println("Response Code : " + responseCode);
BufferedReader rd = new BufferedReader(
new InputStreamReader(response.getEntity().getContent()));
StringBuffer result = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
result.append(line);
}
// set cookies
setCookies(response.getFirstHeader("Set-Cookie") == null ? "" :
response.getFirstHeader("Set-Cookie").toString());
return result.toString();
}
public String getCookies() {
return cookies;
}
public void setCookies(String cookies) {
this.cookies = cookies;
}
}
现在,同样的事情也成立:如果我附加(我的)cookie 信息,响应就可以正常工作,如果我不这样做,则响应不起作用。
但我不知道如何获取 cookie 信息,然后在新的 GET 请求中使用它。
所以我的问题是:
我怎样才能向一个网站发出 2 个请求:
在第一个 GET 请求中,我从网站获取 cookie 信息并将其存储在我的 Java 程序中
在第二个 GET 请求中,我使用存储的 cookie 信息(作为 Header)发出新请求。
注意: 我不知道cookie是普通cookie还是会话cookie,但我怀疑它是会话cookie!
非常感谢所有帮助!
【问题讨论】:
标签: java apache http-headers xmlhttprequest session-cookies