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;
}
}
}
}
}