Java网络爬虫(二)--HttpClient设置头部信息(模拟登录)

在网络爬虫中我们经常需要设置一些头部信息,使我们进行网页抓取的行为更加像浏览器的行为,并且我们有时需要将头部信息设置正确,才能得到正确的数据,要不然有可能得到和浏览器所展示的页面有出入的信息。

设置头部还可以进行模拟登录,我们可以设置cookie,来得到登录后的页面,有些时候一些网站需要进行登录才能进行一些操作,并且有可能登录后的网站和没有进行登录的所产生的数据有所不同,这个时候我们就有必要添加头部cookie,进行模拟登录了。

设置头部进行模拟登录

代码如下:

import org.apache.http.Header;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

import java.io.IOException;

import static java.lang.System.out;

/** * Created by paranoid on 17-3-26. */
public class HttpClientDemo {
    public static void main(String[] args){
        //创建客户端
        CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

        //创建请求Get实例
        HttpGet httpGet = new HttpGet("https://www.baidu.com");

        //设置头部信息进行浏览器模拟行为
        httpGet.setHeader("Accept", "text/html,application/xhtml+xml," +
                "application/xml;q=0.9,image/webp,*/*;q=0.8");
        httpGet.setHeader("Accept-Encoding", "gzip, deflate, sdch, br");
        httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
        //httpGet.setHeader("Cookie", ".......");
        httpGet.setHeader("User-Agent", "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36" +
                " (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36");

        try {
            //客户端执行httpGet方法,返回响应
            CloseableHttpResponse closeableHttpResponse = closeableHttpClient.execute(httpGet);

            //得到服务响应状态码
            if(closeableHttpResponse.getStatusLine().getStatusCode() == 200) {
                //打印所有响应头
                Header[] headers = closeableHttpResponse.getAllHeaders();
                for (Header header : headers) {
                    out.println(header.getName() + ": " + header.getValue());
                }
            }
            else{
                //如果是其他状态码则做其他处理,这部分知识博主也还没有系统的学习,以后给大家补上
                //对于服务器返回的各个状态码的含义希望大家能了解一下
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            httpClient.close();
        }
    }
}

为了让大家能够系统的使用HttpClient的代码特地将整体代码贴上,对于添加头部信息不懂的同学可以查看上一篇博客,对于cookie的部分我没有贴出,为了安全嘛,虽然不知道贴了cookie有什么危险,但是还是小心一点(手动滑稽)~,对于这些参数,大家都可以在chrome的开发者工具里面进行获得,cookie是大家手动登录后产生的,也可以获得,设置了这些参数之后,我们既模拟了浏览器的行为又进行了模拟登录,为什么使用cookie可以进行模拟登录不知道的同学可以自行百度,大家也可以将没有添加cookie的结果和添加了cookie之后的结果进行比对,可以发现的确可以实现模拟登录,恩,我罗嗦了。

那么我们下来讨论实现模拟登录的另一种方法,比较麻烦,也有一定局限性,但相比cookie来说设置好后终身无忧,不像cookie,它是在一定时间内不会变,但cookie变化之后又要重新设置,很麻烦,具体用哪种方式,就看你的需求了~

HttpClient发送Post请求

我们既然需要模拟登录,那么登录时所必须的参数:“用户名”,“密码”等都是可以通过HttpClient放松给对方的服务器的,所以我们说HttpClient模仿的就是浏览器的行为,它基本可以满足我们对Web访问的基本需求。接下来用代码告诉大家怎么手动设计登录时所必要的参数并发送给对方服务器。

import org.apache.http.Header;
import org.apache.http.NameValuePair;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;

import static java.lang.System.out;

/** * Created by paranoid on 17-3-27. * 模拟登录人人网,之前一直尝试模拟登录百度,发现它需要使用两个技术,一是通过Java代码调用JS * 生成随机UID,二是通过抓包得到Pubkey与Rsakey密文根据加密算法得到加密后的密码,最后通过Post * 提交给百度服务器,而这两个知识点我还没有学到,所以先给大家模拟登录简单的人人网 * * 提示:我们在模拟登录之前都要先手动登录然后通过抓包查看登录成功需要给对方服务器发送哪些参数, * 然后我们将这些参数进行提取,通过Post方法发送给对方服务器 */

public class SimulationLoginDemo {
    public static void main(String[] args){
        //创建默认客户端
        CloseableHttpClient closeableHttpClient = HttpClients.createDefault();

        //创建Post请求实例
        HttpPost httpPost = new HttpPost("http://www.renren.com/");

        //创建参数列表
        List<NameValuePair> nvps = new ArrayList<>();
        nvps.add(new BasicNameValuePair("domain", "renren.com"));
        nvps.add(new BasicNameValuePair("isplogin", "true"));
        nvps.add(new BasicNameValuePair("submit", "登录"));
        nvps.add(new BasicNameValuePair("email", ""));
        nvps.add(new BasicNameValuePair("passwd", ""));

        //向对方服务器发送Post请求
        try {
            //将参数进行封装,提交到服务器端
            httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF8"));
            CloseableHttpResponse httpResponse = closeableHttpClient.execute(httpPost);

            //如果模拟登录成功
            if(httpResponse.getStatusLine().getStatusCode() == 200) {
                Header[] headers = httpResponse.getAllHeaders();
                for (Header header : headers) {
                    out.println(header.getName() + ": " + header.getValue());
                }
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            httpPost.abort(); //释放资源
        }
    }
}

对于发送Post请求进行模拟登录我推荐这两个博客,看完之后感觉会大有帮助,并且我的博客内容也是照其中修改的。
网络爬虫中的模拟登陆获取数据(实例教学)

使用HttpClient模拟登录百度账号
这篇博客基本讲述了我在Post请求发送开篇遇到的问题。

你可能感兴趣的:(java,网络爬虫,模拟登陆)