Java爬虫学习——第二节,使用HttpClient连接池

在HttpClient使用过程中,每次请求都需要创建HttpClient,为避免频繁的创建和销毁浪费资源,使用连接池的方式。

PoolingHttpClientConnectionManager是个复杂的类,它管理连接池,可以同时为很多线程提供http连接请求。当请求一个新的连接时,如果连接池有有可用的持久连接,连接管理器就会使用其中的一个,而不是再创建一个新的连接。

使用PoolingHttpClientConnectionManager 管理连接池。

创建连接工具类:

1.创建一个大小为100的连接池,每个目标地址最大连接数为10


    //声明连接池管理器
    private PoolingHttpClientConnectionManager cm;

    public HttpConnectionPool() {
        this.cm = new PoolingHttpClientConnectionManager();
        //设置最大连接数(连接池大小)
        cm.setMaxTotal(100);
        //设置每个主机的连接数
        cm.setDefaultMaxPerRoute(10);
    }

2.使用连接池通过HttpClient访问解析目标地址

需要注意以下2点

1)为了防信息抓取,很多网站是做了验证的,所以在请求的时候需要设置请求头信息,让自己看起来不那么像“爬虫”

    /**
     * 使用get请求获取页面数据
     * @param url
     * @return 页面数据
     */
    public String GetHtml(String url){
        //获取httpClinet对象
        CloseableHttpClient httpClient =  HttpClients.custom().setConnectionManager(this.cm).build();
        //设置httpget请求对象,设置url地址
        HttpGet HG = new HttpGet(url);
        HG.setHeader("Accept","text/html,application/xhtml+xml,application/xml;q=0.9," +
                "image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9");
        HG.setHeader("accept-encoding","gzip, deflate, br");
        HG.setHeader("accept-language","zh-CN,zh;q=0.9");
        HG.setHeader("cookie","");
        HG.setHeader("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 " +
                "(KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36");

        //设置请求信息:自定义响应的相关时间
        HG.setConfig(this.reConfig());
        CloseableHttpResponse response = null;
        try {
            //设置HttpClient发起请求 获取响应
            response = httpClient.execute(HG);

            //解析响应,返回结果
            if (response.getStatusLine().getStatusCode() == 200){
                //判断响应体是否为null  不是则能使用EndityUtils
                if (response.getEntity() != null){
                    String con =EntityUtils.toString(response.getEntity(),"utf8");
                    return con;
                }

            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            //关闭response
            if (response !=null){
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return "";
    }

2)在页面抓取过程中有可能会受到网络,或者目标服务器影响,所有需要自定义响应的相关时间

    private RequestConfig reConfig() {
        RequestConfig rf = RequestConfig.custom()
                .setConnectTimeout(1000)//创建连接的最长时间
                .setConnectionRequestTimeout(500)//获取连接的最长时间
                .setSocketTimeout(10000)//数据传输的最长时间
                .build();
        return rf;
    }

 

你可能感兴趣的:(java爬虫,java,http)