实时股价——可以查询股票当前价格。用户可以设定数据刷新频率,程序会用绿色和红色的箭头表示股价走势。

Python爬虫+JAVA绘制图像

项目中java需要安装Jfreechart

从百度股票爬取“恒生指数”股票的信息通过socket传给JAVA

涨跌时更改颜色可以选择在frame中添加文本框,显示涨跌。

也可以调整折现的颜色。就不一一实现

import requests
from bs4 import BeautifulSoup
import traceback
import re
import socket
import time
def getHTMLText(url):

    try:
        

        headers = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0"}

        r = requests.get(url,headers=headers)

        r.raise_for_status()

        r.encoding = r.apparent_encoding

        return r.text

    except: 

        return ""

    
    

            
def main():
    url = "https://gupiao.baidu.com/stock/hkHSI.html"
    sock = socket.socket()
    hostname = socket.gethostname()
    port = 3000
    sock.connect((hostname,port))
    while True:

        html = getHTMLText(url)
        soup1 = BeautifulSoup(html,'html.parser')
        soup=soup1
        stockInfo = soup1.find('div',attrs = {'class':'price'})
        date =      soup.find('span',attrs = {'class':'state'})
        stockInfo_str  = str(stockInfo) 
        date_str = str(date)
        stockInfo_str+="\r\n"
        print(stockInfo_str+date_str)
        b=bytes(stockInfo_str+date_str, encoding = "utf-8")  
        sock.send(b)
        print("Content Sent")
        time.sleep(30)



main()

JAVA端使用jfreeChart绘制动态折线图:

package worn;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.data.time.Millisecond;
import org.jfree.data.time.Second;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;

public class RealTimeChart extends ChartPanel {
	private static TimeSeries timeSeries;
	private long value = 0;

	public RealTimeChart(String chartContent, String title, String yaxisName) {
		super(createChart(chartContent, title, yaxisName));
	}

	private static JFreeChart createChart(String chartContent, String title, String yaxisName) {
		// 创建时序图对象
		timeSeries = new TimeSeries(chartContent, Second.class);
		TimeSeriesCollection timeseriescollection = new TimeSeriesCollection(timeSeries);
		JFreeChart jfreechart = ChartFactory.createTimeSeriesChart(title, "时间(秒)", yaxisName, timeseriescollection,
				true, true, false);
		XYPlot xyplot = jfreechart.getXYPlot();
		// 纵坐标设定
		ValueAxis valueaxis = xyplot.getDomainAxis();
		// 自动设置数据轴数据范围
		valueaxis.setAutoRange(true);
        //设置X轴范围
		valueaxis.setFixedAutoRange(750000D);

		valueaxis = xyplot.getRangeAxis();
		 valueaxis.setRange(27800.0,27880.0);

		return jfreechart;
	}

	public void update(Second s, double b) {
		try {
			timeSeries.addOrUpdate(s, b);
			Thread.sleep(300);
		} catch (InterruptedException e) {

		}

	}

	private long randomNum() {
		System.out.println((Math.random() * 20 + 80));
		return (long) (Math.random() * 20 + 80);
	}
}

主类

package worn;
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;

