jsoup+jxl java代码post请求,并解析返回的html

来源:互联网 发布:mac的路径怎么写 编辑:程序博客网 时间:2024/05/18 03:12

啊,晚上又兴起了。先说说问题描述吧:大概是这样子

就是读取excel中的数据,然后post一下,再把post后返回的数据解析一下,重新写入Excel。。

就是这个页面验证啦。。


用fiddler监视了一下这个post的参数和返回的值:



说了这么多:上代码和结果吧,写的比较糙。

/** * @date 2014-4-13 */package com.servlet;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.net.URL;import java.net.URLConnection;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import jxl.Cell;import jxl.Sheet;import jxl.Workbook;import jxl.HeaderFooter.Contents;import jxl.format.Alignment;import jxl.format.BorderLineStyle;import jxl.format.VerticalAlignment;import jxl.write.Border;import jxl.write.Label;import jxl.write.WritableCellFormat;import jxl.write.WritableFont;import jxl.write.WritableSheet;import jxl.write.WritableWorkbook;import org.jsoup.Jsoup;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;/** *  * @author <a href="meguoke@gmail.com">mo唏</a> * @version 1.0 * @since 2014-4-13 下午08:26:13 */public class Moxi {/** * 向指定 URL 发送POST方法的请求 *  * @param url *            发送请求的 URL * @param param *            请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */public static String sendPost(String url, String param) {PrintWriter out = null;BufferedReader in = null;String result = "";try {URL realUrl = new URL(url);// 打开和URL之间的连接URLConnection conn = realUrl.openConnection();// 设置通用的请求属性conn.setRequestProperty("accept", "*/*");conn.setRequestProperty("connection", "Keep-Alive");conn.setRequestProperty("user-agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");// 发送POST请求必须设置如下两行conn.setDoOutput(true);conn.setDoInput(true);// 获取URLConnection对象对应的输出流out = new PrintWriter(conn.getOutputStream());// 发送请求参数out.print(param);// flush输出流的缓冲out.flush();// 定义BufferedReader输入流来读取URL的响应in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String line;while ((line = in.readLine()) != null) {result += line;}} catch (Exception e) {System.out.println("发送 POST 请求出现异常!" + e);e.printStackTrace();}// 使用finally块来关闭输出流、输入流finally {try {if (out != null) {out.close();}if (in != null) {in.close();}} catch (IOException ex) {ex.printStackTrace();}}return result;}/** * 从xml数据中获取数据 *  * @param fileName * @return */public static List<Map<String, String>> getDataFromXML(String fileName) {List<Map<String, String>> list = new ArrayList<Map<String, String>>();InputStream stream = null;Workbook book = null;if (fileName == null || fileName.equals("")) {System.out.println("读取Excel文件失败,或者文件名为空");return null;}File file = new File(fileName);if (!file.exists()) {System.out.println("文件不存在");return null;}try {stream = new FileInputStream(file);book = Workbook.getWorkbook(stream);Sheet sheet = book.getSheet(0);int columns = sheet.getColumns();int rows = sheet.getRows();int i = 0;int j = 0;// 表头就不读取了Cell cell = null;for (i = 1; i < rows; i++) {Map<String, String> map = new HashMap<String, String>();// 取第一列和第二列的数据map.put("testNo", sheet.getCell(0, i).getContents().toString().trim());map.put("queryNo", sheet.getCell(1, i).getContents().toString().trim());list.add(map);}return list;} catch (Exception e) {}return null;}/** * 生成Excel文件 *  * @param dirPath * @param fileName * @param sheetTitle * @param title * @param columnTitle * @param text * @return */public static boolean writeExcel(String dirPath, String fileName,String sheetTitle, String title, List columnTitle, List text) {WritableWorkbook workBook = null;WritableSheet sheet = null;if (dirPath == null || "".equals(dirPath) || fileName == null|| "".equals(fileName)) {System.out.println("建立excel文件失败:路径或文件名为空");return false;}File filePath = new File(dirPath);{if (!filePath.exists()) {// 如果文件要保存的目录不存在则产生该目录if (!filePath.mkdir()) {System.out.println("建立excel文件失败:无法建立该目录");return false;}}}// 在该目录下产生要保存的文件名String excelPath = dirPath + "/" + fileName + ".xls";File excelFile = new File(excelPath);// 以下开始输出到EXCELtry {if (!excelFile.exists()) {if (!excelFile.createNewFile()) {System.out.println("建立excel文件失败:建立excel文件发生异常");return false;}}/** **********创建工作簿************ */workBook = Workbook.createWorkbook(excelFile);/** **********创建工作表************ */if ("".equals(sheetTitle) || sheetTitle == null) {sheet = workBook.createSheet("Sheet1", 0);} else {sheet = workBook.createSheet(sheetTitle, 0);}/** ************设置单元格字体************** */WritableFont headFont = new WritableFont(WritableFont.ARIAL, 14);WritableFont normalFont = new WritableFont(WritableFont.ARIAL, 12);/** ************以下设置几种格式的单元格************ */// 用于表头WritableCellFormat wcf_head = new WritableCellFormat(headFont);wcf_head.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条wcf_head.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐wcf_head.setAlignment(Alignment.CENTRE); // 文字水平对齐wcf_head.setWrap(false); // 文字是否换行// 用于正文居中WritableCellFormat wcf_center = new WritableCellFormat(normalFont);wcf_center.setBorder(Border.ALL, BorderLineStyle.THIN); // 线条wcf_center.setVerticalAlignment(VerticalAlignment.CENTRE); // 文字垂直对齐wcf_center.setAlignment(Alignment.CENTRE); // 文字水平对齐wcf_center.setWrap(false); // 文字是否换行/** ************单元格格式设置完成****************** *//** ***************以下是报表的内容********************* */// 合并单元格设置excel的题目int x = 0;if ("".equals(title) || title == null) {title = "";x = 0;} else {if (columnTitle != null && columnTitle.size() > 0) {sheet.mergeCells(0, 0, columnTitle.size() - 1, 0);sheet.addCell(new Label(0, 0, title, wcf_head));x = 1;} else if (text != null && text.size() > 0&& ((List) text.get(0)).size() > 0) {sheet.addCell(new Label(0, ((List) text.get(0)).size() - 1,title, wcf_head));x = 1;} else {sheet.addCell(new Label(0, 0, title, wcf_head));x = 1;}}// 设置列名if (columnTitle != null && columnTitle.size() > 0) {for (int i = 0; i < columnTitle.size(); i++) {sheet.addCell(new Label(i, x, String.valueOf(columnTitle.get(i)), wcf_center));}x = x + 1;}// 写入正文数据if (text != null && text.size() > 0) {for (int i = 0; i < text.size(); i++) {List content = (List) text.get(i);if (content != null && content.size() > 0) {for (int j = 0; j < content.size(); j++) {String data = String.valueOf(content.get(j));// 判断数据类型if (content.get(j) instanceof String) {sheet.addCell(new Label(j, x + i, data,wcf_center));} else {try {jxl.write.Number numberLabel = new jxl.write.Number(j, x + i, Double.parseDouble(data),wcf_center);sheet.addCell(numberLabel);} catch (Exception ex) {sheet.addCell(new Label(j, x + i, data,wcf_center));}}sheet.setColumnView(j, data.length() + 10);}}}}workBook.write();} catch (Exception e) {System.out.println("建立excel文件失败:" + e.getMessage());return false;} finally {try {if (workBook != null) {workBook.close();}} catch (Exception ex) {System.out.println("关闭文件流失败:" + ex.getMessage());return false;}}return true;}public static void main(String[] args) {Long beginTime = System.currentTimeMillis();String fileName = "E:\\moxi.xls";List<Map<String, String>> dataList = Moxi.getDataFromXML(fileName);if (dataList == null || dataList.size() == 0) {return;}String testNo = "";String queryNo = "";List<String> content = null;ArrayList<ArrayList<String>> contentsList = null;List<String> titles = null;titles = new ArrayList<String>();titles.add("饰品条码");titles.add("查询码");titles.add("品名");titles.add("成色");titles.add("质量");titles.add("货号");titles.add("尺寸");titles.add("标准备注");contentsList = new ArrayList<ArrayList<String>>();for (Map map : dataList) {testNo = map.get("testNo").toString();queryNo = map.get("queryNo").toString();if (testNo == null || queryNo == null || testNo.equals("")|| queryNo.equals("")) {continue;}String url = "http://www.ngstc.gov.cn/MC?M=QueryCertificate";String postStr = "TestNo=" + testNo + "&QueryNo=" + queryNo+ "&Submit.x=35&Submit.y=10";String str = Moxi.sendPost(url, postStr);org.jsoup.nodes.Document doc = Jsoup.parse(str);content = new ArrayList<String>();try {for (String s : titles) {Elements nodes = doc.select("tr:contains(" + s + ")");Element _e = nodes.get(3);if (s.equals("查询码")) {_e = nodes.get(4).select("tr:contains(" + s + ")").get(1);// System.out.println(_e);}content.add(_e.child(2).html() + "");// /System.out.println(_e.child(1).html()+""+" "+_e.child(2).html()+"");}} catch (Exception e) {}contentsList.add((ArrayList<String>) content);}long endTime = System.currentTimeMillis();try {boolean success = Moxi.writeExcel("E:", "test_1", "Test", "Sends",titles, contentsList);if (success) {System.out.println("操作成功,请查看文件");}} catch (Exception e) {}System.out.println("耗费时间:" + (endTime - beginTime) * 0.001+ "s \n 查询了:" + dataList.size() + " 条数据");}}
速度略慢:有待改进啊 啊 啊啊啊啊啊啊


0 0
原创粉丝点击