问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java编程怎么把网页上接收的数据保存到数据库

发布网友 发布时间:2022-04-08 20:10

我来回答

2个回答

懂视网 时间:2022-04-09 00:31

class GetHttpXml { public static List<Metal> captureJavascript() throws Exception { String strURL = "http://www.shmet.com/Template/_Template.html?viewName=_HomeSpotPrice&metalid=10133%2C10131%2C10132%2C10002%2C10003%2C10134%2C10135&_=1453249939502"; URL url = new URL(strURL); HttpURLConnection httpConn = (HttpURLConnection) url.openConnection(); InputStreamReader input = new InputStreamReader(httpConn .getInputStream(), "utf-8"); BufferedReader bufReader = new BufferedReader(input); String line = ""; StringBuilder contentBuf = new StringBuilder(); while ((line = bufReader.readLine()) != null) { contentBuf.append(line); } DomParseService dom = new DomParseService(); List<Metal> dataList = dom.getData(contentBuf.toString().trim()); for(Metal metal : dataList){ System.out.println(metal.getChange() + "/ " + metal.getDate() + "/ " + metal.getName() + "/ " + metal.getPrice() + "/ " + metal.getUpWater()); } return dataList; }

这大部分是网上当的,基本内容一次性成功,所以不作说明。

接下来解析xml,我使用的是dom4j解析,由于格式不大友好,还是折腾我一段时间的,代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;


public class DomParseService { 
 List<Metal> listMetal = new ArrayList<Metal>();
 
 public List<Metal> getData(String inputStream) throws Exception{
 Document document = DocumentHelper.parseText(inputStream); 
 //获取根节点元素对象 
 Element rootElement = document.getRootElement(); 
 
 
 // 获取tbody节点。 
 Element element = rootElement.element("tbody");
 Iterator<Element> iteratorTbody = element.elementIterator();
 while(iteratorTbody.hasNext()){
  Element eleTr = iteratorTbody.next();
  if(eleTr.attributeCount() > 0){
  Iterator<Element> iteratorTr = eleTr.elementIterator();
  Metal metal = new Metal();
  while(iteratorTr.hasNext()){
   
   Element eleTd = iteratorTr.next();
//   System.out.println(eleTd.getText() + " ---- " + eleTd.attributeValue("class") + "
	");
   if(eleTd.attributeCount() == 0){
   metal.setUpWater(eleTd.getText());
   }
   else if(eleTd.attributeCount() > 0)
   {
//   System.out.println(eleTd.getText() + " ---- " + eleTd.attributeValue("class").trim() + "
	");
   if(eleTd.attributeValue("class").indexOf("name") != -1){
    metal.setName(eleTd.getText());
   }
   else if(eleTd.attributeValue("class").indexOf("price") != -1){
    metal.setPrice(eleTd.getText());
   }
   else if(eleTd.attributeValue("class").indexOf("change") != -1){
    Iterator<Element> iteratorFont = eleTd.elementIterator();
    while(iteratorFont.hasNext()){
    Element eleFont = iteratorFont.next();
    metal.setChange(eleFont.getText());
    }
   }
   else if(eleTd.attributeValue("class").indexOf("today") != -1){
    metal.setDate(eleTd.getText());
   }   
   } 
   
//   System.out.println(metal.getChange() + "/ " + metal.getDate() + "/ " + metal.getName() + "/ " + metal.getPrice() + "/ " + metal.getUpWater() + "
	");
  }
  listMetal.add(metal);  
  }
  
 }
 
 return listMetal;
 
 }
}

在上面有个疑惑:如eleTd.attributeValue("class").indexOf("price") != -1就是想判断属性class的值是否包含price字段,原先用eleTd.attributeValue("class").Trim() == "price"没有判断成功,eleTd.attributeValue("class").Trim()应该不包含别的字符,怎么会出错呢?

PS:我是用dom4j解析的,需要导入dom4j.jar包。

最后就是将数据导入数据库中,使用的是网上搜到的工具:

PS:这个也需要导包,从微软上下sqljdbc.jar包

import java.lang.reflect.*;
import java.sql.*;
import java.util.*;

public class SqlHelper {
 // SQL Server
 /**
 * JDBC驱动名称
 */
 public static final String CLASS_NAME = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
 /**
 * 数据库连库字符串
 */
 public static final String URL = "jdbc:sqlserver://192.168.63.109;databaseName=HTTPCollection";
 /**
 * 用户名
 */
 public static final String UID = "sa";
 /**
 * 密码
 */
 public static final String PWD = "jxjxjx123";
 /**
 * JDBC驱动类型
 */
 public static Class CLS = null;

