场景
想做个东西,大量抓取豆瓣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请求头里
Cookiedbcl2="12345678:abcde/fghijk";
方式二、模拟一次登录(post),保存响应头里的Set-Cookie。
JAVA代码
publicclassTest {publicstaticvoidmain(String[] args) {
Fetcher fetcher=FetcherFactory.createDoubanSongFetcher();//对应douban.fm的cookie的关键key为ddc12fetcher.fetchData(newDoubanRequest(1,"dbcl2=\"12345678:abcde/fghijk\";"));
}
}
protectedString fetch(RequestData request) {try{
URL url=newURL(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());returncontent;
}catch(Exception e) {
e.printStackTrace();
}returnnull;
}