博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java爬虫入门简介(三)——HttpClient保存使用Cookie登录
阅读量:2387 次
发布时间:2019-05-10

本文共 5330 字,大约阅读时间需要 17 分钟。

https://blog.csdn.net/df19900725/article/details/78066468?locationNum=4&fps=1

其他爬虫博客:

 

 
Java爬虫入门简介(三) —— HttpClient保存和使用Cookie登录(本篇博客)

Cookie是浏览器存储存储用户信息的一小段文本,它保存了用户的ID等信息,这些信息可以被服务器端识别,并作为标识用户的手段,以此来判定用户是不是第一次访问。网络上有这样一段解释,很清楚。

浏览器与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
loginNV = new ArrayList<>(); loginNV.add(new BasicNameValuePair("userName", "test")); loginNV.add(new BasicNameValuePair("passWord", "test")); //构造请求资源地址 URI uri = new URIBuilder(url).addParameters(loginNV).build(); //创建一个HttpContext对象,用来保存Cookie HttpClientContext httpClientContext = HttpClientContext.create(); //构造自定义Header信息 List
headerList = Lists.newArrayList(); headerList.add(new BasicHeader(HttpHeaders.ACCEPT, "text/html,application/xhtml+xml,application/xml;q=0.9," + "image/webp,image/apng,*/*;q=0.8")); headerList.add(new BasicHeader(HttpHeaders.USER_AGENT, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) " + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36")); headerList.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING, "gzip, deflate")); headerList.add(new BasicHeader(HttpHeaders.CACHE_CONTROL, "max-age=0")); headerList.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive")); headerList.add(new BasicHeader(HttpHeaders.ACCEPT_LANGUAGE, "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 httpClient = HttpClients.custom().setDefaultHeaders(headerList).build(); //构造请求对象 HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build(); //执行请求,传入HttpContext,将会得到请求结果的信息 httpClient.execute(httpUriRequest, httpClientContext); //从请求结果中获取Cookie,此时的Cookie已经带有登录信息了 CookieStore cookieStore = httpClientContext.getCookieStore(); //这个CookieStore保存了我们的登录信息,我们可以先将它保存到某个本地文件,后面直接读取使用 saveCookieStore(cookieStore,"cookie"); //下面我们将演示如何使用Cookie来请求,首先我们将之前的Cookie读出来 CookieStore cookieStore1 = readCookieStore("cookie"); //构造一个带这个Cookie的HttpClient HttpClient newHttpClient = HttpClientBuilder.create().setDefaultCookieStore(cookieStore1).build(); //使用这个新的HttpClient请求就可以了。这时候我们的HttpClient已经带有了之前的登录信息,再爬取就不用登录了 newHttpClient.execute(httpUriRequest, httpClientContext); } //使用序列化的方式保存CookieStore到本地文件,方便后续的读取使用 private static void saveCookieStore( CookieStore cookieStore, String savePath ) throws IOException { FileOutputStream fs = new FileOutputStream(savePath); ObjectOutputStream os = new ObjectOutputStream(fs); os.writeObject(cookieStore); os.close(); } //读取Cookie的序列化文件,读取后可以直接使用 private static CookieStore readCookieStore( String savePath ) throws IOException, ClassNotFoundException { FileInputStream fs = new FileInputStream("cookie");//("foo.ser"); ObjectInputStream ois = new ObjectInputStream(fs); CookieStore cookieStore = (CookieStore) ois.readObject(); ois.close(); return cookieStore; }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

这就是HttpClient 4.X如何使用Cookie的方式。使用现有的Cookie,其实只要把这个Cookie放到自定义的HttpClient中就行了,很简单。

其他爬虫博客:

 

 
Java爬虫入门简介(三) —— HttpClient保存和使用Cookie登录(本篇博客)

你可能感兴趣的文章
PHP文件上传源码分析(RFC1867)
查看>>
关于php5.*后的时区问题 date_default_timezone_set ();
查看>>
SX 4th meetup – Hunting Rootkit From the Dark Corners Of Memory
查看>>
“Cache-control”常见的取值有private、no-cache、max-age、must-revalidate等
查看>>
安全工具集合
查看>>
Metasploit 3.3 Development Updates
查看>>
Windows Services for UNIX Version 3.5
查看>>
Linux 测试工具
查看>>
Modifying SSH to Capture Login Credentials from Attackers
查看>>
FlatPress 0.804-0.812.1 Local File Inclusion to Remote Command Execution
查看>>
WinRAR v3.80 - ZIP Filename Spoofing
查看>>
shred
查看>>
malware自动化分析
查看>>
opendns安全研究成果
查看>>
Real world examples of malware using DNS for exfiltration and C&C channels
查看>>
Investigating A Malicious Attachment Without Reversing
查看>>
Detecting HTTP Load Balancers using Halberd
查看>>
Information Systems Security Assessment – Open information security framework
查看>>
中小型web网站架构初探之四:前端SQUID高速WEB缓存服务器的搭建
查看>>
防止apache的php扩展名解析漏洞
查看>>