现在大多数网站都是用ajax或iframe加载数据,用java程序获取到的只能是网页未渲染加载的代码,不能获取还没有加载入网页中的数据。用java实现的浏览器,可以实现获取网页渲染后,已经加载数据后的全部代码,从而可以获取网站上想要的信息

package com.wtj.browser;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.UIManager;

import org.jdesktop.jdic.browser.WebBrowser;
import org.jdesktop.jdic.browser.WebBrowserEvent;
import org.jdesktop.jdic.browser.WebBrowserListener;
/**
*
* @author  WTJ
*/
public class WTJBrowser extends JFrame implements ActionListener{
	   private JLabel label_info;
	   private javax.swing.JButton bt_back;
	   private javax.swing.JButton bt_forward;
	   private javax.swing.JButton bt_go;
	   private javax.swing.JButton bt_home;
	   private javax.swing.JButton bt_refresh;
	   private javax.swing.JButton bt_stop;
	   private javax.swing.JMenuItem item_about;
	   private javax.swing.JMenuItem item_close;
	   private javax.swing.JMenuItem item_looksource;
	   private javax.swing.JMenuItem item_new;
	   private javax.swing.JMenuItem item_open;
	   private javax.swing.JMenuBar jMenuBar1;
	   private javax.swing.JToolBar jToolBar1;
	   private javax.swing.JMenu menu_file;
	   private javax.swing.JMenu menu_help;
	   private javax.swing.JMenu menu_look;
	   private javax.swing.JToolBar toolbar_main;
	   private javax.swing.JTextField txt_url;

	   private String currentURL = "";
	   private WebBrowser browser;    
	   private final String defaultURL = "http://finance.qq.com/2012stock/ejym/zphb.htm";

