使用java抓取已登录的页面兼谈cookie的作用。

场景

想做个东西,大量抓取豆瓣FM歌曲的数据存到数据库。

可以用来练习sql、或者作为再抓取的索引、或者是性能实验的基础数据。

但是碰到点障碍:怎么抓都是那么几条数据。我想应该是没有cookie引起的(即没有登录)。




什么是Cookie,cookie的工作流程

Cookie是服务器端程序存放在客户电脑上的数据。服务器端会通过这些数据作判断。最令人不安的自动登录就是如此原理。

客户端如何组织cookie,服务器不在乎。(我知道的ie是文件,firefox是sqlite数据)

服务器往浏览器(客户端)写cookie,反应到HTTP响应头如下:

Set-Cookie  key=value; key2=value2

 

浏览器(客户端)提交请求是会根据域(domain)和路径(path)查询cookie并返回给服务器端。反应到HTTP请求头如下:

Cookie : key=name;



模拟Cookie

方式一、可以使用firefox浏览器的Httpfox插件查看相应请求的cookie。通过实验来确定具体起到身份验证那对键值。

等请求的时候设置到http请求头里

Cookie    dbcl2="12345678:abcde/fghijk";


方式二、模拟一次登录(post),保存响应头里的Set-Cookie。


JAVA代码

publicclass Test {
publicstaticvoid main(String[] args) {
Fetcher fetcher
= FetcherFactory.createDoubanSongFetcher();
// 对应douban.fm的cookie的关键key为ddc12
fetcher.fetchData(new DoubanRequest(1,"dbcl2=\"12345678:abcde/fghijk\"; "));
}
}

 

protected String fetch(RequestData request) {
try {
URL url
=new URL(request.getURL());
HttpURLConnection conn
= (HttpURLConnection) url.openConnection();
conn.setDoInput(
true);
conn.setRequestMethod(
"GET");
conn.setRequestProperty(
"Cookie",request.getCookie());
InputStream in
=null;
in
= conn.getInputStream();
String content
= pipe(in, request.getCharset());
return content;
}
catch (Exception e) {
e.printStackTrace();
}
returnnull;
}
posted @ 2011-08-21 21:37  倚楼无语F5  阅读(1304)  评论(0编辑  收藏  举报