阅读 140

httpclient帮我们主动实现接口自动化,同时防止爬虫哦

前言

  • 说了IO之后还有跨IO的操作,IO我们是针对文件的,但是在如今的时代我们是数据的时代。下面我们来看看HTTP那些事

GET

  • 我们在浏览器中打开一个网页会获取到丰富的数据,其中很大一部分数据是来自于服务器。那么我们的浏览器是如何获取这些服务器数据的。首先我们在服务器上开发响应的HTTP响应接口待响应。然后再HTML等前端语言中去调用该接口。浏览器的职能就是执行我们这些HTML语言的脚本。

  • 还是apache下提供了一个HttpClients工具类,通过这个工具类我们能够完成常见的restful格式的请求。无非就是常见的新增、修改、删除、查询四种类型的数据请求。

public String httpGet(String url, Map<String, ?> headMap) {     String responseContent = null;     CloseableHttpClient httpclient = HttpClients.createDefault();     try {         HttpGet httpGet = new HttpGet(url);         setGetHead(httpGet, headMap);         CloseableHttpResponse response1 = httpclient.execute(httpGet);         try {             System.out.println(response1.getStatusLine());             HttpEntity entity = response1.getEntity();             responseContent = getRespString(entity);             EntityUtils.consume(entity);         } finally {             response1.close();         }     } catch (Exception e) {         e.printStackTrace();     } finally {         try {             httpclient.close();         } catch (IOException e) {             e.printStackTrace();         }     }     return responseContent; } 复制代码
  • 通过HttpClients擦行间一个抽象的HttpClientsCloseableHttpClient。我们通过其addHeader方法添加请求头信息。那么你肯定会问请求参数怎么设置。我们是GET请求,get请求的参数就在请求地址上。所以我们是以追加的方式追加在请求路径上的。

POST

  • 可以这么说将近70%的请求都是在做get查询数据请求。剩下的30%才是操作数据的。这里的操作数据也不全是post请求。不要忘了我们还有put和delete请求。这两种请求不是很常见,这里我们就不做介绍了。下面我们来着重看看post请求如何发送的。

public String httpPost(String url, Map<String, Object> paramsMap,                        Map<String, String> headMap) {     String responseContent = null;     CloseableHttpClient httpclient = HttpClients.createDefault();     try {         HttpPost httpPost = new HttpPost(url);         setPostHead(httpPost, headMap);         setPostParams(httpPost, paramsMap);         CloseableHttpResponse response = httpclient.execute(httpPost);         try {             System.out.println(response.getStatusLine());             HttpEntity entity = response.getEntity();             responseContent = getRespString(entity);             EntityUtils.consume(entity);         } finally {             response.close();         }     } catch (Exception e) {         e.printStackTrace();     } finally {         try {             httpclient.close();         } catch (IOException e) {             e.printStackTrace();         }     }     System.out.println("responseContent = " + responseContent);     return responseContent; } 复制代码
  • 通过代码对比我们不难发现,post和get请求基本上是一样的。只不过构造的请求对象不一样,处理对象不一样以外,还有就是设置参数的方式不一样。post请求这里我们需要特殊处理下

private void setPostParams(HttpPost httpPost, Map<String, Object> paramsMap)         throws Exception {     if (paramsMap != null && paramsMap.size() > 0) {         List<NameValuePair> nvps = new ArrayList<NameValuePair>();         Set<String> keySet = paramsMap.keySet();         for (String key : keySet) {             if(paramsMap.get(key)==null){                 nvps.add(new BasicNameValuePair(key, ""));             }else{                 nvps.add(new BasicNameValuePair(key, paramsMap.get(key).toString()));             }         }         httpPost.setEntity(new UrlEncodedFormEntity(nvps,"UTF-8"));     } } 复制代码
  • 通过构造UrlEncodedFormEntity对象添加到httpPost对象中,作为请求参数

总结

  • 基本上代码都会对应我们平时的行为动作。我们在浏览器查询数据,代码HttpGet可以做响应动作。这也是有些爬虫的惯用技巧。在不断的试图模拟用户的请求。从而达到计算机级别的试错。

  • 针对这种行为。我们的网站还需要加入防爬策略


作者:本该努力的年龄千万别放弃
链接:https://juejin.cn/post/7024852610607743006


文章分类
后端
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