   /** 
    * Creates new form JWebBrowser
    *  构造方法
    */
   public WTJBrowser() {
       initComponents();
       this.setIconImage(this.getToolkit().createImage(this.getClass().getClassLoader().getResource("images/sysicon.gif")));
       this.setExtendedState(JFrame.MAXIMIZED_BOTH);
       gotoURL(defaultURL);
   }
   /**
    * @author Administrator
    * @CreateDate Oct 11, 2012 10:10:37 AM
    * 方法说明: 浏览器初始化
    */
   private void initComponents() {
       toolbar_main = new javax.swing.JToolBar();
       bt_back 		= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/back.gif")));
       bt_forward 	= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/forward.gif")));
       bt_stop 		= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/stop.gif")));
       bt_refresh 	= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/refresh.gif")));
       bt_home 		= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/home.gif")));
       label_info 	= new JLabel();
       jToolBar1 	= new javax.swing.JToolBar();
       txt_url 		= new javax.swing.JTextField();
       bt_go 		= new javax.swing.JButton(new ImageIcon(this.getClass().getClassLoader().getResource("images/forward.gif")));
       jMenuBar1 	= new javax.swing.JMenuBar();
       menu_file 	= new javax.swing.JMenu();
       item_new 	= new javax.swing.JMenuItem();
       item_open 	= new javax.swing.JMenuItem();
       item_close 	= new javax.swing.JMenuItem();
       menu_look 	= new javax.swing.JMenu();
       item_looksource = new javax.swing.JMenuItem();
       menu_help 	= new javax.swing.JMenu();
       item_about 	= new javax.swing.JMenuItem();

       setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

       toolbar_main.setRollover(true);
       toolbar_main.setFloatable(false);

       bt_back.setToolTipText("后退");
       bt_back.setFocusable(false);
       bt_back.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_back.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       toolbar_main.add(bt_back);

       bt_forward.setToolTipText("前进");
       bt_forward.setFocusable(false);
       bt_forward.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_forward.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       toolbar_main.add(bt_forward);

       bt_stop.setToolTipText("停止");
       bt_stop.setFocusable(false);
       bt_stop.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_stop.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       toolbar_main.add(bt_stop);

       bt_refresh.setToolTipText("刷新");
       bt_refresh.setFocusable(false);
       bt_refresh.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_refresh.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       toolbar_main.add(bt_refresh);

       bt_home.setToolTipText("主页");
       bt_home.setFocusable(false);
       bt_home.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_home.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       toolbar_main.add(bt_home);

       browser = new WebBrowser();
       // 浏览器监听 
       browser.addWebBrowserListener(new WebBrowserListener(){

       //在文档加载完成时调用
	   public void documentCompleted(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("images/world.gif")));
			label_info.setText("完毕");
			currentURL = browser.getURL().toString();
			updateURLInput();
		}


		//在下载操作完成、中断或失败时调用
		public void downloadCompleted(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("images/world.gif")));
			label_info.setText("下载完毕");
		}


		//在下载操作过程中发生错误时调用
		public void downloadError(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			JOptionPane.showMessageDialog(WTJBrowser.this, "下载网页错误","错误",JOptionPane.ERROR_MESSAGE);
			label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("images/error.gif")));
			label_info.setText("下载错误");
		}


		//在下载操作过程被更新时调用
		public void downloadProgress(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			//label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("com/topking/browser/ui/images/error.gif")));
			//label_info.setText("下载错误");
		}


		//在下载操作开始时调用
		public void downloadStarted(WebBrowserEvent e) {
			label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("images/spinner.gif")));
			label_info.setText("正在打开"+currentURL);
		}


		//在状态栏文字发生变化时调用
		public void statusTextChange(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			label_info.setIcon(new ImageIcon(this.getClass().getClassLoader().getResource("images/page_url.gif")));
			label_info.setText(e.getData());
		}


		//在文档标题发生变化时调用
		public void titleChange(WebBrowserEvent e) {
			// TODO Auto-generated method stub
			WTJBrowser.this.setTitle(e.getData());
		}


		//
		public void windowClose(WebBrowserEvent e) {
			// TODO Auto-generated method stub
		}

       });

       jToolBar1.setRollover(true);
       jToolBar1.setFloatable(false);



       txt_url.setText(txt_url.getText().trim());
       txt_url.addKeyListener(new KeyAdapter(){
	       	public void keyPressed(KeyEvent e){
	       		if(e.getKeyCode()==10){//按下Enter键
	       			gotoURL(txt_url.getText().trim());        			
	       		}
	       	}
       });

       jToolBar1.add(txt_url);

       bt_go.setToolTipText("转到");
       bt_go.setFocusable(false);
       bt_go.setHorizontalTextPosition(javax.swing.SwingConstants.CENTER);
       bt_go.setVerticalTextPosition(javax.swing.SwingConstants.BOTTOM);
       jToolBar1.add(bt_go);

       menu_file.setText("文件");

       item_new.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_N, java.awt.event.InputEvent.CTRL_MASK));
       item_new.setText("新建");
      // menu_file.add(item_new);

       item_open.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_O, java.awt.event.InputEvent.CTRL_MASK));
       item_open.setText("打开");
       menu_file.add(item_open);

       item_close.setAccelerator(javax.swing.KeyStroke.getKeyStroke(java.awt.event.KeyEvent.VK_Q, java.awt.event.InputEvent.CTRL_MASK));
       item_close.setText("关闭");
       menu_file.add(item_close);

       jMenuBar1.add(menu_file);

       menu_look.setText("查看");

       item_looksource.setText("查看源文件");
       menu_look.add(item_looksource);

       jMenuBar1.add(menu_look);

       menu_help.setText("帮助");

       item_about.setText("关于作者");
       menu_help.add(item_about);
       item_about.addActionListener(new ActionListener(){
	       	public void actionPerformed(ActionEvent e){
	       		JOptionPane.showMessageDialog(WTJBrowser.this, "王统江","Author",JOptionPane.INFORMATION_MESSAGE);
	       	}
       });

       jMenuBar1.add(menu_help);

       setJMenuBar(jMenuBar1);        

       JPanel all_bar = new JPanel(new BorderLayout());
       all_bar.add(toolbar_main,BorderLayout.WEST);
       all_bar.add(jToolBar1,BorderLayout.CENTER);

       Container c = this.getContentPane();
       c.setLayout(new BorderLayout());
       c.add(all_bar,BorderLayout.NORTH);
       c.add(browser,BorderLayout.CENTER);
       c.add(label_info,BorderLayout.SOUTH);

       // add ationlistener for componnets
       bt_back.addActionListener(this);
       bt_forward.addActionListener(this);
       bt_stop.addActionListener(this);
       bt_refresh.addActionListener(this);
       bt_go.addActionListener(this);
       bt_home.addActionListener(this);
       item_new.addActionListener(this);
       item_open.addActionListener(this);
       item_close.addActionListener(this);
       item_looksource.addActionListener(this);
       item_about.addActionListener(this);

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


	public void actionPerformed(ActionEvent e) {
		//Buttons
		if(e.getSource()==bt_back){
			System.out.println("bt_back");
			browser.back();			
		}
		if(e.getSource()==bt_forward){
			System.out.println("bt_forward");
			browser.forward();			
		}
		if(e.getSource()==bt_stop){
			System.out.println("bt_stop");
			browser.stop();
		}
		if(e.getSource()==bt_refresh){
			System.out.println("bt_refresh");
			browser.refresh();
		}
		if(e.getSource()==bt_home){
			System.out.println("bt_home");
			gotoURL(defaultURL);
		}
		if(e.getSource()==bt_go){
			System.out.println("bt_go");
			String url = txt_url.getText().trim();
			if(url!=null&&!"".equals(url)){
				gotoURL(url);
			}
		}
		//MenuItems
		if(e.getSource()==item_new){
			System.out.println("item_new");
		}
		if(e.getSource()==item_open){
			System.out.println("item_open");
			 final JFrame frame = new JFrame("JDIC API Demo - FileChooser");

		        Container contentPane = frame.getContentPane();

		        contentPane.setLayout(new GridLayout(1, 1));

		        frame.addWindowListener(new WindowAdapter() {
		            public void windowClosing(WindowEvent e) {
		               // System.exit(0);
		            	frame.dispose();
		            }
		        });

		        frame.pack();
		        frame.setVisible(true);
		}
		if(e.getSource()==item_close){
			System.out.println("item_close");
			System.exit(0);
		}
		if(e.getSource()==item_looksource){
			System.out.println("item_looksource");
		}
		if(e.getSource()==item_about){
			System.out.println("item_about");
		}
	}


   public void updateURLInput(){
   		txt_url.setText(currentURL);
   }

   public boolean gotoURL(String url){
   	if(url!=null&&!"".equals(url)){
   		try {
				url = url.toLowerCase();
				URL Url = null;
				if(!url.startsWith("http://")){
					Url = new URL("http://"+url) ;
				}else{
					Url = new URL(url);
				}
				browser.setURL(Url);
				return true;
			} catch (MalformedURLException e) {
				JOptionPane.showMessageDialog(WTJBrowser.this, "打开网页错误:"+e.getMessage(),"错误",JOptionPane.ERROR_MESSAGE);
				e.printStackTrace();
			}

   	}
   	return false;
   }

   /**
   * @param args the command line arguments
   */
   public static void main(String args[])throws Exception {
   	try {
           UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
           java.awt.EventQueue.invokeLater(new Runnable() {
	            public void run() {
	            	WTJBrowser j = new WTJBrowser();
	            	j.setVisible(true);
	            }
	        });  
       }
       catch (Exception exception) {
           exception.printStackTrace();
       }
   }
}