import org.jfree.chart.ChartPanel;
import org.jfree.data.time.Day;
import org.jfree.data.time.Hour;
import org.jfree.data.time.Minute;
import org.jfree.data.time.Month;
import org.jfree.data.time.Second;
import java.net.*;
import java.text.NumberFormat;
import java.text.ParseException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JFrame;
public class Main {
	public static ArrayList DealTime(String s) {
		ArrayList al = new ArrayList();
		Pattern pattern = Pattern.compile("[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]");  
		Matcher matcher = pattern.matcher(s);  
		if(matcher.find()){  
		    for(int i=0; i<=matcher.groupCount(); i++){  
		        al.add(matcher.group(i));
		    }  
		}
		pattern = Pattern.compile("[0-9][0-9]:[0-9][0-9]:[0-9][0-9]");  
		matcher = pattern.matcher(s);  
		if(matcher.find()){  
		    for(int i=0; i<=matcher.groupCount(); i++){  
		        al.add(matcher.group(i));
		    }  
		}
		return al;
	}
	public static ArrayList DealData(String s) {//拿出所有DIV里的内容
		ArrayList al = new ArrayList();
		int beg=0;
		int end=0;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='>')
				beg=i+1;
			if(s.charAt(i)=='<') {
				end=i;
				al.add(s.substring(beg, end));
			}
		}
		return al;
	}
	public static String getContent(String s ) {//截掉字符串内空白的部分
		String ans = null;
		for(int i=0;i<s.length();i++) {
			if(s.charAt(i)=='\u0000') {
				ans = s.substring(0, i);
			}
		}
		return ans;
	}
	public static boolean HasDataNotUsed = false;

	public static void main(String[] args) throws IOException, ParseException {
		
		
		JFrame frame = new JFrame("Test Chart");
		RealTimeChart rtcp = new RealTimeChart("HenShen", "Price", "Num");
		frame.getContentPane().add(rtcp, new BorderLayout().CENTER);
		frame.pack();
		frame.setVisible(true);
		frame.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent windowevent) {
				System.exit(0);
			}

		});

		
		ArrayList Grap = new ArrayList();
		
		
		ServerSocket ss = new ServerSocket(3000);
		Socket client = ss.accept();
		InputStream is = client.getInputStream();
		byte [] b = new byte[1024];
		
		
		new Thread() {//新线程用于接收数据
			public void run() {
				while(true) {
				synchronized(client) {//同步锁
					
					try {
						is.read(b);
					} catch (IOException e) {
						e.printStackTrace();
						break;
					}
					HasDataNotUsed=true;//告诉主线程,数据已更新
					
					}
				
				
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
						break;
					}
					
					
				}
			}
		}.start();
		String s = null;
		double price=0;
		int index=0;
		while(true) {//主线程用来更新图像
			synchronized(client) {
				if(HasDataNotUsed) {
					s=new String(b,"UTF-8");
					System.out.println("HTML:++++++++++++++++++++++++++++++++++++++++++++++");
					System.out.println(s);
					System.out.println("HTML:++++++++++++++++++++++++++++++++++++++++++++++");
					if(s.equals("None")) {
						HasDataNotUsed=false;
						continue;
					}
					s=Main.getContent(s);
					ArrayList data = DealData(s);
					ArrayList time = DealTime(s);
					Iterator it = data.iterator();
					double PriceCha = Double.parseDouble((String) data.get(2))-price;
					price = Double.parseDouble((String) data.get(2));//得到股票价格
					boolean isRed = (PriceCha>0.0);//红色表示涨
					NumberFormat nf=NumberFormat.getPercentInstance();//得到股票涨跌百分比
					Number m=null;
					if(!((String) data.get(6)).isEmpty())
						m = nf.parse(((String) data.get(6)).substring(1, ((String) data.get(6)).length()));
					double percent = m.doubleValue();
					
					String time_d = (String)time.get(0);//get(0)中存储着时间信息
					System.out.println(time_d);
					System.out.println("Percent : "+percent);
					//分别提取日月年时分秒
					Day d = new Day(Integer.parseInt(time_d.substring(8,10)),Integer.parseInt(time_d.substring(5,7)),Integer.parseInt(time_d.substring(0,4)));
					int hour = Integer.parseInt(((String)time.get(1)).substring(0, 2));
					int minute = Integer.parseInt(((String)time.get(1)).substring(3, 5));
					int second = Integer.parseInt(((String)time.get(1)).substring(6, 8));
					//建立对象
					Hour time_h = new Hour(hour,d);
					Minute time_m = new  Minute(minute,time_h);
					Second time_s = new  Second(second,time_m);
					
					rtcp.update(time_s, price);
					HasDataNotUsed=false;
					
					}
				}
			}
		}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值