本篇博客简单介绍两种处理登录问题的解决方法,具体各位的问题,请具体问题具体分析,辩证解决。
我们在这里讲的两种处理登录问题的方式是针对于不同的需求所做出的方案。
- 使用参数登录
适用于需要多次登录访问抓取信息的网站 - 使用Cookie登录
适用于一次登录抓取完数据后就完事的网站
使用参数登录
一般情况下,登录请求都是需要使用POST
请求来完成操作的,当然也不排除使用GET
请求直接在url
里带参数访问的情况。下面都会说明怎么处理。
POST
HttpPost post = new HttpPost("http://localhost/login"); //将参数拼成string String properties = "username=" + username + "&password=" + password; //然后通过ByteArrayEntity(string.getBytes())将参数设置到post请求中 post.setEntity(new ByteArrayEntity(properties.getBytes()));
GET
//将参数直接跟在url后面 String url = "http://localhost/login?username=" + username + "&password=" + password; HttpGet get = new HttpGet(url);
完整代码:
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.HttpClients;
import java.io.IOException;
public class CookieTest {
public static void main(String[] args) {
HttpClient httpClient = HttpClients.custom().build();
//一般需要登录的网页都是POST请求
HttpPost post = new HttpPost("http://localhost/login");
try {
//这里和上面介绍POST请求的参数设置方式不一样,两种方式都可以,我个人喜欢上面那种
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("username", username));
params.add(new BasicNameValuePair("password", password));
//这里的HTTP.UTF_8在我目前的HttpClient版本已经不能用了,如果你的也不能用,那就向下面的页面文本那样直接设置成字符串就ok
post.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
//GET和POST以下一样,解析post请求
HttpResponse response = httpClient.execute(post);
//拿到响应的实体
HttpEntity entity = response.getEntity();
//打印响应的状态行
System.out.println(response.getStatusLine());
//拿到页面文本
String content = IOUtils.toString(entity.getContent(), "utf-8");
//打印文本
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
使用Cookie登录
使用Cookie的情况有很多,通常登录后浏览器会记录你登录网站时生成的cookie
信息,下次浏览器会直接使用cookie
信息访问网站,这就是我们使用浏览器访问网站时,登陆一次之后下次可以直接访问的原因。
我们在这里就是模拟浏览器的这种行为,直接获取cookie
信息,然后带着cookie信息去访问网站。这种情况多用于只对某个网站的数据抓一次,之后就不会再理会的情况。
还有就是关于设置cookie
,GET
和POST
请求的设置方式一样这里就不再赘述了。
直接上代码:
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.impl.client.HttpClients;
import org.apache.xmlbeans.impl.common.IOUtil;
import java.io.IOException;
public class CookieTest {
public static void main(String[] args) {
HttpClient httpClient = HttpClients.custom().build();
//一般需要登录的网页都是POST请求
HttpPost post = new HttpPost("http://localhost/login");
//找到登录后Cookie信息,在这里设置之后就可以直接访问了
post.addHeader("Cookie", "COLLOCK=98136498912679ID;");
try {
HttpResponse response = httpClient.execute(post);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
String content = IOUtils.toString(entity.getContent(), "utf-8");
System.out.println(content);
} catch (IOException e) {
e.printStackTrace();
}
}
其实关于登录,这里只讲了最简单的情况,实际运用中会发现,登录一般都不是简单的发一个请求就可以完成的。一般都会伴随着页面的跳转和验证。如果遇到这种问题,那就需要大家多一点耐心,慢慢寻找登录的完整逻辑链了。
以上。