`

利用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  
向楼主的无私奉献致敬

相关推荐

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

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

    html_getData.rar_getdata_htmlutil 使用_获取网页

    使用htmlutil包获取网页中的图片,获取后的图片保存在本机中。

    htmlutil包

    这是一个htmlutil包,可以实现网页的模拟功能,使用此包的方法可以模拟页面的点击等。

    htmlutil所需jar

    htmlutil所需jar包,HtmlUnit本来是一款自动化测试的工具,它采用了HttpClient和Java自带的网络api结合来实现

    htmlUtil.rar

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

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

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

    HtmlUtil.java

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

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

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

    excel转换html类(Excel2HtmlUtil的JAVA类)

    这款EXCEL转换HTML利用PIO万能转换,来源与CSDN网上资源,我只是吧所有JAR包和程序源码放在一起便于快速开发测试使用。本人测试整理好用。

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

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

    htmlunit-2.30-bin.zip

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

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

    获取执行js代码后的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-...

    Htmlunit2.23-bin.zip

    htmlunit jar zip 2.23 用于html爬虫

    JS Html转义和反转义(html编码和解码)的实现与使用方法总结

    分享给大家供大家参考,...var HtmlUtil = { /*1.用浏览器内部转换器实现html编码(转义)*/ htmlEncode:function (html){ //1.首先动态创建一个容器标签元素,如DIV var temp = document.createElement ("div");

    java-utils常用工具类打包.zip

    java_utils常用工具类打包,欲善其事必先利其器,本资源内容为Java开发常用工具类打包,如BeanUtil,ArrayUtil,HtmlUtil,ClassUtil,DateUtil,FileUtil,FontUtil,ImageUtil,IOUtil, IPUtil, MapUtil,MailUtil,...

    一个开源的Java基础工具包

    此时即可调用C3p0Ds.getDataSource()或DruidDs.getDataSource()方法获得默认的数据源 如果要自定义数据库配置文件的参数,请调用相应的init(),传入相关参数 注:Setting对象请参考与之对应的章节 2、...

    java的一些简单工具类

    WebUtil.java,HtmlUtil.java,PathUtil.java,DateUtil.java,StringFormat.java 有获取ip,获取mac,字符串参数化,时间转换,html标签过滤等方法,下载下来后见项目,放到包里面,注意包名的一致

    IpUtil.java

    资源内容:工欲善其事必先利其器,本资源内容为Java开发常用工具类打包,如BeanUtil,ArrayUtil,HtmlUtil,ClassUtil,DateUtil,FileUtil,FontUtil,ImageUtil,IOUtil, IPUtil, MapUtil,MailUtil, NumberUtil,...

Global site tag (gtag.js) - Google Analytics