 // Oracle
 // public static final String CLASS_NAME =
 // "oracle.jdbc.driver.OracleDriver";
 // public static final String URL =
 // "jdbc:oracle:thin:@localhost:1522:accp11g";
 // public static final String UID = "system";
 // public static final String PWD = "manager";
 /**
 * 获取数据库连接对象
 * 
 * @return
 * @throws ClassNotFoundException
 * @throws SQLException
 */
 public static Connection getConnection() throws ClassNotFoundException,
  SQLException {
 if (CLS == null) {
  CLS = Class.forName(CLASS_NAME);
 }
 return DriverManager.getConnection(URL, UID, PWD);
 }

 /**
 * 执行SQL语句不返回查询的操作,返回受影响的行数
 * 
 * @param sql
 *  SQL语句
 * @return 受影响的行数
 * @throws ClassNotFoundException
 * @throws SQLException
 */
 public static int executeNonQuery(String sql) {
 int result = -1;
 Connection con = null;
 PreparedStatement ps = null;
 try {
  con = getConnection();
  ps = con.prepareStatement(sql);
  result = ps.executeUpdate();
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, ps, null);
 }
 return result;
 }

 /**
 * 执行Insert语句,返回Insert成功之后标识列的值
 * 
 * @param sql
 * @return
 * @throws ClassNotFoundException
 * @throws SQLException
 */
 public static int executeIdentity(String sql) {
 int identity = -1;
 Connection con = null;
 Statement ps = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  ps = con.createStatement();
  ps.executeUpdate(sql, Statement.RETURN_GENERATED_KEYS);
  rs = ps.getGeneratedKeys();
  if (rs.next()) {
  // identity = rs.getInt("GENERATED_KEYS");
  identity = rs.getInt(1);
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, ps, null);
 }
 return identity;
 }

 /**
 * 执行不返回结果集的存储过程
 * 
 * @param sql
 *  存储过程名称
 * @param params
 *  存储过程参数
 * @throws ClassNotFoundException
 * @throws SQLException
 */
 public static void executeNonQuery(String sql, SqlParameter... params) {
 Connection con = null;
 CallableStatement cs = null;
 try {
  con = getConnection();
  cs = con.prepareCall(sql);
  setSqlParameter(cs, params);
  cs.executeUpdate();
  getSqlParameter(cs, params);
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, cs, null);
 }
 }

 /**
 * 执行返回聚合函数的操作
 * 
 * @param sql
 *  含有聚合函数的SQL语句
 * @return 聚合函数的执行结果
 * @throws SQLException
 * @throws ClassNotFoundException
 */
 public static int executeScalar(String sql) {
 int result = -1;
 Connection con = null;
 PreparedStatement ps = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  ps = con.prepareStatement(sql);
  rs = ps.executeQuery();
  if (rs.next()) {
  result = rs.getInt(1);
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, ps, rs);
 }
 return result;
 }

 /**
 * 执行返回泛型集合的SQL语句
 * 
 * @param cls
 *  泛型类型
 * @param sql
 *  查询SQL语句
 * @return 泛型集合
 * @throws ClassNotFoundException
 * @throws SQLException
 * @throws InstantiationException
 * @throws IllegalAccessException
 */
 public static <T> List<T> executeList(Class<T> cls, String sql) {
 List<T> list = new ArrayList<T>();
 Connection con = null;
 PreparedStatement ps = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  ps = con.prepareStatement(sql);
  rs = ps.executeQuery();
  while (rs.next()) {
  T obj = executeResultSet(cls, rs);
  list.add(obj);
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, ps, rs);
 }
 return list;
 }

 /**
 * 执行返回泛型集合的存储过程
 * 
 * @param cls
 *  泛型类型
 * @param sql
 *  存储过程名称
 * @param params
 *  存储过程参数
 * @return 泛型集合
 * @throws ClassNotFoundException
 * @throws SQLException
 * @throws InstantiationException
 * @throws IllegalAccessException
 */
 public static <T> List<T> executeList(Class<T> cls, String sql,
  SqlParameter... params) {
 List<T> list = new ArrayList<T>();
 Connection con = null;
 CallableStatement cs = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  cs = con.prepareCall(sql);
  setSqlParameter(cs, params);
  rs = cs.executeQuery();
  while (rs.next()) {
  T obj = executeResultSet(cls, rs);
  list.add(obj);
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, cs, rs);
 }
 return list;
 }

 /**
 * 执行返回泛型类型对象的SQL语句
 * 
 * @param cls
 *  泛型类型
 * @param sql
 *  SQL语句
 * @return 泛型类型对象
 * @throws SQLException
 * @throws ClassNotFoundException
 * @throws InstantiationException
 * @throws IllegalAccessException
 */
 public static <T> T executeEntity(Class<T> cls, String sql) {
 T obj = null;
 Connection con = null;
 PreparedStatement ps = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  ps = con.prepareStatement(sql);
  rs = ps.executeQuery();
  while (rs.next()) {
  obj = executeResultSet(cls, rs);
  break;
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, ps, rs);
 }
 return obj;
 }

 /**
 * 执行返回泛型类型对象的存储过程
 * 
 * @param cls
 *  泛型类型
 * @param sql
 *  SQL语句
 * @param params
 *  存储过程参数
 * @return 泛型类型对象
 * @throws SQLException
 * @throws ClassNotFoundException
 * @throws InstantiationException
 * @throws IllegalAccessException
 */
 public static <T> T executeEntity(Class<T> cls, String sql,
  SqlParameter... params) {
 T obj = null;
 Connection con = null;
 CallableStatement cs = null;
 ResultSet rs = null;
 try {
  con = getConnection();
  cs = con.prepareCall(sql);
  setSqlParameter(cs, params);
  rs = cs.executeQuery();
  while (rs.next()) {
  obj = executeResultSet(cls, rs);
  break;
  }
 } catch (Exception e) {
  e.printStackTrace();
 } finally {
  close(con, cs, rs);
 }
 return obj;
 }

 /**
 * 将一条记录转成一个对象
 * 
 * @param cls
 *  泛型类型
 * @param rs
 *  ResultSet对象
 * @return 泛型类型对象
 * @throws InstantiationException
 * @throws IllegalAccessException
 * @throws SQLException
 */
 private static <T> T executeResultSet(Class<T> cls, ResultSet rs)
  throws InstantiationException, IllegalAccessException, SQLException {
 T obj = cls.newInstance();
 ResultSetMetaData rsm = rs.getMetaData();
 int columnCount = rsm.getColumnCount();
 // Field[] fields = cls.getFields();
 Field[] fields = cls.getDeclaredFields();
 for (int i = 0; i < fields.length; i++) {
  Field field = fields[i];
  String fieldName = field.getName();
  for (int j = 1; j <= columnCount; j++) {
  String columnName = rsm.getColumnName(j);
  if (fieldName.equalsIgnoreCase(columnName)) {
   Object value = rs.getObject(j);
   field.setAccessible(true);
   field.set(obj, value);
   break;
  }
  }
 }
 return obj;
 }

 /**
 * 设置存储过程参数名称,参数值,参数方向
 * 
 * @param cs
 * @param params
 * @throws SQLException
 */
 private static void setSqlParameter(CallableStatement cs,
  SqlParameter... params) throws SQLException {
 if (params != null) {
  for (SqlParameter param : params) {
  if (param.OutPut) {
   String paramName = param.Name;
   if (paramName == null || paramName.equals("")) {
   cs.registerOutParameter(1, param.Type);// 设置返回类型参数
   } else {
   cs.registerOutParameter(paramName, param.Type);// 设置输出类型参数
   }
  } else {
   cs.setObject(param.Name, param.Value);// 设置输入类型参数
  }
  }
 }
 }

 /**
 * 得到存储过程参数执行结果
 * 
 * @param cs
 * @param params
 * @throws SQLException
 */
 private static void getSqlParameter(CallableStatement cs,
  SqlParameter... params) throws SQLException {
 for (SqlParameter param : params) {
  if (param.OutPut) {
  String paramName = param.Name;
  if (paramName == null || paramName.equals("")) {
   param.Value = cs.getObject(1);// 返回类型参数值
  } else {
   param.Value = cs.getObject(paramName);// 输出类型参数值
  }
  }
 }
 }

 /**
 * 关闭JDBC对象,释放资源。
 * 
 * @param con
 *  连接对象
 * @param ps
 *  命令对象
 * @param rs
 *  结果集对象
 * @throws SQLException
 */
 private static void close(Connection con, Statement ps, ResultSet rs) {
 try {
//  rs.close(); //jiangxiang删除改行,当多次掉用该语句时会报空指针异常,因为rs已关闭。
  if (rs != null) {

  rs = null;
  }
  if (ps != null) {
  ps.close();
  ps = null;
  }
  if (con != null) {
  con.close();
  con = null;
  }
 } catch (SQLException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 }
}
/**
 * 存储过程参数类型
 * @author Administrator
 *
 */
