这两天在iteye的问答中有一个【java中使用jsoup获取cookies】问题, 地址:http://www.iteye.com/problems/87415。
不知大家遇到类似的问题吗,希望一起探讨。
1、首先第一次访问http://www.17sct.com/city.php?ename=CHANGZHOU,我们可以看到如下请求:
我们看到 设置了两个 99a0_city cookie, 值分别为1 和 269;如chrome、firefox、ie8将选择最后一个作为cookie值。
好像没什么问题,接下来继续看两个工具:
1、jsoup
Connection conn = Jsoup.connect("http://www.17sct.com/city.php?name=CHANGZHOU");
conn.method(Method.GET);
conn.followRedirects(false);
Response response = conn.execute();
System.out.println(response.cookies());
//{referer=deleted, 99a0_city=1, PHPSESSID=b5rjkoq2s2qmukjf9n2ffvjvn5}
//立即过期的也显示出了,即从服务器传过来的都显示
99a0_city竟然为1,即选择了第一个作为cookie的值。
查看并修改org.jsoup.helper.HttpConnection中获取cookie的代码:
// headers into map
Map<String, List<String>> resHeaders = conn.getHeaderFields();
for (Map.Entry<String, List<String>> entry : resHeaders.entrySet()) {
String name = entry.getKey();
if (name == null)
continue; // http/1.1 line
List<String> values = entry.getValue();
if (name.equalsIgnoreCase("Set-Cookie")) {
for (String value : values) {
TokenQueue cd = new TokenQueue(value);
String cookieName = cd.chompTo("=").trim();
String cookieVal = cd.consumeTo(";").trim();
// ignores path, date, domain, secure et al. req'd?
System.out.println(cookieName+"="+cookieVal);
cookie(cookieName, cookieVal);
}
} else { // only take the first instance of each header
if (!values.isEmpty())
header(name, values.get(0));
}
}
conn是java.net.HttpURLConnection,也就是说如果使用HttpURLConnection时 有多个同名的cookie 将获取第一个作为cookie的值。
2、HttpClient,和浏览器行为一样获取最后一个Cookie:
HttpClient client = new HttpClient();
GetMethod get = new GetMethod("http://www.17sct.com/city.php?ename=CHANGZHOU");
get.setFollowRedirects(false);
client.executeMethod(get);
System.out.println(Arrays.toString(client.getState().getCookies()));
//[PHPSESSID=cn74fv516879pv26h5lbaf9gd0, 99a0_city=269]
//立即过期的不显示出来
因此总结:
1、使用java.net.HttpURLConnection的工具/框架,如果多个同路径下同名的cookie将获取第一个;
2、使用apache HttpClient,和浏览器行为一样获取最后一个。
因此,当我们在使用cookie时,尽量保证服务器设置一个cookie。
还要注意:
1、使用java.net.HttpURLConnection的工具/框架,可能获取到过期的cookie,如之前的referer[过期时间是2011年,即立即过期];
2、使用apache HttpClient,不会获取到过期的cookie。
不知大家遇到类似的问题吗,希望一起探讨。
分享到:
相关推荐
主要介绍了Java爬虫Jsoup+httpclient获取动态生成的数据的相关资料,需要的朋友可以参考下
这些jar包能够快速的实现网页爬虫功能,能够快熟实现模拟浏览器的一些操作。
jsoup+httpclient 简单爬虫,一个jsoup的简单爬虫实例
使用httpClient采集数据,jsoup解析页面
使用jsoup技术连接网站地址,通过改变参数获取网站div模块下的所有信息。通过hibernate技术保存到mysql数据库。项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息...
NULL 博文链接:https://you-java.iteye.com/blog/1460271
java爬虫需要的jsoup包和httpclient包,对大家有用的话就点赞支持一下吧
NULL 博文链接:https://zhuyufufu.iteye.com/blog/2090576
根据传入的关键字,利用Jsoup和httpclient协议解析的各大视频网站的网站视频播放列表和链接地址,源码和jar包全都有,无错版,很好的学习资料
资源名字:基于java+Jsoup+HttpClient的网络爬虫技术的网络新闻分析系统设计与实现(源码+文档)_MySQL_网络爬虫_数据挖掘.zip 资源内容:项目全套源码+完整文档 源码说明: 全部项目源码都是经过测试校正后百分百...
使用三种方案实现网页爬虫: 1、httpclient 2、jsoup 3、httpclient+jsoup
使用jsoup解析hmtl,获取对应数据
Jsoup+httpclient模拟登陆和抓取页面.pdf
初级爬虫
利用httpClient+jsoup技术进行网页数据的获取,以网易贵金属为例~
httpclient 和jsoup整合,有httpClient实例,该实例要求协调JSOUP才能正常显示
Jsoup1.11.1和HTTPClient 4.5.3的最新全部jar包,官网下载
httpClient4.5.3+Jsoup1.10.2 commons-codec-1.9.jar commons-logging-1.2.jar httpclient-4.5.3.jar httpcore-4.4.6.jar jsoup-1.10.2.jar
httpclient和jsoup实现对网页数据的爬取,jsoup并可以像js dom方式得到数据
import org.apache.commons.httpclient.cookie.CookiePolicy; import org.apache.commons.httpclient.cookie.CookieSpec; import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons....