`

利用HtmlUtil 从网页提取数据

阅读更多

最近炒股,发现几个好的网站(散户大家庭http://www.shdjt.com/  股票大单网http://www.gupiaodadan.cn/),提供了每天大量分析数据------入主力持仓排名、大单买入排名、板块资金流入排名、DDX排名等等,于是我利用HtmlUtil 工具包,写了一个程序,把这些数据从网页上提取出来,保存在我自己的Oracle数据库里面,以便进行统计分析,从中找出规律,呵呵。。。。希望大发一笔,下面是具体的程序。

 

 

 

 

 【开发环境】MyEclipse6.5.1、Oracle9i

 

【所需要的库文件】

 htmlunit-2.5.zip                                       下载地址 http://htmlunit.sourceforge.net/

 Oracle9i JDBC驱动程序classes12.jar          在Oracle9i的安装目录下面的JDBC文件夹里有

 

  【数据库设计】

--股票目录
drop table gpml;
create table gpml(
   gpdm   varchar2(6) primary key,--股票代码
   gpmc   varchar2(20),--股票名称
   ltgs   number(10),--流通股数
   zgs    number(10),--总股数
   ltbl   number(10),--流通比例
   mgyl   number,--每股盈利
   jzc    number,--净资产
   jlr    number,--净利润
   zxsj   varchar2(2500),--最新事件
   bz     varchar2(2500)--备注说明
);

--板块目录
create table bkml(
   bkid  number primary key,
   bkmc  varchar2(100),
   bc    varchar2(100)
);

--每日实时数据
--注意:此表即使股票停牌,也有把最近的DDX数据放入了
--写一个存储过程,生成每日的排名:参数是日期,注意那些停牌的哦,呵呵。。。。
create table daydata(
   gpdm  varchar2(6),
   rq     date,
   price  number,
   zf     number,
   ddx    number,
   ddy    number,
   ddz    number,
   ddx_sixty number,
   ddy_sixty number,
   ddx_tenl  number,
   ddx_tenc  number,
   tddc      number,
   ddc       number,
   zdc       number,
   xdc       number,
   hyd       number,
   dsb       number,
   tdmr      number,
   tdmc      number,
   ddmr      number,
   ddmc      number,
   zdmr      number,
   zdmc      number,
   xdmr      number,
   xdmc      number,
   hsl       number,
   lb        number,
   ddxpm     number,
   ddypm     number,
   ddzpm     number,
   constraint pk_daydata primary key(gpdm,rq)
);


--两市大单净买入全部排名
create table ddmrpm(
   gpdm  varchar2(6),
   rq    date,   
   pm    number,
   ddmr  number,
   ddmc  number,
   mrmcc number,
   cjl   number,
   jg    number,
   constraint pk_ddmrpm primary key(gpdm,rq)
);


--5日股票大单净买入排名50
create table fiveddmrpm(
   gpdm  varchar2(6),
   rq    date,   
   pm    number,
   ddmr  number,
   ddmc  number,
   mrmcc number,
   cjl   number,
   jg    number,
   constraint pk_fiveddmrpm primary key(gpdm,rq)
);

--10日股票大单净买入排名50
create table tenddmrpm(
   gpdm  varchar2(6),
   rq    date,   
   pm    number,
   ddmr  number,
   ddmc  number,
   mrmcc number,
   cjl   number,
   jg    number,
   constraint pk_tenddmrpm primary key(gpdm,rq)
);


--5日股票大单净卖出排名50
create table fiveddmcpm(
   gpdm  varchar2(6),
   rq    date,   
   pm    number,
   ddmr  number,
   ddmc  number,
   mrmcc number,
   cjl   number,
   jg    number,
   constraint pk_fiveddmcpm primary key(gpdm,rq)
);

--10日股票大单净卖出排名50
create table tenddmcpm(
   gpdm  varchar2(6),
   rq    date,   
   pm    number,
   ddmr  number,
   ddmc  number,
   mrmcc number,
   cjl   number,
   jg    number,
   constraint pk_tenddmcpm primary key(gpdm,rq)
);


--沪市Level-2数据 DDX 排名前50
--注意:此表如果股票停牌,没有把最近的DDX数据放入了
create table ddxpm(
   gpdm  varchar2(6),
   rq    date,   
   jg    number,
   zf    number,
   ddx   number,
   ddxpm number,
   ten_phts  number,
   ten_lxphts   number,
   ddy    number,
   ddypm  number,
   ddz    number,
   ddzpm  number,
   constraint pk_ddxpm primary key(gpdm,rq)
);


--两市板块资金净流入排名
create table bkzjlrpm(
   bkid  number,
   pm    number,
   rq    date,  
   lr    number,
   lc    number,
   jlr   number,--尽流入
   gpdm  varchar2(20),--代表个股
   constraint pk_bkzjlrpm primary key(bkid,rq)
);


--5日两市板块资金净流入排名
create table fivebkzjlrpm(
   bkid  number,
   rq    date,
   pm    number, 
   lr    number,
   lc    number,
   jlr   number,--尽流入
   constraint pk_fivebkzjlrpm primary key(bkid,rq)
);

--10日两市板块资金净流入排名
create table tenbkzjlrpm(
   bkid  number,
   pm    number,
   rq    date,  
   lr    number,
   lc    number,
   jlr   number,--尽流入
   constraint pk_tenbkzjlrpm primary key(bkid,rq)
);


--主力持仓排名(最新更新:2009年5月26日),把握主力资金的动向!
create table zlccpm(
   gpdm   varchar2(6),
   rq     date,
   adddec number,--增减性质 1代表增 0代表减
   dayNum number, --1日 5日 10日
   userType number,--主力分类:0主力 1特大户 2大户  3散户
   pm     number,--排名
   per    number,--增减百分比
   constraint pk_zlccpm primary key(gpdm,rq,adddec,dayNum,userType)   
)

 

 

       [用来进行排名的存储过程]

create or replace procedure produce_pm(in_Date IN daydata.rq%TYPE) is
  CURSOR cur_ddxpm is
    SELECT gpdm
      FROM daydata
      WHERE rq = trunc(in_Date)
       AND price > 0
     ORDER BY ddx desc,ddy desc,ddz desc;
    
  CURSOR cur_ddypm is
    SELECT gpdm
      FROM daydata
      WHERE rq = trunc(in_Date)
       AND price > 0
     ORDER BY ddy desc,ddx desc,ddz desc;    
    
  CURSOR cur_ddzpm is
    SELECT gpdm
      FROM daydata
      WHERE rq = trunc(in_Date)
       AND price > 0
     ORDER BY ddz desc,ddx desc,ddy desc;       
    
  curIndex NUMBER  :=0;
 
BEGIN
  FOR rec IN cur_ddxpm LOOP
    curIndex := curIndex + 1;
    update daydata set ddxpm=curIndex where gpdm=rec.gpdm and rq=trunc(in_date);
  END LOOP;
 
  curIndex:=0;
  FOR rec IN cur_ddypm LOOP
    curIndex := curIndex + 1;
    update daydata set ddypm=curIndex where gpdm=rec.gpdm and rq=trunc(in_date);
  END LOOP;
 
   
  curIndex:=0;
  FOR rec IN cur_ddzpm LOOP
    curIndex := curIndex + 1;
    update daydata set ddzpm=curIndex where gpdm=rec.gpdm and rq=trunc(in_date);
  END LOOP;
   
  commit;
end produce_pm;

 

 

    

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class ConnectionManager {
    public static Connection getConnection() {
	Connection conn = null;
	try {
	    DriverManager.registerDriver(new oracle.jdbc.OracleDriver());

	    String url = "jdbc:oracle:oci8:@";
	    try {
		String url1 = System.getProperty("JDBC_URL");
		if (url1 != null)
		    url = url1;
	    } catch (Exception e) {
		e.printStackTrace();
	    }

	    conn = DriverManager.getConnection(url, "gp", "gp");
	} catch (Exception e1) {
	    e1.printStackTrace();
	}
	return conn;
    }
}

 

 

 

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.IOException;
import java.net.MalformedURLException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlTable;
import com.gargoylesoftware.htmlunit.html.HtmlTableRow;


public class DataImport extends javax.swing.JFrame {
    String zlccDate = null;//主力持仓,赢富数据要慢一天

    /**
     * 构造函数
     */
    public DataImport() {
	initComponents();
	Calendar calendar = Calendar.getInstance();
	calendar.add(Calendar.DAY_OF_MONTH, -1);
	this.txtZlcc.setText(new SimpleDateFormat("yyyy-MM-dd").format(calendar.getTime()));
	this.txtDate.setText(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));

	Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
	Dimension frameSize = this.getPreferredSize();

	if (frameSize.height > screenSize.height)
	    frameSize.height = screenSize.height;
	if (frameSize.width > screenSize.width)
	    frameSize.width = screenSize.width;

	this.setLocation((screenSize.width - frameSize.width) / 2, (screenSize.height - frameSize.height) / 2);
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
	jPanel1 = new javax.swing.JPanel();
	btnImport = new javax.swing.JButton();
	txtDate = new javax.swing.JTextField();
	jScrollPane1 = new javax.swing.JScrollPane();
	txtStatus = new javax.swing.JTextArea();
	txtZlcc = new javax.swing.JTextField();
	jLabel1 = new javax.swing.JLabel();

	setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

	btnImport.setText("\u5f00\u59cb\u5bfc\u5165\u6570\u636e");
	btnImport.addActionListener(new java.awt.event.ActionListener() {
	    public void actionPerformed(java.awt.event.ActionEvent evt) {
		btnImportActionPerformed(evt);
	    }
	});

	txtStatus.setColumns(20);
	txtStatus.setRows(5);
	jScrollPane1.setViewportView(txtStatus);

	jLabel1.setText("\u4e3b\u529b\u6301\u4ed3\u6392\u540d");

	org.jdesktop.layout.GroupLayout jPanel1Layout = new org.jdesktop.layout.GroupLayout(jPanel1);
	jPanel1.setLayout(jPanel1Layout);
	jPanel1Layout.setHorizontalGroup(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
		jPanel1Layout.createSequentialGroup().add(
			jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(jPanel1Layout.createSequentialGroup().addContainerGap().add(jScrollPane1, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 425, Short.MAX_VALUE)).add(
				jPanel1Layout.createSequentialGroup().add(49, 49, 49).add(
					jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(btnImport).add(
						jPanel1Layout.createSequentialGroup().add(txtDate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 136, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(16, 16, 16).add(jLabel1).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(txtZlcc,
							org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 121, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))).add(37, 37, 37))).addContainerGap()));
	jPanel1Layout.setVerticalGroup(jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING).add(
		jPanel1Layout.createSequentialGroup().addContainerGap().add(
			jPanel1Layout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE).add(txtDate, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).add(jLabel1).add(txtZlcc,
				org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE).add(
			btnImport).addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED).add(jScrollPane1, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 352, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE).addContainerGap()));

	getContentPane().add(jPanel1, java.awt.BorderLayout.CENTER);

	pack();
    }// </editor-fold>

    private void btnImportActionPerformed(java.awt.event.ActionEvent evt) {
	SwingWorker<Object, Object> sw = new SwingWorker<Object, Object>() {
	    protected Object doInBackground() throws Exception {
		importData();
		return null;
	    }
	};
	sw.execute();
    }

    /**
     * 按钮事件,正式套入数据
     */
    private void importData() {
	String importDate = this.txtDate.getText();
	zlccDate=this.txtZlcc.getText();
	
	final WebClient webClient = new WebClient();

	//1 首先导入每日数据(来自散户大家庭)
	this.txtStatus.append("开始导入http://www.shdjt.com/中的每日数据........");
	try {
	    importDayData(webClient, importDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}
	this.txtStatus.append("\n");

	//2 当日板块、五日板块、十日板块资金流入
	this.txtStatus.append("\n开始导入当日板块、五日板块、十日板块资金流入........");
	try {
	    importBkData(webClient, zlccDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}
	this.txtStatus.append("\n");

	//3 两市大单净买入全部排名 当日、五日、十日
	this.txtStatus.append("\n开始导入两市大单净买入全部排名 当日、五日、十日........");
	try {
	    importDDmrpm(webClient, importDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}
	this.txtStatus.append("\n");

	//4 沪市Level-2数据 DDX 排名前50
	this.txtStatus.append("\n开始导入沪市Level-2数据 DDX 排名前50........");
	try {
	    importDDXpm(webClient, importDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}
	this.txtStatus.append("\n");

	//5 主力持仓排名
	this.txtStatus.append("\n开始导入主力持仓排名........");
	try {
	    importZlCCData(webClient, importDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}
	this.txtStatus.append("\n");

	//6 调用存储过程,对每日数据进行排名(DDX,DDY,DDZ)
	this.txtStatus.append("\n开始执行存储过程........");
	try {
	    callProcForPM(importDate);
	    this.txtStatus.append("\n成功!");
	} catch (Exception e) {
	    e.printStackTrace();
	    this.txtStatus.append("\n失败!");
	    return;
	}

	this.txtStatus.append("\n-----------------全部成功-----------------");

    }

    /**
     * 每日详细数据(散户大家庭)
     * @param webClient
     * @param importDate
     * @throws Exception
     */
    public void importDayData(WebClient webClient, String importDate) throws Exception {
	final HtmlPage page = webClient.getPage("http://www.shdjt.com/");
	final HtmlTable tableElement = (HtmlTable) page.getByXPath("//table[@bgcolor='#FFffff']").get(0);

	List<HtmlTableRow> list = tableElement.getRows();
	int size = list.size();

	List<HtmlTableRow> list2 = list.subList(2, size);

	PreparedStatement pstmt = null;
	Connection conn = null;
	Number a;
	NumberFormat nf = NumberFormat.getInstance();
	try {
	    conn = ConnectionManager.getConnection();
	    pstmt = conn.prepareStatement("insert into daydata(gpdm,rq,price,zf,ddx,ddy,ddz,ddx_sixty,ddy_sixty,ddx_tenl,ddx_tenc,tddc,ddc,zdc,xdc,hyd,dsb,tdmr,tdmc,ddmr,ddmc,zdmr,zdmc,xdmr,xdmc,hsl,lb) " + "values (?,to_date('" + importDate
		    + "','yyyy-MM-dd'),?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

	    for (final HtmlTableRow row : list2) {
		pstmt.setString(1, isNull(row.getCell(3).asText()));// 股票代码
		pstmt.setFloat(2, Float.valueOf(isNull(row.getCell(5).asText())).floatValue());// 价格
		pstmt.setFloat(3, Float.valueOf(isNull(row.getCell(6).asText())).floatValue());// 涨幅
		pstmt.setFloat(4, Float.valueOf(isNull(row.getCell(7).asText())).floatValue());//
		pstmt.setFloat(5, Float.valueOf(isNull(row.getCell(8).asText())).floatValue());//
		pstmt.setFloat(6, nf.parse(row.getCell(9).asText()).floatValue());//DDZ
		pstmt.setFloat(7, Float.valueOf(isNull(row.getCell(10).asText())).floatValue());//
		pstmt.setFloat(8, Float.valueOf(isNull(row.getCell(11).asText())).floatValue());//
		pstmt.setInt(9, Integer.valueOf(isNull(row.getCell(12).asText())).intValue());// 10日次数
		pstmt.setInt(10, Integer.valueOf(isNull(row.getCell(13).asText())).intValue());// 10日次数连续
		pstmt.setFloat(11, Float.valueOf(isNull(row.getCell(14).asText())).floatValue());//
		pstmt.setFloat(12, Float.valueOf(isNull(row.getCell(15).asText())).floatValue());//
		pstmt.setFloat(13, Float.valueOf(isNull(row.getCell(16).asText())).floatValue());//
		pstmt.setFloat(14, Float.valueOf(isNull(row.getCell(17).asText())).floatValue());//
		pstmt.setInt(15, Integer.valueOf(isNull(row.getCell(18).asText())).intValue());// 活跃度
		pstmt.setFloat(16, Float.valueOf(isNull(row.getCell(19).asText())).floatValue());//
		pstmt.setFloat(17, Float.valueOf(isNull(row.getCell(20).asText())).floatValue());//
		pstmt.setFloat(18, Float.valueOf(isNull(row.getCell(21).asText())).floatValue());//
		pstmt.setFloat(19, Float.valueOf(isNull(row.getCell(22).asText())).floatValue());//
		pstmt.setFloat(20, Float.valueOf(isNull(row.getCell(23).asText())).floatValue());//
		pstmt.setFloat(21, Float.valueOf(isNull(row.getCell(24).asText())).floatValue());//
		pstmt.setFloat(22, Float.valueOf(isNull(row.getCell(25).asText())).floatValue());//
		pstmt.setFloat(23, Float.valueOf(isNull(row.getCell(26).asText())).floatValue());//
		pstmt.setFloat(24, Float.valueOf(isNull(row.getCell(27).asText())).floatValue());//
		pstmt.setFloat(25, Float.valueOf(isNull(row.getCell(28).asText())).floatValue());//
		pstmt.setFloat(26, Float.valueOf(isNull(row.getCell(29).asText())).floatValue());//

		pstmt.addBatch();
	    }
	    pstmt.executeBatch();
	    conn.commit();
	} finally {
	    try {
		pstmt.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	}
    }

    public static String isNull(String s) {
	String p = "0.0";
	int leng = s.length();

	if (s != null && leng > 0)
	    p = s;

	return p;
    }

    /**
     * 当日板块、五日板块、十日板块资金流入
     * @param webClient
     * @param currentDate
     */
    public void importBkData(WebClient webClient, String currentDate) throws Exception {
	importBkzjData(webClient, "http://www.gupiaodadan.cn/bankuai.jsp", "bkzjlrpm", currentDate);
	importBkzjData(webClient, "http://www.gupiaodadan.cn/bankuaimore-2", "fivebkzjlrpm", currentDate);
	importBkzjData(webClient, "http://www.gupiaodadan.cn/bankuaimore-1", "tenbkzjlrpm", currentDate);
    }

    public void importBkzjData(WebClient webClient, String url, String tableName, String date) throws Exception {
	PreparedStatement pstmt = null;
	Connection conn = null;

	try {
	    final HtmlPage page = webClient.getPage(url);
	    final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='tablecontent']").get(0);

	    HtmlTable tableElement = (HtmlTable) div.getHtmlElementsByTagName("table").get(0);

	    List<HtmlTableRow> list = tableElement.getRows();
	    int size = list.size();

	    List<HtmlTableRow> list2 = list.subList(1, size);

	    conn = ConnectionManager.getConnection();
	    if (tableName.equalsIgnoreCase("bkzjlrpm"))
		pstmt = conn.prepareStatement("insert into " + tableName + "(bkid,rq,pm,lr,lc,jlr,gpdm) values (?,to_date('" + date + "','yyyy-MM-dd'),?,?,?,?,?)");
	    else
		pstmt = conn.prepareStatement("insert into " + tableName + "(bkid,rq,pm,lr,lc,jlr) values (?,to_date('" + date + "','yyyy-MM-dd'),?,?,?,?)");

	    for (final HtmlTableRow row : list2) {
		int pm = Integer.valueOf(row.getCell(0).asText());// 排名

		HtmlElement tdElement = row.getHtmlElementsByTagName("td").get(1);
		HtmlElement aElement = tdElement.getHtmlElementsByTagName("a").get(0);
		String strUrl = aElement.getAttribute("href");
		int startIndex = strUrl.lastIndexOf("-");
		String bkId = strUrl.substring(startIndex + 1, strUrl.length());

		float lr = Float.valueOf(row.getCell(2).asText()).floatValue();
		float lc = Float.valueOf(row.getCell(3).asText()).floatValue();
		float jlr = Float.valueOf(row.getCell(4).asText()).floatValue();

		pstmt.setInt(1, Integer.valueOf(bkId).intValue());
		pstmt.setInt(2, pm);
		pstmt.setFloat(3, lr);
		pstmt.setFloat(4, lc);
		pstmt.setFloat(5, jlr);

		if (tableName.equalsIgnoreCase("bkzjlrpm")) {
		    tdElement = row.getHtmlElementsByTagName("td").get(5);
		    aElement = tdElement.getHtmlElementsByTagName("a").get(0);
		    strUrl = aElement.getAttribute("href");
		    String gpdm = strUrl.substring(strUrl.length() - 6);
		    pstmt.setString(6, gpdm);
		}

		pstmt.addBatch();
	    }
	    pstmt.executeBatch();
	    conn.commit();
	} finally {
	    try {
		pstmt.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	}
    }

    /**
     * 两市大单净买入全部排名 当日、五日、十日
     * @param webClient
     * @param currentDate
     * @throws Exception
     */
    public void importDDmrpm(WebClient webClient, String currentDate) throws Exception {
	// 当日买卖排名
	String currentURL = "http://www.gupiaodadan.cn/all.jsp";
	importDdMrData(webClient, currentURL, "ddmrpm", currentDate);

	// 五日买入
	String fivemrURL = "http://www.gupiaodadan.cn/more-3";
	importDdMrData(webClient, fivemrURL, "fiveddmrpm", currentDate);

	// 十日买入
	String tenmrURL = "http://www.gupiaodadan.cn/more-4";
	importDdMrData(webClient, tenmrURL, "tenddmrpm", currentDate);

	// 五日卖出
	String fivemcURL = "http://www.gupiaodadan.cn/more-5";
	importDdMrData(webClient, fivemcURL, "fiveddmcpm", currentDate);

	// 十日卖出
	String tenmcURL = "http://www.gupiaodadan.cn/more-6";
	importDdMrData(webClient, tenmcURL, "tenddmcpm", currentDate);
    }

    public static void importDdMrData(WebClient webClient, String url, String tableName, String date) throws Exception {
	PreparedStatement pstmt = null;
	Connection conn = null;
	NumberFormat nf = NumberFormat.getInstance();

	try {
	    final HtmlPage page = webClient.getPage(url);
	    final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='tablecontent']").get(0);

	    HtmlTable tableElement = (HtmlTable) div.getHtmlElementsByTagName("table").get(0);

	    List<HtmlTableRow> list = tableElement.getRows();
	    int size = list.size();

	    List<HtmlTableRow> list2 = list.subList(1, size);

	    conn = ConnectionManager.getConnection();
	    pstmt = conn.prepareStatement("insert into " + tableName + "(gpdm,rq,pm,ddmr,ddmc,mrmcc,cjl,jg) values (?,to_date('" + date + "','yyyy-MM-dd'),?,?,?,?,?,?)");
	    for (final HtmlTableRow row : list2) {
		int pm = Integer.valueOf(row.getCell(0).asText());
		String gpdm = row.getCell(1).asText();

		int ddmr = nf.parse(row.getCell(3).asText()).intValue();
		int ddmc = nf.parse(row.getCell(4).asText()).intValue();
		int mrmcc = ddmr - ddmc;
		int cjl = nf.parse(row.getCell(5).asText()).intValue();
		float jg = Float.valueOf(row.getCell(6).asText()).floatValue();

		pstmt.setString(1, gpdm);
		pstmt.setInt(2, pm);
		pstmt.setInt(3, ddmr);
		pstmt.setInt(4, ddmc);
		pstmt.setInt(5, mrmcc);
		pstmt.setInt(6, cjl);
		pstmt.setFloat(7, jg);

		pstmt.addBatch();
	    }
	    pstmt.executeBatch();
	    conn.commit();
	} finally {
	    try {
		pstmt.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	}
    }

    /**
     * 沪市Level-2数据 DDX 排名前50
     * @param webClient
     * @param curDate
     * @throws Exception
     */
    public void importDDXpm(WebClient webClient, String curDate) throws Exception {

	final HtmlPage page = webClient.getPage("http://www.gupiaodadan.cn/level2-home-1");
	final HtmlDivision div = (HtmlDivision) page.getByXPath("//div[@class='tablecontent']").get(0);

	HtmlTable tableElement = (HtmlTable) div.getHtmlElementsByTagName("table").get(0);

	List<HtmlTableRow> list = tableElement.getRows();
	int size = list.size();

	List<HtmlTableRow> list2 = list.subList(2, size);

	PreparedStatement pstmt = null;
	Connection conn = null;

	try {
	    conn = ConnectionManager.getConnection();
	    pstmt = conn.prepareStatement("insert into ddxpm( gpdm,rq,jg,zf,ddx,ddxpm,ten_phts,ten_lxphts,ddy,ddypm,ddz,ddzpm) " + "values (?,to_date('" + curDate + "','yyyy-MM-dd'),?,?,?,?,?,?,?,?,?,?)");
	    for (final HtmlTableRow row : list2) {
		pstmt.setString(1, row.getCell(0).asText());
		pstmt.setFloat(2, Float.valueOf(row.getCell(2).asText()).floatValue());
		pstmt.setFloat(3, Float.valueOf(row.getCell(3).asText()).floatValue());
		pstmt.setFloat(4, Float.valueOf(row.getCell(4).asText()).floatValue());
		pstmt.setInt(5, Integer.valueOf(row.getCell(5).asText()).intValue());
		pstmt.setInt(6, Integer.valueOf(row.getCell(6).asText()).intValue());
		pstmt.setInt(7, Integer.valueOf(row.getCell(7).asText()).intValue());
		pstmt.setFloat(8, Float.valueOf(row.getCell(8).asText()).floatValue());
		pstmt.setInt(9, Integer.valueOf(row.getCell(9).asText()).intValue());
		pstmt.setFloat(10, Float.valueOf(row.getCell(10).asText()).floatValue());
		pstmt.setInt(11, Integer.valueOf(row.getCell(11).asText()).intValue());
		pstmt.addBatch();
	    }
	    pstmt.executeBatch();
	    conn.commit();
	} finally {
	    try {
		pstmt.close();
		conn.close();
	    } catch (SQLException e) {

	    }
	}
    }

    /**
     * 主力持仓排名
     * @param webClient
     * @param sDate
     * @throws Exception
     */
    public static void importZlCCData(WebClient webClient, String sDate) throws Exception {
	PreparedStatement pstmt = null;
	Connection conn = null;

	try {
	    conn = ConnectionManager.getConnection();
	    pstmt = conn.prepareStatement("insert into zlccpm(gpdm,rq,adddec,dayNum,userType,pm,per) " + "values (?,to_date('" + sDate + "','yyyy-MM-dd'),?,?,?,?,?)");

	    final HtmlPage page = webClient.getPage("http://www.gupiaodadan.cn/topview-search.jsp");

	    List<?> listDivs = page.getByXPath("//div[@class=\"fr02\"]");

	    //adddec number,--增减性质 1代表增 0代表减
	    //dayNum number, --1代表1日 5代表5日 10代表10日
	    //userType number,--主力分类:0主力 1特大户 2大户  3散户

	    // 1日主力增仓
	    HtmlDivision div = (HtmlDivision) listDivs.get(0);
	    processData(div, pstmt, 1, 1, 0);

	    // 1日特大户增仓
	    div = (HtmlDivision) listDivs.get(1);
	    processData(div, pstmt, 1, 1, 1);

	    // 1日大户增仓
	    div = (HtmlDivision) listDivs.get(2);
	    processData(div, pstmt, 1, 1, 2);

	    // 1日散户减仓
	    div = (HtmlDivision) listDivs.get(3);
	    processData(div, pstmt, 0, 1, 3);

	    //-------------------------------------------
	    // 5日主力增仓
	    div = (HtmlDivision) listDivs.get(4);
	    processData(div, pstmt, 1, 5, 0);

	    // 5日特大户增仓
	    div = (HtmlDivision) listDivs.get(5);
	    processData(div, pstmt, 1, 5, 1);

	    // 5日大户增仓
	    div = (HtmlDivision) listDivs.get(6);
	    processData(div, pstmt, 1, 5, 2);

	    // 5日散户减仓
	    div = (HtmlDivision) listDivs.get(7);
	    processData(div, pstmt, 0, 5, 3);

	    //-------------------------------------------
	    // 10日主力增仓
	    div = (HtmlDivision) listDivs.get(8);
	    processData(div, pstmt, 1, 10, 0);

	    // 10日特大户增仓
	    div = (HtmlDivision) listDivs.get(9);
	    processData(div, pstmt, 1, 10, 1);

	    // 10日大户增仓
	    div = (HtmlDivision) listDivs.get(10);
	    processData(div, pstmt, 1, 10, 2);

	    // 10日散户减仓
	    div = (HtmlDivision) listDivs.get(11);
	    processData(div, pstmt, 0, 10, 3);

	    pstmt.executeBatch();
	    conn.commit();
	} finally {
	    try {
		pstmt.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	}
    }

    public static void processData(HtmlDivision div, PreparedStatement pstmt, int adddec, int dayNum, int userType) throws Exception {
	HtmlTable tableElement = (HtmlTable) div.getHtmlElementsByTagName("table").get(0);

	List<HtmlTableRow> list = tableElement.getRows();
	int size = list.size();

	List<HtmlTableRow> list2 = list.subList(1, size);

	// gpdm,rq,adddec,dayNum,userType,pm,per
	for (final HtmlTableRow row : list2) {
	    pstmt.setInt(5, Integer.parseInt(row.getCell(0).asText()));// 排名

	    HtmlElement tdElement = row.getHtmlElementsByTagName("td").get(1);
	    HtmlElement aElement = tdElement.getHtmlElementsByTagName("a").get(0);
	    String strUrl = aElement.getAttribute("href");
	    int startIndex = strUrl.lastIndexOf("-");
	    String gpdm = strUrl.substring(startIndex + 1, strUrl.length());

	    pstmt.setString(1, gpdm);
	    pstmt.setInt(2, adddec);
	    pstmt.setInt(3, dayNum);
	    pstmt.setInt(4, userType);
	    pstmt.setFloat(6, Float.parseFloat(row.getCell(2).asText()));//百分比

	    pstmt.addBatch();
	}
    }

    private void callProcForPM(String strDate) throws Exception {
	Connection conn = ConnectionManager.getConnection();
	CallableStatement cs = null;
	try {
	    cs = conn.prepareCall("{call produce_pm(?)}");
	    cs.setDate(1, new java.sql.Date(new SimpleDateFormat("yyyy-MM-dd").parse(strDate).getTime()));
	    cs.executeUpdate();
	} finally {
	    try {
		cs.close();
		conn.close();
	    } catch (SQLException e) {
		e.printStackTrace();
	    }
	}
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
	java.awt.EventQueue.invokeLater(new Runnable() {
	    public void run() {
		new DataImport().setVisible(true);
	    }
	});
    }

    //GEN-BEGIN:variables
    // Variables declaration - do not modify
    private javax.swing.JButton btnImport;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField txtDate;
    private javax.swing.JTextArea txtStatus;
    private javax.swing.JTextField txtZlcc;
    // End of variables declaration//GEN-END:variables
}

 

   

    

  • 大小: 13.3 KB
分享到:
评论
1 楼 Heppy 2013-08-29  
向楼主的无私奉献致敬

相关推荐

    html_getData.rar_getdata_htmlutil 使用_获取网页

    在本案例中,我们关注的是如何利用一个名为`htmlutil`的工具包来从HTML网页中提取数据,特别是图片资源。这个过程涉及到网页解析、DOM操作以及HTTP请求。 首先,`htmlutil`包可能是一个专门为处理HTML文档而设计的...

    Java利用HtmlUtil和jsoup爬取知网中国专利数据的爬虫程序.zip

    其主要功能是访问网页、提取数据并存储,以便后续分析或展示。爬虫通常由搜索引擎、数据挖掘工具、监测系统等应用于网络数据抓取的场景。 爬虫的工作流程包括以下几个关键步骤: URL收集: 爬虫从一个或多个初始...

    htmlutil所需jar

    HTMLUtil是一个基于Java的工具,主要用于处理HTML相关的任务,如网页解析、数据提取等。在进行HTMLUtil的开发或使用时,常常会依赖一系列的外部库,这些库可以帮助我们更方便地操作HTML文档。在提供的文件列表中,...

    htmlutil包

    在网页信息抓取(Web Scraping)中,这种能力特别重要,因为可以自动化地从动态加载或者需要交互的网站上获取数据。 HTMLUnit是一个流行的无头浏览器库,常被用作Java平台上的Web测试工具。HTMLUnit模拟了一个完整...

    知网-基于Java+HtmlUtil+jsoup实现爬取知网中国专利数据.zip

    3. **提取数据**:利用Jsoup的选择器或者遍历DOM树,提取出每一条专利的关键信息,如专利号、发明人、专利类型、申请日期等。 4. **处理分页**:如果专利数据分布在多个页面,需要识别并处理分页链接,循环执行上述...

    excel转换html类(Excel2HtmlUtil的JAVA类)

    这种转换通常在数据展示、网页报告或者需要在Web环境中浏览Excel数据的场景中使用。 【描述】中提到的“PIO万能转换”可能是指Apache POI项目,这是一个流行的开源库,用于读写Microsoft Office格式的文件,包括...

    htmlUtil.rar

    这两个类通过html的路径,将html提取为html内容的字符串,然后进行提取body里的内容,进行去除行间样式以及css等,然后还可以去除空行等,筛选出不需要的标签,当前类保留img标签,转换后可以自行设置img网络地址,...

    HtmlUtil.java

    html 工具类 * @param disrPath 生成html的存放路径 * @param fileName 生成html名字 * @return void 返回类型

    最新版htmlutil,java无界面浏览器开发包

    最新版htmlutil,java无界面浏览器开发包

    C# 抓取网页常用类

    通过理解并熟练掌握上述知识,开发者可以更有效地从网页中提取有价值的数据,无论是用于数据分析、网站爬虫还是其他自动化任务。尤其在处理大量网页数据时,合理运用C#中的这些功能,可以大大提高开发效率和数据处理...

    通过htmlunit获取执行js代码后的html文档

    这个库在自动化测试、网页抓取以及其他需要与网页交互的场景中非常有用。通过HTMLUnit,开发者可以编写程序来模拟用户在浏览器上的操作,如点击链接、填写表单、执行JavaScript等,而无需真正打开一个浏览器实例。 ...

    htmlunit java版无界面浏览器 网页自动登录

    htmlunit java版无界面浏览器 实现网页自动登录利器 官方最新下载 htmlunit 是一款开源的java 页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源...

    java将excel转html

    每个单元格可以用Cell类表示,我们可以根据其类型(数值、字符串等)提取数据。 ```java for (Row row : sheet) { for (Cell cell : row) { String cellValue = cell.getStringCellValue(); // 对于字符串类型 } ...

    Htmlunit2.23-bin.zip

    HTMLUnit是一个强大的Java库,它模拟了一个无头Web浏览器,主要用于自动化测试和网页抓取。... ...这对于创建自动化测试脚本或构建爬虫程序...通过理解和熟练使用这个库,开发者可以构建出精确、灵活的网页数据提取系统。

    htmlunit-2.30-bin.zip

    htmlunit是一款开源的java页面分析工具,读取页面后,可以有效的使用htmlunit分析页面上的内容。项目可以模拟浏览器运行,被誉为java浏览器的开源实现。这个没有界面的浏览器,运行速度也是非常迅速的。...

    Zhuyi.Utility

    6. **HTML源码解析**(HtmlUtil):HtmlUtil为解析和操作HTML文档提供了强大的工具,可以提取、修改网页元素,对于网页爬虫或自动化测试等场景尤其有用。 7. **图像处理**(ImageUtil):图像裁剪和缩放功能,使得...

    抓取爬虫jar

    它可以纠正HTML的语法错误,帮助爬虫正确解析复杂的网页结构,从而提取出所需的数据。 综合这些库,我们可以构建一个强大的网络爬虫,能够处理包含复杂JavaScript的网页,同时能够解析不规范的HTML,从而有效地抓取...

    htmlunit-2.33-API文档-中文版.zip

    赠送jar包:htmlunit-2.33.jar; 赠送原API文档:htmlunit-2.33-javadoc.jar; 赠送源代码:htmlunit-2.33-sources.jar; 赠送Maven依赖信息文件:htmlunit-2.33.pom; 包含翻译后的API文档:htmlunit-2.33-javadoc-...

    Access Objects from Velocity

    - `getterUtil`、`htmlUtil`、`httpUtil`、`imageToken`、`iteratorTool`、`listTool`、`localeUtil`、`mathTool`、`numberTool`、`paramUtil`、`portalUtil`、`portalprefsPropsUtil`、`propsUtil`、`...

Global site tag (gtag.js) - Google Analytics