这两天在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工具包来获取和解析动态生成的数据,特别是那些通过JavaScript动态加载的数据。 ### Java爬虫基础 Java爬虫是指使用Java语言编写的一类程序,这些程序...
HttpClient与JSoup结合使用,可以实现更高级的网页访问和数据获取。 **结合使用JSoup和HTTPClient** 将JSoup与HTTPClient结合,可以创建一个高效且灵活的网页爬虫。首先,HTTPClient负责发起HTTP请求,获取网页的...
标题中的“jsoup httpclient 爬取网页并下载google图标”揭示了这个项目或教程是关于使用Java的两个著名库——Jsoup和HttpClient,来实现网页抓取并下载特定资源,这里是Google的图标。Jsoup是一个用于处理实际世界...
HttpClient可以设置Cookie和User-Agent来模拟浏览器行为,而Jsoup则可以通过执行JavaScript来处理动态加载的内容。同时,为了避免被目标网站封禁,应合理控制请求频率,并可能需要使用代理IP。 总的来说,...
JSoup 提供了方便的 API 用于解析 HTML 文档,而 HttpClient 则是 Apache 开源组织提供的一个用于执行 HTTP 请求的强大工具。本文将深入探讨如何结合这两者构建一个简单的 Java 爬虫。 首先,我们需要理解 **JSoup*...
实际操作时,可能还需要考虑登录、分页、动态加载等问题,这些可以通过HttpClient设置cookie和处理重定向,或者使用Jsoup的Jsoup.connect模拟JavaScript执行来解决。 总之,HttpClient和Jsoup是Java开发者进行网页...
为了更好地理解,这里提供一个简化的示例代码片段,演示如何使用JSoup和HttpClient获取网页内容: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(...
在给定的文件列表中,`httpclient-4.3.4.jar`就是这个库的特定版本。使用HttpClient,开发者可以编写代码来发送GET、POST等各种类型的HTTP请求,接收响应,处理cookies,甚至处理HTTP缓存。 HttpCore 是HttpClient...
Jsoup+httpclient 模拟登录和抓取知识点: 1. Jsoup库使用介绍: - Jsoup是一个Java的HTML解析器,能够直接解析HTML文档,提供类似于jQuery的操作方法。 - 主要功能包括从URL、文件或字符串中解析HTML,使用DOM或...
在这个压缩包文件中,包含了两个关键的库:Jsoup和Httpclient,它们是Java爬虫开发中常用的工具。 **Jsoup** 是一个Java库,设计用于处理实际世界的HTML。它提供了非常方便的API,用于提取和操作数据,使用DOM、CSS...
使用jsoup技术连接网站地址,通过改变参数获取网站div模块下的所有信息。通过hibernate技术保存到mysql数据库。项目中包括dbutil链接数据库的工具类,执行sql的helper工具类,获取网站div图片保存到本地的工具类信息...
Jsoup+httpclient模拟登陆和抓取页面.pdf
在IT领域,网络爬虫是一种自动化程序,用于从...总之,HttpClient和Jsoup是Java爬虫开发中的两个强大工具,它们结合使用能有效地抓取和解析网页信息。理解它们的工作原理和用法,对于构建高效的网络爬虫至关重要。
“工具”标签则表明HttpClient作为一个常用的开发工具,被用于日常编程任务中。 压缩包里的文件名似乎代表了一些技术资源网站的页面,比如: 1. IBM_China_technology.html - 可能是IBM中国技术网站的一个页面,...
在实际应用中,HttpClient可以用于数据抓取、API调用、自动化测试等多个场景。以下是一个简单的HttpClient使用示例: ```java CloseableHttpClient httpClient = HttpClients.createDefault(); ...
Jsoup和HTTPClient是Java开发中常用的两个库,它们分别用于处理HTML解析和网络请求。 首先,Jsoup是一个Java库,设计用于提取和操作结构化的HTML数据。它提供了类似于jQuery的API,使得开发者可以方便地查找、遍历...
本文将详细介绍如何将HttpClient与Jsoup整合,以便在进行网络请求时获取并解析网页数据。 HttpClient是Apache软件基金会的一个开源项目,提供了全面的HTTP协议支持,包括标准方法(GET、POST等)、连接管理、重定向...
HttpClient是Apache基金会开发的一款强大的HTTP...总的来说,HttpClient和Jsoup的结合使用,为Java开发者提供了一个强大且灵活的工具,可以方便地获取和解析网页数据,对于进行数据抓取和分析的项目来说非常实用。
假设新闻列表存在于`<ul class="news-list">`下的`<li>`元素中,每个新闻条目包含标题(`<h3>`)和链接(`<a>`)。我们可以这样解析: ```java Elements newsList = doc.select("ul.news-list li"); for ...
在IT领域,网络爬虫是获取网页数据的重要手段,而HttpClient和Jsoup是两种常用的Java库,用于实现这一目的。HttpClient提供了低级别的HTTP通信能力,而Jsoup则是一个解析和操作HTML文档的强大工具。本教程将详细介绍...