java 实现通过 post 方式提交json参数操作

作者:joexk 时间:2022-08-29 05:00:16 

由于所爬取的网站需要验证码,通过网页的开发人员工具【F12】及在线http post,get接口测试请求工具(http://coolaf.com/)发现访问时加上请求头header 信息时可以跳过验证码校验。

而且该网站只接受post请求,对提交的参数也只接受json格式,否则请求失败。

现将通过 post 方式提交json参数的方法记录如下:


import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpRequestBase;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

/**
* <p>@PostJsonParamsTest.java</p>
* @version 1.0
* @author zxk
* @Date 2018-3-3
*/
public class PostJsonParamsTest {

// 超时时间
 private static final int RUN_TIME =10000;

// 爬取初始页数
 private String page;

public static void main(String[] args) throws Exception {
   PostJsonParamsTest crawl = new PostJsonParamsTest();

// 请求的url地址
   String url ="http://www.gzcredit.gov.cn/Service/CreditService.asmx/searchOrgWithPage";
   // 设置起始访问页码
   crawl.setPage("1");
   String isStop = "";

// 设置请求
   HttpRequestBase request = null;
   request = new HttpPost(url);

try {
     // 设置config
     RequestConfig requestConfig = RequestConfig.custom()
           .setSocketTimeout(RUN_TIME)
           .setConnectTimeout(RUN_TIME)
           .setConnectionRequestTimeout(RUN_TIME)
           .build();
     request.setConfig(requestConfig);

// json 格式的 post 参数
     String postParams ="{\"condition\":{\"qymc\":\"%%%%\",\"cydw\":\"\"},\"pageNo\":"+crawl.getPage()+",\"pageSize\":100,count:2709846}";
     System.out.println(postParams);
     HttpEntity httpEntity = new StringEntity(postParams);
     ((HttpPost) request).setEntity(httpEntity);

// 添加请求头,可以绕过验证码
     request.addHeader("Accept","application/json, text/javascript, */*");
     request.addHeader("Accept-Encoding","gzip, deflate");
     request.addHeader("Accept-Language", "zh-CN,zh;q=0.8");
     request.addHeader("Connection", "keep-alive");
     request.addHeader("Host", "www.gzcredit.gov.cn");
     request.addHeader("Content-Type", "application/json; charset=UTF-8");

URIBuilder builder = new URIBuilder(url);      
     URI uri = builder.build();
     uri = new URI(URLDecoder.decode(uri.toString(), "UTF-8"));
     request.setURI(uri);

while(!isStop.equals("停止")||isStop.equals("重跑")){
       isStop = crawl.crawlList(request);
       if(isStop.equals("爬取")){
         crawl.setPage(String.valueOf(Integer.parseInt(crawl.getPage())+1));
       }

// if("2713".equals(crawl.getPage())) break;
       if("2".equals(crawl.getPage())){
         break;
       }
     }
   } catch (NumberFormatException e) {
     e.printStackTrace();
     throw new NumberFormatException("数字格式错误");
   } catch (UnsupportedEncodingException e) {
     e.printStackTrace();
     throw new UnsupportedEncodingException("不支持的编码集");
   }
 }
 /**
  * 爬取搜索列表
  * @param page
  * @return
  */
 private String crawlList(HttpRequestBase request){
   int statusCode = 0;

// 下面两种方式都可以用来创建客户端连接,相当于打开了一个浏览器
   CloseableHttpClient httpClient = HttpClients.createDefault();
   // HttpClient httpClient = HttpClientBuilder.create().build();

HttpEntity httpEntity = null;
   HttpResponse response = null;
   try {      
     try {        
       response = httpClient.execute(request);
     } catch (Exception e){
       e.printStackTrace();
       EntityUtils.consumeQuietly(httpEntity);
       return "重跑";
     }

//打印状态
     statusCode =response.getStatusLine().getStatusCode();
     if(statusCode!=200){
       EntityUtils.consumeQuietly(httpEntity);
       return "重跑";
     }
     //实体
     httpEntity = response.getEntity();
     String searchListStr = EntityUtils.toString(httpEntity,"GBK").replaceAll("\\\\米", "米");
     String allData = (String) JSONObject.parseObject(searchListStr).get("d");
     // 字符串值中间含双引号的替换处理
     String s = allData.replaceAll("\\{\"","{'")
         .replaceAll("\":\"", "':'")
         .replaceAll("\",\"", "','")
         .replaceAll("\":", "':")
         .replaceAll(",\"", ",'")
         .replaceAll("\"\\}", "'}")
         .replaceAll("\"", "")
         .replaceAll("'", "\"")
         .replaceAll("<br />", "")        
         .replaceAll("\t", "")
         .replaceAll("\\\\", "?");
     JSONObject jsonData = JSONObject.parseObject(s);
     JSONArray jsonContent = jsonData.getJSONArray("orgList");

searchListStr = null;
     allData = null;
     s = null;

if (jsonContent==null || jsonContent.size()<1) {
       return "重跑";
     }
     System.out.println(jsonContent.toJSONString());
     return "爬取";
   } catch (Exception e) {
     e.printStackTrace();
     return "重跑";
   } finally{
     EntityUtils.consumeQuietly(httpEntity);
   }
 }

private String getPage() {
   return page;
 }

private void setPage(String page) {
   this.page = page;
 }

}

补充知识:JAVA利用HttpClient发送post请求,将请求数据放到body里

我就废话不多说了,大家还是直接看代码吧~


 /**
  * post请求 ,请求数据放到body里
  * @param url  请求地址
  * @param bodyData 参数
  * @author wangyj
  * @date 2019年4月20日
  */
 public static String doPostBodyData(String url, String bodyData) throws Exception{
   String result = "";
   CloseableHttpClient httpClient = null;
   CloseableHttpResponse response = null;
   try {
     HttpPost httpPost = getHttpPost(url, null); // 请求地址
     httpPost.setEntity(new StringEntity(bodyData, Encoding));
     httpClient = getHttpClient();
     // 得到返回的response
     response = httpClient.execute(httpPost);
     HttpEntity entity = response.getEntity();
     result = getResult(entity, Encoding);
   } catch (Exception e) {
     throw e;
   } finally {
     // 关闭httpClient
     if (null != httpClient) {
       httpClient.close();
     }
     // 关闭response
     if (null != response) {
       EntityUtils.consume(response.getEntity()); // 会自动释放连接
       response.close();
     }
   }
   return result;
 }

来源:https://blog.csdn.net/zhouxukun123/article/details/79441031

标签:java,post,json,参数
0
投稿

猜你喜欢

  • java中的GC收集器详情

    2021-11-22 16:59:34
  • Java实战宠物医院预约挂号系统的实现流程

    2022-12-28 03:07:52
  • Spring底层事务原理解析

    2021-11-25 05:40:29
  • Java排序之冒泡排序的实现与优化

    2023-11-10 21:35:56
  • Nginx+SpringCloud Gateway搭建项目访问环境

    2023-07-16 01:13:27
  • SpringBoot整合Redis之编写RedisConfig

    2023-08-29 02:35:57
  • Java实现SSL双向认证的方法

    2023-09-22 10:34:35
  • java实现冒泡排序算法

    2023-10-17 20:44:01
  • Java生成随机姓名、性别和年龄的实现示例

    2023-11-13 16:43:26
  • 使用springboot logback动态获取application的配置项

    2023-09-03 21:21:41
  • Java线程池源码的深度解析

    2023-10-02 19:33:40
  • Java项目实现寻找迷宫出路

    2022-10-05 14:08:46
  • 实例讲述Java IO文件复制

    2023-01-30 17:25:32
  • java基础二叉搜索树图文详解

    2023-06-01 05:43:19
  • 详解Vue响应式的部分实现

    2022-12-21 23:25:53
  • Java 格式化输出JSON字符串的2种实现操作

    2023-11-13 09:41:10
  • Mybatis实现增删改查(CRUD)实例代码

    2022-10-05 20:03:22
  • Flutter之Timer实现短信验证码获取60s倒计时功能的代码

    2023-07-20 20:00:30
  • Java的内部类总结

    2022-08-13 01:33:41
  • 使用mutex实现应用程序单实例运行代码分享

    2023-09-18 22:45:11
  • asp之家 软件编程 m.aspxhome.com