public class SqlParameter {
 /**
 * 参数名称
 */
 public String Name;
 /**
 * 参数值
 */
 public Object Value;
 /**
 * true表示参数为输出类型
 */
 public boolean OutPut;
 /**
 * 参数类型
 */
 public int Type;
 /**
 * 输入类型参数的构造函数
 * @param name 存储过程 输入类型 参数名称
 * @param value 存储过程 输入类型 参数值
 */
 public SqlParameter(String name,Object value){
 this.Name = name;
 this.Value= value;
 }
 /**
 * 输出类型参数的构造函数
 * @param type 存储过程 输出类型 参数类型
 * @param name 存储过程 输出类型 参数名称
 */
 public SqlParameter(int type,String name){
 this.Name = name;
 this.OutPut = true;
 this.Type = type;
 }
 /**
 * 返回类型参数的构造函数
 * @param type 存储过程 返回类型
 */
 public SqlParameter(int type){
 this.Name = "";
 this.OutPut = true;
 this.Type = type;
 }
}

工具类挺好用的,不过使用的时候循环导入时报错,断点调试后发现close中有问题,将一行代码注释掉就好了。

最后测试下:

	public static void main(String[] args) throws Exception {
		List<Metal> list =captureJavascript();
		for(Metal metal : list){
			String sql = "insert into Metal([name],[price],[change],[upWater],[date]) values(‘" + metal.getName() + "‘,‘" + metal.getPrice() + "‘,‘" + metal.getChange() + "‘,‘" + metal.getUpWater() + "‘,‘" + metal.getDate() +"‘)";
			int identyValue = SqlHelper.executeIdentity(sql);
		}
		
	}

 成功,数据库和实体类不附上了。

 

 

