背景
本项目是我在南京大学实习时开发的项目。年代比较久远,仅当记录
由于项目需要,人手又不够,不可能自己从江苏省人民医院里一个个提取信息做网页放到自己的网站中。这里就是程序设计的精髓了,程序就是用来解决大量的重复的劳动的,如果你能手动实现某过程的一个细节,且这些细节具有相似性,那么你就可以很容易用程序做出。还是用jsoup。运行以后会获得300M的数据,包括处理过的图像和生成的xml,医生信息和科室信息。
爬取医院数据
jsph.java
package jsph;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.net.URL;
import java.net.URLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.nodes.Node;
import org.jsoup.select.Elements;
public class jsph
{
private String keshijieshao="http://www.jsph.net/col/col25/index.html";
private String[] names={"内科","外科","老年医学科","康复医学科","妇产科","儿科","门急诊","医技"};
private String[] addrs=
{
"http://www.jsph.net/col/col861/index.html",
"http://www.jsph.net/col/col862/index.html",
"http://www.jsph.net/col/col863/index.html",
"http://www.jsph.net/col/col864/index.html",
"http://www.jsph.net/col/col865/index.html",
"http://www.jsph.net/col/col866/index.html",
"http://www.jsph.net/col/col867/index.html",
"http://www.jsph.net/col/col868/index.html",
};
private String url="http://www.jsph.net/script/0/nav.js";
private int threadnum=0;
public jsph()
{
try
{
Document keshidoc=Jsoup.connect(keshijieshao).timeout(0).get();
Elements toprocess=keshidoc.select("a[style=font-size:14px;]");
toprocess.addAll(keshidoc.select("a[style=font-size:14px; width:100px]"));
// processKeshi(toprocess);
Elements doctorlist=new Elements();
int i,j;
for(i=0;i<names.length;i++)
{
Document doc=Jsoup.connect(addrs[i]).timeout(0).get();
Elements eles=doc.select("td[width=752]").get(0).children();
for(j=11;j<eles.size();j+=2)
{
doctorlist.addAll(eles.get(j).select("a"));
if(j+1<eles.size() && eles.get(j+1).text().equals(""))
j++;
}
}
for(Element ss:doctorlist)
System.out.println(ss.text());
processYisheng(doctorlist);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public String c(String src) throws Exception
{
// return src;
return new String(src.getBytes(),"gb2312");
}
public void processKeshi(Elements eles) throws Exception
{
FileOutputStream fos=new FileOutputStream("重点专科.xml");
OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
BufferedWriter bw=new BufferedWriter(osw);
bw.write(c("<?xml version="1.0" encoding="utf-8"?>\n"));
bw.write(c("<keshis>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>内科</name>\n"));
bw.write(c("\t\t<id></id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>外科</name>\n"));
bw.write(c("\t\t<id></id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>老年病学科</name>\n"));
bw.write(c("\t\t<id>13</id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>康复医学科</name>\n"));
bw.write(c("\t\t<summary>江苏省人民医院康复医学科成立于1956年,55年来学科发展迅速,目前已成立了康复医学中心。"
+ "现有康复门诊800平方米,病房76张床位、盛泽分院康复医学科22张床位,江苏省人民医院康复医学分院是国内三级甲等"
+ "医院中临床规模最大、设备最齐全、技术实力最强的科室之一</summary>\n"));
bw.write(c("\t\t<detailurl>康复医学科.htm</detailurl>\n"));
bw.write(c("\t\t<id>37</id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>妇产科</name>\n"));
bw.write(c("\t\t<id></id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>儿科</name>\n"));
bw.write(c("\t\t<id>28</id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>门急诊</name>\n"));
bw.write(c("\t\t<id></id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
bw.write(c("\t<keshi>\n"));
bw.write(c("\t\t<name>医技</name>\n"));
bw.write(c("\t\t<id></id>\n"));
bw.write(c("\t\t<isroot>true</isroot>\n"));
bw.write(c("\t</keshi>\n"));
String fatherkeshiname="";
for(int i=0;i<eles.size();i++)
{
Document curdoc=Jsoup.connect(eles.get(i).attr("abs:href")).timeout(0).get();
Elements temp1=curdoc.select("a[style=color:#0053a3;]");
String curfather=temp1.get(temp1.size()-2).text();
System.out.println("father:"+curfather);
if(i == 0)
{
bw.write(c("\t<"+curfather+">\n"));
fatherkeshiname=curfather;
}
else if(!fatherkeshiname.equals(curfather))
{
bw.write(c("\t</"+fatherkeshiname+">\n"));
fatherkeshiname=curfather;
bw.write(c("\t<"+fatherkeshiname+">\n"));
}
bw.write(c("\t\t<keshi>\n"));
bw.write(c("\t\t\t<name>"+eles.get(i).text()+"</name>\n"));
System.out.println(eles.get(i).text());
bw.write(c("\t\t\t<id></id>\n"));
Elements inner=curdoc.select("td[style=padding:0px 10px 0px 10px;]\n");
bw.write(c("\t\t\t<summary>"+getProperText(inner.text())+"</summary>\n"));
String keshiname=eles.get(i).text();
bw.write(c("\t\t\t<detailurl>"+keshiname+".htm</detailurl>\n"));
bw.write(c("\t\t</keshi>\n"));
if(i == eles.size()-1)
{
bw.write(c("\t</"+curfather+">\n"));
}
FileOutputStream infos=new FileOutputStream(keshiname+".htm");
OutputStreamWriter inosw=new OutputStreamWriter(infos,"UTF-8");
BufferedWriter inbw=new BufferedWriter(inosw);
inbw.write(c("<?xml version="1.0" encoding="utf-8"?>\n"));
inbw.write(c("<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN""http://www.wapforum.org/DTD/xhtml-mobile10.dtd">\n"));
inbw.write(c("<html xmlns="http://www.w3.org/1999/xhtml">\n"));
inbw.write(c("<head><style type="text/css">body{font-size:medium;line-height:1.5em;text-align:left}</style><title>"+keshiname+"</title></head>\n"));
inbw.write(c("<body>\n\t<div>\n"));
if(inner.select("a").size() != 0)
{
Document detailpage=Jsoup.connect(inner.select("a").attr("abs:href")).timeout(0).get();
Elements content=detailpage.select("div#zoom p");
for(Element el:content.select("img"))
{
final String url=el.attr("abs:src");
final String dst=el.attr("src");
while(threadnum > 10)
{
Thread.sleep(1000);
}
new Thread()
{
@Override
public void run()
{
threadnum++;
try
{
downloadImage(url,dst,false);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
threadnum--;
}
}
}.start();
}
inbw.write(c("\t\t"+content.html().replace("/picture","picture")+"\n"));
}
inbw.write(c("\t</div>\n</body>\n</html>"));
inbw.close();
inosw.close();
infos.close();
}
bw.write(c("</keshis>\n"));
bw.close();
osw.close();
fos.close();
}
public void downloadImage(String url,String dir,boolean change) throws Exception//下载图片并处理成合适大小
{
String origindir=new String(dir);
File file=null;
StringBuilder curpath=new StringBuilder();
if(dir.charAt(0) == '/')
dir=dir.substring(1);
while(dir.indexOf('/') != -1)
{
int index=dir.indexOf('/');
curpath.append(dir.substring(0,index));
file=new File(curpath.toString());
if(!file.exists())
{
file.mkdir();
}
curpath.append('/');
dir=dir.substring(index+1);
}
int byteread=0;
int bytesum=0;
URL weburl=new URL(url);
URLConnection con=weburl.openConnection();
InputStream instream=con.getInputStream();
if(new File(curpath.toString()+dir).exists())
return;
FileOutputStream fs=new FileOutputStream(curpath.toString()+dir);
FileOutputStream sfs=null;
if(change)
sfs=new FileOutputStream(curpath.toString()+"small_"+dir);
byte[] buffer=new byte[65536];
while((byteread=instream.read(buffer)) != -1)
{
bytesum+=byteread;
fs.write(buffer,0,byteread);
if(change)
sfs.write(buffer,0,byteread);
System.out.println("\t\t当前下载文件:"+url+"\t当前大小:"+bytesum);
}
if(change)
sfs.close();
fs.close();
instream.close();
if(change)
{
//处理图片
ImageUtil.resize(curpath.toString()+dir,curpath.toString()+dir,160,200);
ImageUtil.resize(curpath.toString()+"small_"+dir,curpath.toString()+"small_"+dir,80,100);
}
}
private class MyThread extends Thread
{
private String downloadurl;
private String picurl;
private BufferedWriter bwp;
private String doctorname;
public MyThread(Elements info,String picurl,BufferedWriter bwp,int i,Elements eles)
{
downloadurl=info.get(0).select("img").attr("abs:src");
this.picurl=picurl;
this.bwp=bwp;
doctorname=eles.get(i).text();
}
@Override
public void run()
{
threadnum++;
try
{
downloadImage(downloadurl,picurl,true);
}
catch(Exception e)
{
try
{
bwp.write("无头像:"+doctorname+"\n");
}
catch (IOException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
finally
{
threadnum--;
}
}
}
public void processYisheng(Elements eles) throws Exception
{
FileOutputStream fos=new FileOutputStream("名医大全.xml");
OutputStreamWriter osw=new OutputStreamWriter(fos,"UTF-8");
BufferedWriter bw=new BufferedWriter(osw);
bw.write(c("<?xml version="1.0" encoding="utf-8"?>\n"));
bw.write(c("<doctors>\n"));
String fatherkeshiname="";
FileOutputStream fosp=new FileOutputStream("其他信息.xml");
OutputStreamWriter oswp=new OutputStreamWriter(fosp);
BufferedWriter bwp=new BufferedWriter(oswp);
for(int i=0;i<eles.size();i++)
{
Thread.sleep(200);
System.out.println(eles.get(i).attr("abs:href"));
Document curdoc;
try
{
curdoc = Jsoup.connect(eles.get(i).attr("abs:href")).timeout(0).get();
}
catch (Exception e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
i--;
continue;
}
Elements temp1=curdoc.select("a[style=color:#0053a3;]");
if(temp1.size() < 2)//竟然使用了个人主页!!!
{
bwp.write("个人主页:"+eles.get(i).text()+"\n");
continue;
}
String curfather=temp1.get(temp1.size()-2).text();
System.out.println("father:"+curfather);
Elements info=curdoc.select("td[style=padding:6px 0px;] table tbody tr td table tbody tr").get(0).children();
String picurl=info.get(0).select("img").attr("src");
int index=picurl.lastIndexOf('/');
String spicurl=picurl.substring(0,index+1)+"small_"+picurl.substring(index+1);
if(spicurl.charAt(0) == '/')
spicurl=spicurl.substring(1);
if(i == 0)
{
bw.write(c("\t<"+curfather+">\n"));
fatherkeshiname=curfather;
}
else if(!fatherkeshiname.equals(curfather))
{
bw.write(c("\t</"+fatherkeshiname+">\n"));
fatherkeshiname=curfather;
bw.write(c("<"+fatherkeshiname+">\n"));
}
bw.write(c("\t\t<doctor>\n"));
bw.write(c("\t\t\t<name>"+eles.get(i).text()+"</name>\n"));
System.out.println(eles.get(i).text());
bw.write(c("\t\t\t<id></id>\n"));
Elements inner=info.get(2).children();
bw.write(c("\t\t\t<summary>"+inner.get(2).text()+getProperText(inner.get(4).text())+"</summary>\n"));
String doctorname=eles.get(i).text();
bw.write(c("\t\t\t<detailurl>"+doctorname+".htm</detailurl>\n"));
while(threadnum > 2)
{
Thread.sleep(1000);
}
new MyThread(info,picurl,bwp,i,eles).start();
bw.write(c("\t\t\t<smallpicurl>"+spicurl+"</smallpicurl>\n"));
bw.write(c("\t\t\t<usefulinfourl>"+doctorname+".xml</usefulinfourl>\n"));//排班、评价、,,,
bw.write(c("\t\t</doctor>\n"));
if(i == eles.size()-1)
{
bw.write(c("\t</"+curfather+">\n"));
}
FileOutputStream infos=new FileOutputStream(doctorname+".htm");
OutputStreamWriter inosw=new OutputStreamWriter(infos,"UTF-8");
BufferedWriter inbw=new BufferedWriter(inosw);
inbw.write(c("<?xml version="1.0" encoding="utf-8"?>\n"));
inbw.write(c("<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN""http://www.wapforum.org/DTD/xhtml-mobile10.dtd">\n"));
inbw.write(c("<html xmlns="http://www.w3.org/1999/xhtml">\n"));
inbw.write(c("<head><style type="text/css">body{font-size:medium;line-height:1.5em;text-align:left}</style><title>"+doctorname+"</title></head>\n"));
inbw.write(c("<body>\n\t<div>\n"));
for(Element el:info.select("img"))
{
final String url=el.attr("abs:src");
final String dst=el.attr("src");
while(threadnum > 10)
{
Thread.sleep(1000);
}
new Thread()
{
@Override
public void run()
{
threadnum++;
try
{
downloadImage(url,dst,false);
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
threadnum--;
}
}
}.start();
}
inbw.write(c("\t\t"+info.html().replace("/picture","picture")+"\n"));
inbw.write(c("\t</div>\n</body>\n</html>"));
inbw.close();
inosw.close();
infos.close();
}
bw.write(c("</doctors>\n"));
bw.close();
osw.close();
fos.close();
bwp.close();
oswp.close();
fosp.close();
}
private String getProperText(String src)
{
src=src.replace("????","");
if(src.length() > 128)
{
StringBuilder sb=new StringBuilder(src.substring(0, 128));
for(int i=128;i<src.length();i++)
{
char ch=src.charAt(i);
sb.append(ch);
if(ch == ',' || ch == '。' || ch == '、')
{
break;
}
}
sb.setCharAt(sb.length()-1,'。');
return sb.toString();
}
else
return src;
}
public static void main(String[] args) throws Exception
{
new jsph();
}
}
ImageUtil.java
package jsph;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.Date;
import java.util.Iterator;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
/**
* 图片压缩工具类 提供的方法中可以设定生成的 缩略图片的大小尺寸、压缩尺寸的比例、图片的质量等
* <pre>
* 调用示例:
* resiz(srcImg, tarDir + "car_1_maxLength_11-220px-hui.jpg", 220, 0.7F);
* </pre>
*
* @project haohui-b2b
* @author cevencheng
* @create 2012-3-22 下午8:29:01
*/
public class ImageUtil
{
/**
* * 图片文件读取
*
* @param srcImgPath
* @return
*/
private static BufferedImage InputImage(String srcImgPath) throws RuntimeException
{
BufferedImage srcImage = null;
FileInputStream in = null;
try
{
// 构造BufferedImage对象
File file = new File(srcImgPath);
in = new FileInputStream(file);
byte[] b = new byte[5];
in.read(b);
srcImage = javax.imageio.ImageIO.read(file);
}
catch (IOException e)
{
e.printStackTrace();
throw new RuntimeException("读取图片文件出错!", e);
}
finally
{
if (in != null)
{
try
{
in.close();
}
catch (IOException e)
{
throw new RuntimeException("读取图片文件出错!", e);
}
}
}
return srcImage;
}
/**
* * 将图片按照指定的图片尺寸、源图片质量压缩(默认质量为1)
*
* @param srcImgPath
* :源图片路径
* @param outImgPath
* :输出的压缩图片的路径
* @param new_w
* :压缩后的图片宽
* @param new_h
* :压缩后的图片高
*/
public static void resize(String srcImgPath, String outImgPath, int new_w, int new_h)
{
// 得到图片
BufferedImage src = InputImage(srcImgPath);
int old_w = src.getWidth();
// 得到源图宽
int old_h = src.getHeight();
// 得到源图长
// 根据原图的大小生成空白画布
BufferedImage tempImg = new BufferedImage(old_w, old_h,
BufferedImage.TYPE_INT_RGB);
// 在新的画布上生成原图的缩略图
Graphics2D g = tempImg.createGraphics();
g.setColor(Color.white);
g.fillRect(0, 0, old_w, old_h);
g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
g.dispose();
BufferedImage newImg = new BufferedImage(new_w, new_h,
BufferedImage.TYPE_INT_RGB);
newImg.getGraphics().drawImage( tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null);
// 调用方法输出图片文件
outImage(outImgPath, newImg);
}
/**
* 将图片按照指定的尺寸比例、源图片质量压缩(默认质量为1)
*
* @param srcImgPath
* :源图片路径
* @param outImgPath
* :输出的压缩图片的路径
* @param ratio
* :压缩后的图片尺寸比例
* @param per
* :百分比
*/
public static void resize(String srcImgPath, String outImgPath, float ratio)
{
resize(srcImgPath, outImgPath, ratio, 1F);
}
/**
* 将图片按照指定长或者宽的最大值来压缩图片(默认质量为1)
*
* @param srcImgPath
* :源图片路径
* @param outImgPath
* :输出的压缩图片的路径
* @param maxLength
* :长或者宽的最大值
* @param per
* :图片质量
*/
public static void resize(String srcImgPath, String outImgPath, int maxLength)
{
resize(srcImgPath, outImgPath, maxLength, 1F);
}
/**
* * 将图片按照指定的尺寸比例、图片质量压缩
*
* @param srcImgPath
* :源图片路径
* @param outImgPath
* :输出的压缩图片的路径
* @param ratio
* :压缩后的图片尺寸比例
* @param per
* :百分比
* @author cevencheng
*/
public static void resize(String srcImgPath, String outImgPath,
float ratio, float per) {
// 得到图片
BufferedImage src = InputImage(srcImgPath);
int old_w = src.getWidth();
// 得到源图宽
int old_h = src.getHeight();
// 得到源图长
int new_w = 0;
// 新图的宽
int new_h = 0;
// 新图的长
BufferedImage tempImg = new BufferedImage(old_w, old_h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = tempImg.createGraphics();
g.setColor(Color.white);
// 从原图上取颜色绘制新图g.fillRect(0, 0, old_w, old_h);
g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
g.dispose();
// 根据图片尺寸压缩比得到新图的尺寸new_w = (int) Math.round(old_w * ratio);
new_h = (int) Math.round(old_h * ratio);
BufferedImage newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
newImg.getGraphics().drawImage( tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null);
// 调用方法输出图片文件OutImage(outImgPath, newImg, per);
}
/**
* <b>
* 指定长或者宽的最大值来压缩图片
* 推荐使用此方法
* </b>
* @param srcImgPath
* :源图片路径
* @param outImgPath
* :输出的压缩图片的路径
* @param maxLength
* :长或者宽的最大值
* @param per
* :图片质量
* @author cevencheng
*/
public static void resize(String srcImgPath, String outImgPath, int maxLength, float per)
{
// 得到图片
BufferedImage src = InputImage(srcImgPath);
int old_w = src.getWidth();
// 得到源图宽
int old_h = src.getHeight();
// 得到源图长
int new_w = 0;
// 新图的宽
int new_h = 0;
// 新图的长
BufferedImage tempImg = new BufferedImage(old_w, old_h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = tempImg.createGraphics();
g.setColor(Color.white);
// 从原图上取颜色绘制新图
g.fillRect(0, 0, old_w, old_h);
g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
g.dispose();
// 根据图片尺寸压缩比得到新图的尺寸
if (old_w > old_h)
{
// 图片要缩放的比例
new_w = maxLength;
new_h = (int) Math.round(old_h * ((float) maxLength / old_w));
}
else
{
new_w = (int) Math.round(old_w * ((float) maxLength / old_h));
new_h = maxLength;
}
BufferedImage newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
newImg.getGraphics().drawImage( tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null);
// 调用方法输出图片文件
outImage(outImgPath, newImg);
}
/**
* 将图片压缩成指定宽度, 高度等比例缩放
*
* @param srcImgPath
* @param outImgPath
* @param width
* @param per
*/
public static void resizeFixedWidth(String srcImgPath, String outImgPath, int width, float per)
{
// 得到图片
BufferedImage src = InputImage(srcImgPath);
int old_w = src.getWidth();
// 得到源图宽
int old_h = src.getHeight();
// 得到源图长
int new_w = 0;
// 新图的宽
int new_h = 0;
// 新图的长
BufferedImage tempImg = new BufferedImage(old_w, old_h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = tempImg.createGraphics();
g.setColor(Color.white);
// 从原图上取颜色绘制新图
g.fillRect(0, 0, old_w, old_h);
g.drawImage(src, 0, 0, old_w, old_h, Color.white, null);
g.dispose();
// 根据图片尺寸压缩比得到新图的尺寸
if (old_w > old_h)
{
// 图片要缩放的比例
new_w = width;
new_h = (int) Math.round(old_h * ((float) width / old_w));
}
else
{
new_w = (int) Math.round(old_w * ((float) width / old_h));
new_h = width;
}
BufferedImage newImg = new BufferedImage(new_w, new_h, BufferedImage.TYPE_INT_RGB);
newImg.getGraphics().drawImage( tempImg.getScaledInstance(new_w, new_h, Image.SCALE_SMOOTH), 0, 0, null);
// 调用方法输出图片文件
outImage(outImgPath, newImg);
}
/**
* * 将图片文件输出到指定的路径,并可设定压缩质量
*
* @param outImgPath
* @param newImg
* @param per
* @author cevencheng
*/
private static void outImage(String outImgPath, BufferedImage newImg)
{
// 判断输出的文件夹路径是否存在,不存在则创建
File file = new File(outImgPath);
if (!file.exists())
{
file.mkdirs();
}
try
{
String formatName=outImgPath.substring(outImgPath.lastIndexOf('.')+1);
ImageIO.write(newImg, formatName, new File(outImgPath));
}
catch (Exception e)
{
throw new RuntimeException(e);
}
}
/**
* 图片剪切工具方法
*
* @param srcfile 源图片
* @param outfile 剪切之后的图片
* @param x 剪切顶点 X 坐标
* @param y 剪切顶点 Y 坐标
* @param width 剪切区域宽度
* @param height 剪切区域高度
*
* @throws IOException
* @author cevencheng
*/
public static void cut(File srcfile, File outfile, int x, int y, int width, int height) throws IOException
{
FileInputStream is = null;
ImageInputStream iis = null;
try
{
// 读取图片文件
is = new FileInputStream(srcfile);
/*
* 返回包含所有当前已注册 ImageReader 的 Iterator,这些 ImageReader 声称能够解码指定格式。
* 参数:formatName - 包含非正式格式名称 .(例如 "jpeg" 或 "tiff")等 。
*/
Iterator<ImageReader> it = ImageIO.getImageReadersByFormatName("jpg");
ImageReader reader = it.next();
// 获取图片流
iis = ImageIO.createImageInputStream(is);
/*
* <p>iis:读取源.true:只向前搜索 </p>.将它标记为 ‘只向前搜索’。
* 此设置意味着包含在输入源中的图像将只按顺序读取,可能允许 reader 避免缓存包含与以前已经读取的图像关联的数据的那些输入部分。
*/
reader.setInput(iis, true);
/*
* <p>描述如何对流进行解码的类<p>.用于指定如何在输入时从 Java Image I/O
* 框架的上下文中的流转换一幅图像或一组图像。用于特定图像格式的插件 将从其 ImageReader 实现的
* getDefaultReadParam 方法中返回 ImageReadParam 的实例。
*/
ImageReadParam param = reader.getDefaultReadParam();
/*
* 图片裁剪区域。Rectangle 指定了坐标空间中的一个区域,通过 Rectangle 对象
* 的左上顶点的坐标(x,y)、宽度和高度可以定义这个区域。
*/
Rectangle rect = new Rectangle(x, y, width, height);
// 提供一个 BufferedImage,将其用作解码像素数据的目标。
param.setSourceRegion(rect);
/*
* 使用所提供的 ImageReadParam 读取通过索引 imageIndex 指定的对象,并将 它作为一个完整的
* BufferedImage 返回。
*/
BufferedImage bi = reader.read(0, param);
// 保存新图片
ImageIO.write(bi, "jpg", outfile);
}
finally
{
if (is != null)
{
is.close();
}
if (iis != null)
{
iis.close();
}
}
}
public static void main(String args[]) throws Exception
{
String srcImg = "j:/branch.jpg";
resize(srcImg, srcImg, 200,200);
resize(srcImg, "111222.jpg", 200,200);
}
}
医院数据展示
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN""http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><style type="text/css">body{font-size:medium;line-height:1.5em;text-align:left}</style><title>HLA实验室</title></head>
<body>
<div>
<span style="font-size: 20px">本</span>室是集医教研为一体的高新技术实验室,是中华骨髓库专家委员会委员单位,承担中华骨髓库江苏省分库的造血干细胞捐献志愿者HLA基因分型、临床造血干细胞移植和器官移植HLA组织配型及临床风险预测和相关医疗教学科研工作。该实验室2002年12月通过国家红十字总会组织的专家鉴定和认证,成为中华骨髓库定点组织配型实验室,并接受中华骨髓库常规及不定时、即时质控,且多年保持零错误率。
十年来,本室已对近50,000名造血干细胞捐献志愿者进行了HLA分型,建立了HLA分型档案和与中华骨髓库双向联动的功能性资料库,为国内外白血病患者寻找HLA完全匹配的非血缘关系的造血干细胞供者,其中已有142例在我院实施了造血干细胞采集。已从汉族人群中发现4个新等位基因,均获得WHO认证。
此外,本室已为院内外、省内外的临床3000多例亲缘关系、非亲缘关系供患者进行了HLA低分辨和高分辨配型。近年来,本实验室立足于规范化精细建设原则,在转换医学和医学科研上开拓特色,已进行疾病与HLA基因发病之间的研究工作,许多科研成果并已应用于临床。同时,该实验室还运用遗传流行病学和遗传免疫学手段,探索性进行地理遗传学比对和分析工作,为更多、更有效的寻找、确立移植供者提供依据,这一切均确立了本室在国内HLA科教研中的特色和地位。
</div>
</body>
</html>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN""http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><style type="text/css">body{font-size:medium;line-height:1.5em;text-align:left}</style><title>包丽华</title></head>
<body>
<div>
<table border="0" cellspacing="3" cellpadding="0" style="border:#e1e1e1 1px solid">
<tbody>
<tr>
<td><img src="picture/0/1202221805195706215.JPG" width="89" height="118" border="0" />
<!--<IMG src='picture/0/ystp.gif' width=89 height=118 border=0>--></td>
</tr>
</tbody>
</table>
<a href="/art/2010/3/10/art_1379_464.html" style=" color:#0163ae; font-size: 14px; text-decoration:none; font-weight: bold;">包丽华</a><br /><a style="color:#393c3c; font-size: 12px; text-decoration:none;">主任医师 副教授</a><br /><a style="color:#393c3c; font-size: 12px; text-decoration:none;">主任医师,副教授,硕士生导师,核医学科负责人,江苏省人民医院影像学部副主任,南京市医学会骨质疏松骨矿盐学会副主任委员,江苏省医学会骨质疏松学会委员。1985年毕业于南京医科大学医学系,从事临床医疗、教学及科研26年,擅长骨代谢疾病、骨质疏松及骨关节炎等疾病的诊断、预防和治疗。在SCI及核心期刊发表相关论著数十篇,参编专著多部,并多次获省、市科研奖项,主持或参与国家、省、市及院级骨质疏松课题多项,主持并参与十余项骨质疏松临床药物试验。专家门诊时间:每周二上午、周四上午、周五上午。</a>
</div>
</body>
</html>
<?xml version="1.0" encoding="utf-8"?>
<doctors>
<doctor>
<name>孔祥清</name>
<id></id>
<summary>
教授,主任医师,医学博士,博士生导师现任南京医科大学第一临床医学院院长、第一附属医院心内科主任。同时兼任FSCAI、中国生物医学工程学会介入医学工程分会副主任委员、中华医学会心血管病分会青年委员、中华医学会心血管病分会结构心脏病学组成员、中国医师协会结构心脏病学组副组长、中华医学会江苏心血管病分会副主任委员。
</summary>
<detailurl>孔祥清.htm</detailurl>
<smallpicurl>picture/0/small_1202212326363771202.JPG</smallpicurl>
<usefulinfourl>孔祥清.xml</usefulinfourl>
</doctor>
<doctor>
<name>曹克将</name>
<id></id>
<summary>
主任医师、教授、博士生导师南京医科大学(心血管病)国家重点学科带头人,现任中华医学会心电生理与起搏分会副主任委员、江苏省医学会心血管病专科分会主任委员、江苏省心肺疾病研究所所长、江苏省心血管病临床医学中心主任。
学科在2007年成为国家重点学科,2010年带领学科获卫生部心律失常、冠心病与先心病介入培训基地。</summary>
<detailurl>曹克将.htm</detailurl>
<smallpicurl>picture/0/small_s1203151656599155853.jpg</smallpicurl>
<usefulinfourl>曹克将.xml</usefulinfourl>
</doctor>
<doctor>
<name>黄峻</name>
<id></id>
<summary>主任医师享受国务院特殊津贴,主任医师、教授。擅长高血压、冠心病、心律失常及各类疑难危重心脏疾病的诊治。</summary>
<detailurl>黄峻.htm</detailurl>
<smallpicurl>picture/0/small_1202212325460412557.JPG</smallpicurl>
<usefulinfourl>黄峻.xml</usefulinfourl>
</doctor>
<doctor>
<name>黄元铸</name>
<id></id>
<summary>主任医师、教授,博导,院终身教授。擅长心脏病尤其冠心病、心律失常与疑难心脏病诊治。每周四上午专家门诊。</summary>
<detailurl>黄元铸.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>黄元铸.xml</usefulinfourl>
</doctor>
<doctor>
<name>马文珠</name>
<id></id>
<summary>主任医师、教授,院终身教授。擅长心脏病尤其冠心病、心肌病的诊治。每周三上午专家门诊。</summary>
<detailurl>马文珠.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>马文珠.xml</usefulinfourl>
</doctor>
<doctor>
<name>杨志健</name>
<id></id>
<summary>
主任医师、教授主持多项国家级和省部级课题,主要研究方向是冠心病的早期诊断和生物学治疗,以第一作者或通讯作者发表SCI论文20余篇,正主持开展基因治疗二期临床工作;并主持搭建“冠心病专家远程医疗系统”平台,带动江苏省及邻近省份冠心病介入诊疗技术的快速发展。获江苏省优秀科技工作者等荣誉称号。
</summary>
<detailurl>杨志健.htm</detailurl>
<smallpicurl>picture/0/small_1202212326539421951.JPG</smallpicurl>
<usefulinfourl>杨志健.xml</usefulinfourl>
</doctor>
<doctor>
<name>李新立</name>
<id></id>
<summary>
主任医师、教授中华医学会心血管病分会心衰学组委员兼秘书、中国高血压联盟常委、中国医师协会高血压专业委员会常委、中国医师协会中西医结合医师分会心血管专家委员会常委。获得江苏省科学技术进步奖二等奖、江苏省突出贡献中青年专家。目前主持“十二五”国家科技支撑计划、国家自然科学基金。
</summary>
<detailurl>李新立.htm</detailurl>
<smallpicurl>picture/0/small_1202271011315479273.JPG</smallpicurl>
<usefulinfourl>李新立.xml</usefulinfourl>
</doctor>
<doctor>
<name>单其俊</name>
<id></id>
<summary>医学博士,主任医师,教授。擅长各类心脏病的诊治,尤其是心律失常的介入诊治及心脏电生理与起搏治疗。每周四下午专家门诊。</summary>
<detailurl>单其俊.htm</detailurl>
<smallpicurl>picture/0/small_1202212327218808376.JPG</smallpicurl>
<usefulinfourl>单其俊.xml</usefulinfourl>
</doctor>
<doctor>
<name>许迪</name>
<id></id>
<summary>主任医师医学博士,主任医师、教授。擅长各类心脏病的诊治,尤其是心脏超声的临床应用、心脏电生理与起搏及先天性心脏病的诊治。每周一下午专家门诊。</summary>
<detailurl>许迪.htm</detailurl>
<smallpicurl>picture/0/small_1202270926526234565.JPG</smallpicurl>
<usefulinfourl>许迪.xml</usefulinfourl>
</doctor>
<doctor>
<name>邹建刚</name>
<id></id>
<summary>主任医师、教授现任江苏省人民医院、南京医科大学第一附属医院心脏科教授、主任医师,博士研究生导师,心律失常专业组副主任;中华医学会心电生理与起搏学会委员,中国CRT工作组副组长。
江苏省医学重点人才;省首批中青年科学技术带头人;省“六大人才高峰”高层次人才;2010年获中国CRT杰出成就奖。</summary>
<detailurl>邹建刚.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>邹建刚.xml</usefulinfourl>
</doctor>
<doctor>
<name>陈明龙</name>
<id></id>
<summary>
主任医师、教授主任医师,教授,博士生导师。现任南京医科大学一附院心内科副主任,中华医学会心电生理与起搏分会委员,中国心律学会委员,江苏省心血管病学会秘书。擅长心血管内科相关疾病尤其是心律失常的诊治。曾荣获江苏省科学技术进步奖二等奖1项、江苏省医学新技术引进奖一等奖3项、江苏省卫生厅新技术引进特等奖1项。
</summary>
<detailurl>陈明龙.htm</detailurl>
<smallpicurl>picture/0/small_s1203221028183788908.JPG</smallpicurl>
<usefulinfourl>陈明龙.xml</usefulinfourl>
</doctor>
<doctor>
<name>朱铁兵</name>
<id></id>
<summary>主任医师医学博士,主任医师、教授。擅长各类心脏病的诊治,尤其擅长冠心病的介入治疗。每周三上午专家门诊。</summary>
<detailurl>朱铁兵.htm</detailurl>
<smallpicurl>picture/0/small_1202271021234004728.JPG</smallpicurl>
<usefulinfourl>朱铁兵.xml</usefulinfourl>
</doctor>
<doctor>
<name>张寄南</name>
<id></id>
<summary>主任医师主任医师、教授。享受国务院特殊津贴。擅长病毒性心肌炎、心肌病、高血压、心肌梗塞及心脏疑难疾病的诊治。 每周五上午专家门诊。</summary>
<detailurl>张寄南.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>张寄南.xml</usefulinfourl>
</doctor>
<doctor>
<name>张馥敏</name>
<id></id>
<summary>主任医师主任医师、教授。擅长冠心病、心律失常及各类疑难危重心脏疾病及心衰的诊治。</summary>
<detailurl>张馥敏.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>张馥敏.xml</usefulinfourl>
</doctor>
<doctor>
<name>钱卫冲</name>
<id></id>
<summary>主任医师主任医师,副教授。能诊断处理各种常见心血管病,擅长对高血压病、冠心病及心力衰竭的诊断、治疗及综合管理。</summary>
<detailurl>钱卫冲.htm</detailurl>
<smallpicurl>picture/0/small_1202271027314514069.JPG</smallpicurl>
<usefulinfourl>钱卫冲.xml</usefulinfourl>
</doctor>
<doctor>
<name>李殿富</name>
<id></id>
<summary>主任医师医学博士,主任医师,副教授。擅长各类心脏病的诊治,尤其擅长冠心病介入技术和无创技术(核素心肌显像),对冠心病和胸痛的规范化诊治有丰富经验。</summary>
<detailurl>李殿富.htm</detailurl>
<smallpicurl>picture/0/small_1202212329319829385.JPG</smallpicurl>
<usefulinfourl>李殿富.xml</usefulinfourl>
</doctor>
<doctor>
<name>周秀娟</name>
<id></id>
<summary>
主任医师医学博士,主任医师,副教授,硕士生导师,长期从事临床一线工作,熟练掌握心脏科各种常见病的诊断和治疗,尤其是高血压、冠心病、心肌病、心律失常的临床诊治,擅长心脏起搏器植入术及术后程控随访,对遗传性心律失常,如致心律失常右室心肌病有较深入研究,主持国家自然科学基金。
</summary>
<detailurl>周秀娟.htm</detailurl>
<smallpicurl>picture/0/small_1311151216574162069.jpg</smallpicurl>
<usefulinfourl>周秀娟.xml</usefulinfourl>
</doctor>
<doctor>
<name>王连生</name>
<id></id>
<summary>
主任医师、教授南京医科大学第一附属医院(江苏省人民医院)内科心血管病主任医师、教授、高级专家,博士研究生导师和卫生部心血管疾病介入诊疗培训基地“冠心病介入”导师,医学博士,留美学者。长期从事冠心病、高血压、高脂血症和心力衰竭的临床诊疗工作,精通各种心血管常见病与疑难危重病人的诊疗。
</summary>
<detailurl>王连生.htm</detailurl>
<smallpicurl>picture/0/small_1202271029068548435.JPG</smallpicurl>
<usefulinfourl>王连生.xml</usefulinfourl>
</doctor>
<doctor>
<name>李春坚</name>
<id></id>
<summary>主任医师、教授、博士生导师主任医师、教授、博士生导师
德国Heidelberg大学和加拿大McMaster大学访问学者;江苏省六大高峰人才;江苏省333高层次人才;江苏省医学重点人才(共建); International Journal of
Cardiology (SCI IF 5.509)同行评审专家。</summary>
<detailurl>李春坚.htm</detailurl>
<smallpicurl>picture/0/small_1202271030294711124.JPG</smallpicurl>
<usefulinfourl>李春坚.xml</usefulinfourl>
</doctor>
<doctor>
<name>杨 荣</name>
<id></id>
<summary>
主任医师、副教授主任医师、副教授。从事心脏病临床诊治工作,擅长先心病的临床诊治,尤其擅长先心病的介入诊治,中国先心病介入培训基地导师,在国内外医学期刊发表文章30余篇,获省、厅和院级医学奖8项。
每周四上午门诊。</summary>
<detailurl>杨 荣.htm</detailurl>
<smallpicurl>picture/0/small_1202212330028289166.JPG</smallpicurl>
<usefulinfourl>杨 荣.xml</usefulinfourl>
</doctor>
<doctor>
<name>卢新政</name>
<id></id>
<summary>副主任医师医学博士后,副主任医师,副教授。擅长各类心脏病的诊治,尤其是高血压病、心力衰竭、心肌病等的临床诊治。</summary>
<detailurl>卢新政.htm</detailurl>
<smallpicurl>picture/0/small_1202212330345274772.JPG</smallpicurl>
<usefulinfourl>卢新政.xml</usefulinfourl>
</doctor>
<doctor>
<name>王 晖</name>
<id></id>
<summary>副主任医师医学博士,副主任医师、副教授。熟练掌握各种危重心血管病的临床诊治,擅长冠心病介入诊治。</summary>
<detailurl>王 晖.htm</detailurl>
<smallpicurl>picture/0/small_ystp.gif</smallpicurl>
<usefulinfourl>王 晖.xml</usefulinfourl>
</doctor>
<doctor>
<name>杨 兵</name>
<id></id>
<summary>
主任医师、教授医学博士,主任医师、教授。熟练掌握心内科常见病和多发病的诊治,主要从事心律失常的临床和基础研究,擅长于起搏治疗缓慢性心律失常和导管射频消融治疗各种快速性心律失常,特别在应用新型三维标测系统治疗各种复杂快速性心律失常,如心房颤动、房性心动过速、心房扑动、室性心动过速等方面有丰富的经验。
</summary>
<detailurl>杨 兵.htm</detailurl>
<smallpicurl>picture/0/small_1202212332098006091.JPG</smallpicurl>
<usefulinfourl>杨 兵.xml</usefulinfourl>
</doctor>
</doctors>
重点专科
<?xml version="1.0" encoding="utf-8"?>
<keshis>
<keshi>
<name>内科</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>外科</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>内科</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>老年病学科</name>
<id>13</id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>康复医学科</name>
<summary>
江苏省人民医院康复医学科成立于1956年,55年来学科发展迅速,目前已成立了康复医学中心。现有康复门诊800平方米,病房76张床位、盛泽分院康复医学科22张床位,江苏省人民医院康复医学分院是国内三级甲等医院中临床规模最大、设备最齐全、技术实力最强的科室之一
</summary>
<detailurl>康复医学科.htm</detailurl>
<id>37</id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>妇产科</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>儿科</name>
<id>28</id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>门急诊</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>医技</name>
<id></id>
<isroot>true</isroot>
</keshi>
<keshi>
<name>心血管内科</name>
<id></id>
<summary>
????南京医科大学心血管内科创建于1952年,1981年和1986年分别被批准为硕士学位和博士学位授权点,1998年被授予临床医学博士后科研流动站。江苏省政府重点学科、江苏省心血管病临床医学中心,2007被评为国家重点学科。[详细内容]
</summary>
<detailurl>心血管内科.htm</detailurl>
</keshi>
<keshi>
<name>呼吸内科</name>
<id></id>
<summary>
????现为江苏省医学重点学科、江苏省临床重点专科、江苏省“呼吸内科专业医疗质量控制中心”、江苏省卫生厅“135工程”重点学科、“科教兴卫工程”重点学科、国家首批“临床药理研究基地”、卫生部“专科医师规范化培训基地”、卫生部首批“呼吸内镜诊疗技术培训基地”。
</summary>
<detailurl>呼吸内科.htm</detailurl>
</keshi>
<keshi>
<name>内分泌科</name>
<id></id>
<summary>
????1986年被国家教委批准为内分泌专业博士授予点,1996年被江苏省卫生厅批准为重点学科,1998年成为国家医学继续教育基地和国家药品临床验证机构。课题方面,近3年来承担重大课题3项、国际合作项目1项、国家自然科学基金14项,其他省部级课题17项,科技重大专项基金3项。
</summary>
<detailurl>内分泌科.htm</detailurl>
</keshi>
<keshi>
<name>血液内科</name>
<id></id>
<summary>????南京医科大学第一附属医院(江苏省人民医院)血液科简介
南京医科大学第一附属医院(江苏省人民医院)血液科是国家临床重点专科建设单位、江苏省优势学科(临床医学)、江苏省重点学科(内科)、江苏省兴卫工程重点学科(共建)、江苏省临床重点专科、江苏省高校优秀科技创新团队。
</summary>
<detailurl>血液内科.htm</detailurl>
</keshi>
<keshi>
<name>消化内科</name>
<id></id>
<summary>????江苏省人民医院消化科是江苏省“135”和“兴卫工程”医学重点学科,江苏省卫生厅重点临床专科。卫生部消化医师专科培训基地(示范点),卫生部消化内镜诊疗培训基地,卫生部内镜消毒灭菌培训基地.
自上世纪60 年代创建以来,学科建设蓬勃发展,规模逐步扩大。现有消化门诊(专科和专家门诊)。</summary>
<detailurl>消化内科.htm</detailurl>
</keshi>
<keshi>
<name>肾内科</name>
<id></id>
<summary>
????本学科为我国最早建立肾脏病专科和血液透析中心的单位之一。现已成为拥有一个达全国一流、国际先进水平的血液净化中心,及相应规模病房的学术专科。是南京医科大学博士、硕士授予点,江苏省教委重点学科、江苏省重点专科,卫生部专科医师培训基地,国家临床药物试验机构。
</summary>
<detailurl>肾内科.htm</detailurl>
</keshi>
<keshi>
<name>神经内科</name>
<id></id>
<summary>
????南京医科大学附属第一医院神经内科现由二个病区(70张床)、门诊、急诊、神经电生理实验室和临床神经病学研究室(脑脊液细胞研究室)所构成。每年收容各类神经系统疑难危重病人1000人次,门诊诊治7万多人次,急诊抢救近1万人次。本学科在神经系统各类疾病的诊治方面有着丰富的临床经验。
</summary>
<detailurl>神经内科.htm</detailurl>
</keshi>
<keshi>
<name>风湿免疫科</name>
<id></id>
<summary>
????江苏省人民医院风湿科1992年成立,2009年获江苏省风湿病学临床重点专科,是南京医科大学临床风湿免疫硕士学位授予点,从属的大内科是内科学博士学位授予点及内科博士后流动站。目前有独立的专科实验室以及每日开诊的专家、专科门诊。本专科实验室及临床免疫实验室设备先进。
</summary>
<detailurl>风湿免疫科.htm</detailurl>
</keshi>
<keshi>
<name>感染病科</name>
<id></id>
<summary>
????在著名热带病学家许本谦教授和陈钟英、贾辅忠、王明秀、唐保元、黄祖瑚、李军等历届科主任的带领下,经过数十年的艰苦努力,在常见重大传染性疾病的诊断治疗、临床教学、科研工作、人才培养和学科建设等方面取得了显著成绩。今天的感染病科设施优良,宽敞明亮的门诊大厅。
</summary>
<detailurl>感染病科.htm</detailurl>
</keshi>
<keshi>
<name>肿瘤科</name>
<id></id>
<summary>
????江苏省人民医院肿瘤科为江苏省人民医院重点发展科室之一,科室研究室为江苏省135重点实验室之一。曾获江苏省“十一五”肿瘤重点学科,是江苏省“兴卫工程”高技术平台培育点之一,卫生部“高强度聚焦超声技术治疗肿瘤综合评价”培育点之一。科室自1999年底成立。
</summary>
<detailurl>肿瘤科.htm</detailurl>
</keshi>
<keshi>
<name>皮肤科</name>
<id></id>
<summary>????江苏省人民医院皮肤科始建于1948年,历史悠久,技术精良,
是江苏省内综合医院中学术规模最大、综合实力最强的皮肤病专业诊疗机构,专业治疗各种皮肤病和性病。我科为国务院首批博士点授予点,目前为江苏省重点学科、博士后流动站,是国家卫生部皮肤性病学科药理基地。
</summary>
<detailurl>皮肤科.htm</detailurl>
</keshi>
<keshi>
<name>普通内科(全科医学)</name>
<id></id>
<summary>????[详细内容]</summary>
<detailurl>普通内科(全科医学).htm</detailurl>
</keshi>
<keshi>
<name>河西综合内科(心血管)</name>
<id></id>
<summary>????[详细内容]</summary>
<detailurl>河西综合内科(心血管).htm</detailurl>
</keshi>
<keshi>
<name>麻醉手术科</name>
<id></id>
<summary>
????江苏省人民医院(南京医科大学第一附属医院)麻醉科是江苏省重点临床专科,江苏省“135”医学重点共建学科。江苏省人民医院麻醉科专科特色鲜明,尤其是危、重、疑、难、杂病人的麻醉、器官移植病人的麻醉,在麻醉与内分泌、药物对支气管平滑肌张力的影响等方面在国内具有一定的影响。
</summary>
<detailurl>麻醉手术科.htm</detailurl>
</keshi>
<keshi>
<name>ICU</name>
<id></id>
<summary>
????监护病房筹建于1983年8月,于1984年9月28日正式接受病人,设床位6张,是国内最早成立的ICU之一。1985年2月,时任院长林桂芳兼任科主任,同年5月,奚云清任科副主任,并聘请王一镗教授和李德馨主任为顾问。1990年徐鑫荣任科主任。经过20年的发展。
</summary>
<detailurl>ICU.htm</detailurl>
</keshi>
<keshi>
<name>骨科</name>
<id></id>
<summary>
????南京医科大学第一附属医院(江苏省人民医院)骨科是江苏省“135”工程重点学科,博士、硕士学位授予点、博士后流动站,含3个病区105张床位;共有医护人员84名,其中医生37名,技师3名,护理人员44名;拥有教授、主任医师10人,副教授、副主任医师11人。
</summary>
<detailurl>骨科.htm</detailurl>
</keshi>
</keshis>
爬取疾病数据
做这个源于一个想法,比如你要查头痛,会列出所有可能导致头痛的疾病和该疾病其他症状,网上是不存在专业医学数据库这种东西的,因此需要自己从其他医学网站爬得,做到手机app中,并利用jsp网站进行大型数据库的查询是非常好的方法,输入一个词,可以搜索出医生/科室/位置/疾病/症状/相似信息。为了达到这个目的,必须有自己的医学数据库,而合作的医院并没提供,因此先自己实验一下了。现在的数据库已有180M,收录15000条内容
package symptom;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import SQLite.Database;
import SQLite.Exception;
public class zzkfamilydoctorcomcn
{
public final static int SYMPTOM=0;
public final static int DISEASE=1;
public static int threadnum=32;
private Queue<ELE> dataQueue=new LinkedList<ELE>();//症状队列
public Database db=null;
public class ELE
{
public ELE(String url,int type)
{
this.url=url;
this.type=type;
}
/**数据库格式
* Name 症状/疾病名
Id 全局唯一标识
IsSymptom 症状/疾病?
BodyPart 身体部位 ----症状 头:眼睛
Keshi 挂号科室 ----疾病 内科:男科
Description 概述
DDescription详述
WithSymptom 伴随症状 ----疾病对应症状简述,逗号隔开
WithDSymptom详细症状 ----疾病对应症状详述
PossibleIll 相关疾病 ----症状可能疾病,大项逗号隔开,小项冒号隔开 疾病:科室:伴随症状
Pathogeny 病因
Check 检查
Diagnosis 诊断鉴别
Popularity 疾病/症状 搜索热度
*
*/
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public String getBodypart()
{
return bodypart;
}
public void setBodypart(String bodypart)
{
this.bodypart = bodypart;
}
public void setwithsymptom(String withsymptom)
{
this.withsymptom=withsymptom;
}
public String getwithsymptom()
{
return this.withsymptom;
}
private String name="";//症状名
private String url="";//数据地址
private int type=SYMPTOM;//疾病还是症状
private String bodypart="";//身体部位 头:眼睛
private String withsymptom="";
private String keshi="";
public void resolve()
{
String description="";
String ddescription="";
String withdsymptom="";
StringBuilder possibleill=new StringBuilder();
String pathogeny="";
String check="";
String diagnosis="";
threadnum--;
String sql="";
try
{
Document doc=null;
try
{
doc = Jsoup.connect(url).timeout(0).get();
}
catch (java.lang.Exception e)
{
e.printStackTrace();
return;
}
if(type == SYMPTOM)
{//如果是症状
String[] dataset=doc.select("div.brumbs").text().split(" > ");
if(dataset.length <= 2)
return;
name=dataset[dataset.length-1];
System.out.println(name);
bodypart=doc.select("div.jzxx a").get(2).text();
keshi=dataset[dataset.length-2];
description=doc.select("div.introductionTextBox").text();
ddescription=description;
Elements tagnames=doc.select("div.subNav a");
for(Element tag:tagnames)
{
if(tag.text().equals("病因"))
{
pathogeny=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.module.mPathogeny div.moduleContent").text();
}
else if(tag.text().equals("诊断"))
{
diagnosis=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.module.mFeature div.moduleContent").text();
}
}
//处理相关疾病
Elements ll=doc.select("div.area.aXgjb div.colMain tr");
if(!ll.isEmpty())
ll.remove(0);
if(!ll.isEmpty())
{
for(Element ele:ll)
{
Elements temp2=ele.children();
possibleill.append(temp2.get(0).text());
possibleill.append(":");
possibleill.append(temp2.get(1).text());
possibleill.append(":");
possibleill.append(temp2.get(2).text());
possibleill.append(",");
}
if(possibleill.length() >= 1)
{
possibleill.deleteCharAt(possibleill.length()-1);//去掉多余的','
}
}
description=description.replace('\'',' ').replace('"',' ');
ddescription=ddescription.replace('\'',' ').replace('"',' ');
withsymptom=withsymptom.replace('\'',' ').replace('"',' ');
withdsymptom=withdsymptom.replace('\'',' ').replace('"',' ');
String ill=possibleill.toString().replace('\'',' ').replace('"',' ');
pathogeny=pathogeny.replace('\'',' ').replace('"',' ');
check=check.replace('\'',' ').replace('"',' ');
diagnosis=diagnosis.replace('\'',' ').replace('"',' ');
sql="insert into symptomdata values('"+name+"','0','1','"+bodypart+"','"+keshi+"','"+description+
"','"+ddescription+"','"+withsymptom+"','"+withdsymptom+"','"+ill+"','"+
pathogeny+"','"+check+"','"+diagnosis+"','0')";
db.exec(sql,null);
System.out.println(name+" left:"+dataQueue.size());
}
else if(type == DISEASE)
{
String[] dataset=doc.select("div.brumbs").text().split(" > ");
if(dataset.length <= 2)
return;
name=dataset[dataset.length-1];
System.out.println(name);
bodypart=doc.select("span[itemprop=bodyLocation]").text();
keshi=dataset[dataset.length-2];
description=doc.select("div.introductionTextBox").text();
ddescription=description;
Elements tagnames=doc.select("div.subNav a");
for(Element tag:tagnames)
{
if(tag.text().equals("病因"))
{
pathogeny=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.module.mPathogeny div.moduleContent").text();
}
else if(tag.text().equals("诊断"))
{
diagnosis=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.module.mFeature div.moduleContent").text();
}
else if(tag.text().equals("症状"))
{
withdsymptom=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.module.mIntro.mSymptom div.moduleContent").text();
}
}
//处理相关疾病
Elements ll=doc.select("div.area.aXgjb div.colMain tr");
if(!ll.isEmpty())
ll.remove(0);
if(!ll.isEmpty())
{
for(Element ele:ll)
{
Elements temp2=ele.children();
possibleill.append(temp2.get(0).text());
possibleill.append(":");
possibleill.append(temp2.get(1).text());
possibleill.append(":");
possibleill.append(temp2.get(2).text());
possibleill.append(",");
}
if(possibleill.length() >= 1)
{
possibleill.deleteCharAt(possibleill.length()-1);//去掉多余的','
}
}
description=description.replace('\'',' ').replace('"',' ');
ddescription=ddescription.replace('\'',' ').replace('"',' ');
withsymptom=withsymptom.replace('\'',' ').replace('"',' ');
withdsymptom=withdsymptom.replace('\'',' ').replace('"',' ');
String ill=possibleill.toString().replace('\'',' ').replace('"',' ');
pathogeny=pathogeny.replace('\'',' ').replace('"',' ');
check=check.replace('\'',' ').replace('"',' ');
diagnosis=diagnosis.replace('\'',' ').replace('"',' ');
sql="insert into symptomdata values('"+name+"','0','0','"+bodypart+"','"+keshi+"','"+description+
"','"+ddescription+"','"+withsymptom+"','"+withdsymptom+"','"+ill+"','"+
pathogeny+"','"+check+"','"+diagnosis+"','0')";
db.exec(sql,null);
System.out.println(name+" left:"+dataQueue.size());
}
}
catch (IOException e)
{
System.out.println(sql);
System.out.println(url);
e.printStackTrace();
}
catch (Exception e)
{
System.out.println(sql);
System.out.println(url);
e.printStackTrace();
}
finally
{
threadnum++;
}
}
}
public zzkfamilydoctorcomcn()
{
try
{
db=new Database();
db.open("J:/symptom.db",0666);
// //按症状查询
// for(int i=1;i<8000;i++)
// {
// String cururl="http://zzk.familydoctor.com.cn/"+i;
// dataQueue.offer(new ELE(cururl,SYMPTOM));
// }
//按疾病查询
for(int i=6900;i<11000;i++)
{
String cururl="http://jbk.familydoctor.com.cn/info"+i;
dataQueue.offer(new ELE(cururl,DISEASE));
}
}
catch(Exception e)
{
e.printStackTrace();
}
new Thread()
{
@Override
public void run()
{
try
{
sleep(1000);
while(!dataQueue.isEmpty())
{
int num=32;
while(num-- > 0 && threadnum > 0 && !dataQueue.isEmpty())
{
new Thread()
{
@Override
public void run()
{
ELE curele=dataQueue.poll();
if(curele != null)
curele.resolve();
}
}.start();
}
sleep(200);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}.start();
}
public static void main(String[] args)
{
new zzkfamilydoctorcomcn();
}
}
package symptom;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.LinkedList;
import java.util.Queue;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import SQLite.Database;
import SQLite.Exception;
public class tag120askcom
{
public final static int SYMPTOM=0;
public final static int DISEASE=1;
public static int threadnum=10;
private String beginstr=null;
private Queue<ELE> dataQueue=new LinkedList<ELE>();//症状队列
public Database db=null;
private int total;
public class ELE
{
public ELE(String name,String url,int type,String bodypart,String keshi)
{
if(name == null || name.equals(""))
System.out.println("error");
this.name=name;
this.url=url;
this.type=type;
this.keshi=keshi;
this.bodypart=bodypart;
}
/**数据库格式
* Name 症状/疾病名
Id 全局唯一标识
IsSymptom 症状/疾病?
BodyPart 身体部位 ----症状 头:眼睛
Keshi 挂号科室 ----疾病 内科:男科
Description 概述
DDescription详述
WithSymptom 伴随症状 ----疾病对应症状简述,逗号隔开
WithDSymptom详细症状 ----疾病对应症状详述
PossibleIll 相关疾病 ----症状可能疾病,大项逗号隔开,小项冒号隔开 疾病:科室:伴随症状
Pathogeny 病因
Check 检查
Diagnosis 诊断鉴别
Popularity 疾病/症状 搜索热度
*
*/
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public String getUrl()
{
return url;
}
public void setUrl(String url)
{
this.url = url;
}
public int getType()
{
return type;
}
public void setType(int type)
{
this.type = type;
}
public String getKeshi()
{
return keshi;
}
public void setKeshi(String keshi)
{
this.keshi = keshi;
}
public String getBodypart()
{
return bodypart;
}
public void setBodypart(String bodypart)
{
this.bodypart = bodypart;
}
private String name="";//症状名
private String url="";//数据地址
private int type=SYMPTOM;//疾病还是症状
private String keshi="";//疾病科室(大科室)keshi+":"+血液内科
private String bodypart="";//身体部位 头:眼睛
public void resolve()
{
String description="";
String ddescription="";
String withsymptom="";
String withdsymptom="";
StringBuilder possibleill=new StringBuilder();
String pathogeny="";
String check="";
String diagnosis="";
threadnum--;
String sql="";
try
{
Document doc=Jsoup.connect(url).timeout(0).get();
if(type == SYMPTOM)
{//如果是症状
description=doc.select("dl.p_sibox1dl.clears p").text();
String temp=doc.select("dl.p_sibox1dl.clears p a").attr("abs:href");
ddescription=Jsoup.connect(temp).timeout(0).get().select("div.p_cleftartbox").text();
Elements tagnames=doc.select("div.w_headnav_div a");
for(Element tag:tagnames)
{
if(tag.text().equals("病因"))
{
pathogeny=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("检查"))
{
check=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("诊断鉴别"))
{
diagnosis=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("相关疾病"))
{
Elements ll=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("ul.p_cbox3ul");
if(!ll.isEmpty())
{
Elements eles=ll.get(0).children();
for(Element ele:eles)
{
possibleill.append(ele.select("span.p_cbox3li1 a").text());
possibleill.append(":");
possibleill.append(ele.select("span.p_cbox3li2 a").text());
possibleill.append(":");
possibleill.append(ele.select("span.p_cbox3li3 a").text());
possibleill.append(",");
}
if(possibleill.length() >= 1)
{
possibleill.deleteCharAt(possibleill.length()-1);//去掉多余的','
}
}
}
}
description=description.replace('\'',' ').replace('"',' ');
ddescription=ddescription.replace('\'',' ').replace('"',' ');
withsymptom=withsymptom.replace('\'',' ').replace('"',' ');
withdsymptom=withdsymptom.replace('\'',' ').replace('"',' ');
String ill=possibleill.toString().replace('\'',' ').replace('"',' ');
pathogeny=pathogeny.replace('\'',' ').replace('"',' ');
check=check.replace('\'',' ').replace('"',' ');
diagnosis=diagnosis.replace('\'',' ').replace('"',' ');
sql="insert into symptomdata values('"+name+"','0','1','"+bodypart+"','"+keshi+"','"+description+
"','"+ddescription+"','"+withsymptom+"','"+withdsymptom+"','"+ill+"','"+
pathogeny+"','"+check+"','"+diagnosis+"','0')";
db.exec(sql,null);
System.out.println(name+" left:"+dataQueue.size()+" total:"+total);
}
else if(type == DISEASE)
{
description=doc.select("div.p_lbox1_ab p").text();
String temp=doc.select("div.p_lbox1_ab p a").attr("abs:href");
Document doc2=Jsoup.connect(temp).timeout(0).get();
ddescription=doc2.select("div.p_cleftartbox").text();
Elements tagnames=doc.select("div.p_topbox a");
for(Element tag:tagnames)
{
if(tag.text().equals("病因"))
{
pathogeny=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("检查"))
{
check=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("鉴别"))
{
diagnosis=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("症状"))
{
withdsymptom=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
else if(tag.text().equals("并发症"))
{
withsymptom=Jsoup.connect(tag.attr("abs:href")).timeout(0).get().select("div.p_cleftartbox").text();
}
}
description=description.replace('\'',' ').replace('"',' ');
ddescription=ddescription.replace('\'',' ').replace('"',' ');
withsymptom=withsymptom.replace('\'',' ').replace('"',' ');
withdsymptom=withdsymptom.replace('\'',' ').replace('"',' ');
String ill=possibleill.toString().replace('\'',' ').replace('"',' ');
pathogeny=pathogeny.replace('\'',' ').replace('"',' ');
check=check.replace('\'',' ').replace('"',' ');
diagnosis=diagnosis.replace('\'',' ').replace('"',' ');
sql="insert into symptomdata values('"+name+"','0','0','"+bodypart+"','"+keshi+"','"+description+
"','"+ddescription+"','"+withsymptom+"','"+withdsymptom+"','"+ill+"','"+
pathogeny+"','"+check+"','"+diagnosis+"','0')";
db.exec(sql,null);
System.out.println(name+" left:"+dataQueue.size()+" total:"+total);
}
}
catch (IOException e)
{
System.out.println(sql);
System.out.println(url);
e.printStackTrace();
}
catch (Exception e)
{
System.out.println(sql);
System.out.println(url);
e.printStackTrace();
}
finally
{
threadnum++;
}
}
}
public tag120askcom()
{
try
{
db=new Database();
db.open("J:/symptom.db",0666);
Document doc=null;
Elements eles=null;
//按症状查询
doc=Jsoup.connect("http://tag.120ask.com/zhengzhuang/").timeout(0).get();
eles=doc.select("ul.p_leftdivnav").get(0).children();
for(Element ele:eles)
{
Elements test=ele.select("div.p_lnavdisdiv h3 a");
Document innerdoc=Jsoup.connect(test.attr("abs:href")).timeout(0).get();
Element toprocess=innerdoc.select("div.w_header").get(0);
String bigbodypart=toprocess.select("h3").text();
Elements subset=toprocess.select("a");
//先直接遍历症状
Elements innerele=innerdoc.select("div.w_neike.clears").get(0).children();
for(int i=0;i<innerele.size();i+=2)
{
String bigclass=innerele.get(i).text();//获取大科室名
for(Element tempele:innerele.get(i+1).select("a"))
{
dataQueue.offer(new ELE(tempele.attr("title"),tempele.attr("abs:href"),SYMPTOM,bigbodypart,bigclass));
}
}
if(!subset.isEmpty())
{//有子节点则需要连接到每个网址然后遍历症状
for(Element curele:subset)
{
Document temp=Jsoup.connect(curele.attr("abs:href")).timeout(0).get();
Elements innerelel=temp.select("div.w_neike.clears").get(0).children();
for(int i=0;i<innerelel.size();i+=2)
{
String bigclass=innerelel.get(i).text();//获取大科室名
for(Element tempele:innerelel.get(i+1).select("a"))
{
dataQueue.offer(new ELE(tempele.attr("title"),tempele.attr("abs:href"),SYMPTOM,
bigbodypart+":"+curele.text(),bigclass));
}
}
}
}
}
//按疾病查询
doc=Jsoup.connect("http://tag.120ask.com/jibing/").timeout(0).get();
eles=doc.select("ul.p_leftdivnav").get(0).children();
for(Element ele:eles)
{
Elements test=ele.select("div.p_lnavdisdiv h3 a");
Document innerdoc=Jsoup.connect(test.attr("abs:href")).timeout(0).get();
Element toprocess=innerdoc.select("div.w_header").get(0);
String bigbodypart=toprocess.select("h3").text();
Elements subset=toprocess.select("a");
//先直接遍历症状
Elements innerele=innerdoc.select("div.w_neike.clears").get(0).children();
for(int i=0;i<innerele.size();i+=2)
{
String bigclass=innerele.get(i).text();//获取大科室名
for(Element tempele:innerele.get(i+1).select("a"))
{
dataQueue.offer(new ELE(tempele.attr("title"),tempele.attr("abs:href"),DISEASE,bigbodypart,bigclass));
}
}
if(!subset.isEmpty())
{//有子节点则需要连接到每个网址然后遍历症状
for(Element curele:subset)
{
Document temp=Jsoup.connect(curele.attr("abs:href")).timeout(0).get();
Elements innerele1=innerdoc.select("div.w_neike.clears").get(0).children();
for(int i=0;i<innerele1.size();i+=2)
{
String bigclass=innerele1.get(i).text();//获取大科室名
for(Element tempele:innerele1.get(i+1).select("a"))
{
dataQueue.offer(new ELE(tempele.attr("title"),tempele.attr("abs:href"),DISEASE,bigbodypart,bigclass));
}
}
}
}
}
System.out.println(dataQueue.size());
for(ELE ele:dataQueue)
{
System.out.println(ele.name);
}
total=dataQueue.size();
if(beginstr != null)
{
while(!dataQueue.poll().getName().equals(beginstr))
{
;
}
}
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (Exception e)
{
e.printStackTrace();
}
new Thread()
{
@Override
public void run()
{
try
{
sleep(1000);
while(!dataQueue.isEmpty())
{
int num=1;
while(num-- > 0 && threadnum > 0 && !dataQueue.isEmpty())
{
new Thread()
{
@Override
public void run()
{
ELE curele=dataQueue.poll();
if(curele != null)
curele.resolve();
}
}.start();
}
sleep(200);
}
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
}.start();
}
public static void main(String[] args)
{
new tag120askcom();
}
}