使用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;
}