Java爬虫入门简介(四)——HttpClient保存使用Cookie登录 | DataLearnerAI欢迎关注 DataLearner 官方微信,获得最新 AI 技术推送
浏览器与WEB服务器之间是使用HTTP协议进行通信的;而HTTP协议是无状态协议。也就是说,当某个用户发出页面请求时,WEB服务器只是简单的进行响应,然后就关闭与该用户的连接。因此当一个请求发送到WEB服务器时,无论其是否是第一次来访,服务器都会把它当作第一次来对待,这样的不好之处可想而知。为了弥补这个缺陷,Netscape开发出了cookie这个有效的工具来保存某个用户的识别信息, 它是一种WEB服务器通过浏览器在访问者的硬盘上存储信息的手段。 它是服务器发送给浏览器的体积很小的纯文本信息。
定义:cookie是Web浏览器存储的少量命名数据,它与某个特定的网页和网站关联在一起。cookie实际上和某一网站和网页关联的,保存用户一定信息的文本文件。
Cookie是当你浏览某网站时,网站存储在你机器上的一个小文本文件,它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,当你再次来到该网站时,网站通过读取Cookie,得知你的相关信息,就可以做出相应的动作,如在页面显示欢迎你的标语,或者让你不用输入ID、密码就直接登录等等。
在这篇博客中,我们将描述在HttpClient 4.X中,如何使用Cookie,保存Cookie,并利用已登录的Cookie访问页面。
首先,在HttpClient 4.X中,使用HttpContext来保存请求的上下文信息。说白了,就是用一个类来保存请求的信息。比如,如果使用HttpClient请求利用了HttpContext,那么在请求的时候会带有HttpContext里面保存的一些信息,如sessionId等。同时,HttpClient请求完了之后也会把从服务器得到的一些信息保存下来,下次请求的时候,使用这个HttpContext就会带上这次请求所保存的信息了。BasicHttpContext里有个Map对象用来记录一次请求响应的信息,当响应信息返回时,就会被set到context里,当然响应的cookie信息也就被存储在context里,包括传回的sessionId。当第二次请求的时候传入相同的context,那么请求的过程中会将context里的sessionId提取出来传给服务器,sessionId一样,自然而然的就是同一个session对象。
下面我们看一个使用HttpContext带Cookie请求的案例。
package org.hfutec.crawler.main;
import com.google.common.collect.Lists;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.NameValuePair;
import org.apache.http.client.CookieStore;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;
import java.io.*;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.List;
public class RequestWithCookie {
public static void main(String[] args) throws URISyntaxException, IOException, ClassNotFoundException {
String url = "http://www.datalearner.com";
List<NameValuePair> loginNV = new ArrayList<>();
loginNV.add(new BasicNameValuePair("userName", "test"));
loginNV.add(new (, ));
(url).addParameters(loginNV).build();
HttpClientContext.create();
List<Header> headerList = Lists.newArrayList();
headerList.add( (HttpHeaders.ACCEPT, +
));
headerList.add( (HttpHeaders.USER_AGENT, +
));
headerList.add( (HttpHeaders.ACCEPT_ENCODING, ));
headerList.add( (HttpHeaders.CACHE_CONTROL, ));
headerList.add( (HttpHeaders.CONNECTION, ));
headerList.add( (HttpHeaders.ACCEPT_LANGUAGE, +
));
HttpClients.custom().setDefaultHeaders(headerList).build();
RequestBuilder.get().setUri(uri).build();
httpClient.execute(httpUriRequest, httpClientContext);
httpClientContext.getCookieStore();
saveCookieStore(cookieStore,);
readCookieStore();
HttpClientBuilder.create().setDefaultCookieStore(cookieStore1).build();
newHttpClient.execute(httpUriRequest, httpClientContext);
}
IOException {
(savePath);
(fs);
os.writeObject(cookieStore);
os.close();
}
CookieStore IOException, ClassNotFoundException {
();
(fs);
(CookieStore) ois.readObject();
ois.close();
cookieStore;
}
}
这就是HttpClient 4.X如何使用Cookie的方式。使用现有的Cookie,其实只要把这个Cookie放到自定义的HttpClient中就行了,很简单。
热门博客
BasicNameValuePair
"passWord"
"test"
URI
uri
=
new
URIBuilder
HttpClientContext
httpClientContext
=
new
BasicHeader
"text/html,application/xhtml+xml,application/xml;q=0.9,"
"image/webp,image/apng,*/*;q=0.8"
new
BasicHeader
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36"
new
BasicHeader
"gzip, deflate"
new
BasicHeader
"max-age=0"
new
BasicHeader
"keep-alive"
new
BasicHeader
"zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4,ja;q=0.2,"
"de;q=0.2"
HttpClient
httpClient
=
HttpUriRequest
httpUriRequest
=
CookieStore
cookieStore
=
"cookie"
CookieStore
cookieStore1
=
"cookie"
HttpClient
newHttpClient
=
private
static
void
saveCookieStore
( CookieStore cookieStore, String savePath )
throws
FileOutputStream
fs
=
new
FileOutputStream
ObjectOutputStream
os
=
new
ObjectOutputStream
private
static
readCookieStore
( String savePath )
throws
FileInputStream
fs
=
new
FileInputStream
"cookie"
ObjectInputStream
ois
=
new
ObjectInputStream
CookieStore
cookieStore
=
return