网络爬虫(一)- 基本使用

get请求

    get请求的基本使用

    // 1. 打开浏览器,建立HttpClient对象    
    CloseableHttpClient httpClient = HttpClients.createDefault();
    
    // 2.输入网址,发起get请求建立HttpGet对象
    HttpGet get = new HttpGet("http://112.124.1.187/index.html?typeId=16");
    
    // 3.发情请求,返回响应,使用HttpClient对象发起请求
    CloseableHttpResponse response = httpClient.execute(get);
    
    // 4.解析响应,获取数据
    if(response.getStatusLine().getStatusCode() == 200){
        HttpEntity entity = response.getEntity();
        String content = EntityUtils.toString(entity,"utf-8");
        System.out.println(content);
    }

 

    get请求带参数(能够直接写在地址后,可是构成硬编码)

    // 1. 打开浏览器,建立HttpClient对象
    CloseableHttpClient httpClient = HttpClients.createDefault();
    try {
        // 地址:http://112.124.1.187/index.html?typeId=16.带有参数
        // 建立URIBuilder
        URIBuilder uriBuilder = new URIBuilder("http://112.124.1.187/index.html");
        // 添加参数
        // 多个参数能够连着添加,在后面连着setParameter(key,value)
        uriBuilder.setParameter("typeId","16");
        // 2.输入网址,发起get请求建立HttpGet对象
        HttpGet get = new HttpGet(uriBuilder.build());
        // 3.发情请求,返回响应,使用HttpClient对象发起请求
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(get);
            // 4.解析响应,获取数据
            if(response.getStatusLine().getStatusCode() == 200){
                HttpEntity entity = response.getEntity();
                String content = EntityUtils.toString(entity,"utf-8");
                System.out.println(content);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }

 

post请求

    基本使用与get相同把HttpGet改成HttpPost就能够了。html

    post请求带参数

    // 1. 打开浏览器,建立HttpClient对象
    CloseableHttpClient httpClient = HttpClients.createDefault();
    
    // 地址:http://112.124.1.187/index.html?typeId=16.带有参数
    // 2.输入网址,发起post请求建立HttpPost对象
    HttpPost post = new HttpPost("http://112.124.1.187/index.html");
    // 2.1 声明List集合,封装表单中的参数
    List<NameValuePair> params = new ArrayList<>();
    // 2.2 添加参数
    params.add(new BasicNameValuePair("typeId","16"));
    // 2.3 建立表单的Entity对象,对参数进行url编码
    UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(params,"utf-8");
    // 2.4 设置表单的Entity对象到Post请求中
    post.setEntity(formEntity);
    
    // 3.发情请求,返回响应,使用HttpClient对象发起请求
    CloseableHttpResponse response = null;
    try {
        response = httpClient.execute(post);
        // 4.解析响应,获取数据
        if(response.getStatusLine().getStatusCode() == 200){
            HttpEntity entity = response.getEntity();
            String content = EntityUtils.toString(entity,"utf-8");
            System.out.println(content);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally{
        if(response != null){
            response.close();
        }
        httpClient.close();
    }

 

像每个链接操做同样,HttpClent 链接一次,再断开,再要用时,继续链接,再断开。构成浪费资源现象。须要用到 "池" 这个概念。浏览器

HttpClient-链接池

    public static void     main(String[] args) {
        // 建立链接池管理器
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        // 设置最大链接数
        cm.setMaxTotal(10);
        // 设置每一个主机最大链接数
        cm.setDefaultMaxPerRoute(2);
    
        // 使用链接池管理器发起请求
        doGet(cm);
        doGet(cm);
    }
    
    private static void doGet(PoolingHttpClientConnectionManager cm) {
        // 从链接池中获取HttpClient对象
        CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(cm).build();
    
        HttpGet httpGet = new HttpGet("http://112.124.1.187");
        CloseableHttpResponse response = null;
        try {
            response = httpClient.execute(httpGet);
            if(response.getStatusLine().getStatusCode() == 200){
                String content = EntityUtils.toString(response.getEntity(),"utf-8");
                System.out.println(content.length());
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            if(response != null){
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            // 不用关闭HttpClient,交由池来管理
            // httpClient.close();
        }
    }

 

请求参数

    这个请求参数不是放在url地址后面的参数,而是你在请求过程当中,所涉及到须要事先定好的规则。好比,在请求过程当中,有时候由于网络缘由,或目标服务器的缘由,请求须要更长的时间才能完成,就须要咱们自定义相关的时间。服务器

    HttpGet get =     new HttpGet("http://112.124.1.187/index.html?typeId=16");
    // 配置请求信息
    RequestConfig config = RequestConfig.custom().setConnectTimeout(10000)  // 建立链接的最长时间,单位是毫秒
                            .setConnectionRequestTimeout(500)   // 设置获取链接的最长时间,单位是毫秒
                            .setSocketTimeout(10 * 1000)    // 设置数据传输的最长时间,单位是毫秒
                            .build();
    // 将配置给请求
    get.setConfig(config);
相关文章
相关标签/搜索