使用java获取网页内容并存放在SqlServer数据库中

标签:

热心网友 时间:2022-04-08 21:39

简单地,使用 JSP 或 servlet 可以接收页面传递过来的参数了

~追问谢谢回答,我是新手,你说的我不懂,在百度中。。。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
...啊?我从嘴里吐出去是直的算过肺了吗?我不会从鼻子里出去_百度... 恶心呕吐是什么? 高考数学大题应注意哪些问题呢? 高考数学可不可以用高等数学啊 高考数学 基础知识点 常见考查方式 高考数学考什么内容 一般纳税人如何交所得税 以前的QQ忘记密码了那时候不要了就不找回密码了,现在想找回来,但是又没... 常州机场坐飞机流程 常州机场大巴时刻表 ...我早上九点起飞的飞机, 然后我这的机场快线大巴到机场时70分钟,_百 ... 十大钻戒品牌排名 世界钻戒品牌排行榜 怎样办理中国移动免费用流量的手机卡? 宋美龄的身高是多少 宋美龄106岁去世时,含泪说一生对不起三个男人,他们都是谁? 宋美龄的资料给我! 九几年出版的宋美龄传现在还能买到吗 红军远征的根本原因和直接原因是什么 宋美龄画传的介绍 内陆河流域的特点 西北内陆地区的河流都是内流河.__ 宋家三姐妹的宋美龄,颜值和才华如何? 风华绝代的宋美龄,算得上民国尊贵的女性吗? 地理中内流河什么意思 什么是内流河? 年轻时的宋氏三姐妹究竟长的怎么样? 什么是“内流河”﹖ 发源于内陆地区的河流就是内陆河? 内流河是什么意思 内流河属于什么性河流? winscp怎么堡垒机登录 舞阳县有什么工厂招聘 舞阳县最近有什么地方在招聘普工 0079118488263这个号码是国外的吗? 漯河市哪里在招工 0079025435279是俄罗斯什么地方电话?急急急 0079156243638这种是什么号码 漯河市舞阳县哪里招聘C1司机 0079.0085.0088是哪里发的短信 湖北恩施到哪里找得到招零工的信息 0o7开头的是什么电话 在哪个网站能查到招聘信息? 创意速写:用杯子和水表现出温暖和寒冷应该怎么画 比如说“温暖”,如何形象的表达出来? 用温暖的不同含义造句。 写午餐时刻的作文250 平凡的午餐作文300 特别的午餐作文三百字 以《快乐的午餐》为题目篇作文 午餐时间到了 作文400字(急急急!!!)在线等答~~~