package org.webpagedownload;
/**
* CNKI网页下载器1.0V。
* 本程序只对特定的CNKI网址有效,即可以实现下载CNKI某本期刊收录的所有文章的篇名、摘要、关键词、作者
*等信息,不能下载全文,当然这对于我的研究来说已经是足够了。
* 如下面这个网页的信息:http://epub.cnki.net/grid2008/detail.aspx?filename=TSGJ200808033&dbname=CJFD2008。
* 分析这个url可以看出TSGJ200808033:图书馆建设2008年8月第33篇文章,dbname指的是这篇文章存储的数据库:CJFD2008(08年);
* */
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
public class ThreadDownload {
public static void main(String[] args){
download dl = new download();
dl.start();
}
}
class download extends Thread{
private int h = 828101;
private String pageHtmlCode="";
private String charset="utf-8";
private String urlString="";
private InputStream ism;
private URL url;
private URLConnection connection;
private Scanner in;
private int state = 0;
public void run(){
download dl1 = new download();
System.out.println("================================");
/**
* 使用循环为程序分配路径,选定下载的杂志名称后,路径的变化规律可以从filename看出来,KJQB200815001代
* 表的是科技情报开发与经济这本杂志第15期第一篇杂志
* 使用for循环指定杂志名称,年份,期数可以了。dbname是一年一个库。
* http://epub.cnki.net/grid2008/detail.aspx?filename=KJQB200815001&dbname=CJFD2008
* */
for(int u=h;u<=830200;u++){
try {
if(dl1.getStat()==1){
System.out.println("U的值是不断变化的"+u+"状态值为"+dl1.getStat());
u--;
System.out.println("U的值是不断变化的"+u);
}
if(dl1.getStat()==2){
System.out.println("U的值是不断变化的"+u+"状态值为"+dl1.getStat());
u--;
System.out.println("U的值是不断变化的"+u);
}
urlString = "http://epub.cnki.net/grid2008/detail.aspx?filename=KJQB200"+u+"&dbname=CJFD2008";
url=new URL(urlString); //读取URL
System.out.println("读取 url: "+url);
connection=url.openConnection();
connection.connect(); //链接URL
ism=connection.getInputStream(); //获得URL指向的网页输入流
for(int i=1;in.hasNextLine();i++){
pageHtmlCode+=in.nextLine(); //一行一行的将扫描的数据保存在pageHtmlCode变量中
}
int phc = pageHtmlCode.length();
System.out.println(phc);
/**
* URL过滤,根据CNKI网页数据判断当取得的字符(用pageHtmlCode变量保存)串长度phc=95时,
* 上述url指向的路径不存在;phc=110时,服务器拒绝下载请求,程序进入5分钟休眠,5分钟后重
* 新提交下载请求;phc>1000时,链接有效,并进行下载,CNKI返回的有效链接一般都在2.5K以上。
* */
if(phc == 95){
System.out.println("此链接无效,跳过!");
}
if(phc == 110){
System.out.println("服务器拒绝下载,线程休眠300秒!");
dl1.setStat(2);
try{
Thread.sleep(5*60*1000);
System.out.println("线程被唤醒!");
}
catch (InterruptedException e){
e.printStackTrace();
}
}
if(phc > 1000) {
System.out.println("有效链接,网页下载中!");
String filename = "科技情报开发与经济"+u;
FileOutputStream fos = new FileOutputStream
("E://科技情报开发与经济//"+filename+".html",true); //存储网页的文件夹及网页名称,“科技情报开发与经济”文件夹必须事先创建好。
OutputStreamWriter osr=new OutputStreamWriter(fos,charset);
osr.write(pageHtmlCode); //将网页数据写进文件中
System.out.println("下载完毕");
}
pageHtmlCode = "";
}
catch (IOException e){
System.out.println("503错误!");
try{
System.out.println("线程进入300秒休眠");
dl1.setStat(1);
Thread.sleep(5*60*1000);
System.out.println("线程被唤醒!");
}
catch (InterruptedException e1){
e1.printStackTrace();
}
}
}
}
/**
*线程休眠之后避免程序又从h指定的初始值开始下载,造成重复下载
**/
public void setStat(int state){
this.state = state;
}
public int getStat(){
return state;
}
}
/**
* CNKI网页下载器1.0V。
* 本程序只对特定的CNKI网址有效,即可以实现下载CNKI某本期刊收录的所有文章的篇名、摘要、关键词、作者
*等信息,不能下载全文,当然这对于我的研究来说已经是足够了。
* 如下面这个网页的信息:http://epub.cnki.net/grid2008/detail.aspx?filename=TSGJ200808033&dbname=CJFD2008。
* 分析这个url可以看出TSGJ200808033:图书馆建设2008年8月第33篇文章,dbname指的是这篇文章存储的数据库:CJFD2008(08年);
* */
import java.net.URL;
import java.net.URLConnection;
import java.util.Scanner;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
public class ThreadDownload {
public static void main(String[] args){
download dl = new download();
dl.start();
}
}
class download extends Thread{
private int h = 828101;
private String pageHtmlCode="";
private String charset="utf-8";
private String urlString="";
private InputStream ism;
private URL url;
private URLConnection connection;
private Scanner in;
private int state = 0;
public void run(){
download dl1 = new download();
System.out.println("================================");
/**
* 使用循环为程序分配路径,选定下载的杂志名称后,路径的变化规律可以从filename看出来,KJQB200815001代
* 表的是科技情报开发与经济这本杂志第15期第一篇杂志
* 使用for循环指定杂志名称,年份,期数可以了。dbname是一年一个库。
* http://epub.cnki.net/grid2008/detail.aspx?filename=KJQB200815001&dbname=CJFD2008
* */
for(int u=h;u<=830200;u++){
try {
if(dl1.getStat()==1){
System.out.println("U的值是不断变化的"+u+"状态值为"+dl1.getStat());
u--;
System.out.println("U的值是不断变化的"+u);
}
if(dl1.getStat()==2){
System.out.println("U的值是不断变化的"+u+"状态值为"+dl1.getStat());
u--;
System.out.println("U的值是不断变化的"+u);
}
urlString = "http://epub.cnki.net/grid2008/detail.aspx?filename=KJQB200"+u+"&dbname=CJFD2008";
url=new URL(urlString); //读取URL
System.out.println("读取 url: "+url);
connection=url.openConnection();
connection.connect(); //链接URL
ism=connection.getInputStream(); //获得URL指向的网页输入流
for(int i=1;in.hasNextLine();i++){
pageHtmlCode+=in.nextLine(); //一行一行的将扫描的数据保存在pageHtmlCode变量中
}
int phc = pageHtmlCode.length();
System.out.println(phc);
/**
* URL过滤,根据CNKI网页数据判断当取得的字符(用pageHtmlCode变量保存)串长度phc=95时,
* 上述url指向的路径不存在;phc=110时,服务器拒绝下载请求,程序进入5分钟休眠,5分钟后重
* 新提交下载请求;phc>1000时,链接有效,并进行下载,CNKI返回的有效链接一般都在2.5K以上。
* */
if(phc == 95){
System.out.println("此链接无效,跳过!");
}
if(phc == 110){
System.out.println("服务器拒绝下载,线程休眠300秒!");
dl1.setStat(2);
try{
Thread.sleep(5*60*1000);
System.out.println("线程被唤醒!");
}
catch (InterruptedException e){
e.printStackTrace();
}
}
if(phc > 1000) {
System.out.println("有效链接,网页下载中!");
String filename = "科技情报开发与经济"+u;
FileOutputStream fos = new FileOutputStream
("E://科技情报开发与经济//"+filename+".html",true); //存储网页的文件夹及网页名称,“科技情报开发与经济”文件夹必须事先创建好。
OutputStreamWriter osr=new OutputStreamWriter(fos,charset);
osr.write(pageHtmlCode); //将网页数据写进文件中
System.out.println("下载完毕");
}
pageHtmlCode = "";
}
catch (IOException e){
System.out.println("503错误!");
try{
System.out.println("线程进入300秒休眠");
dl1.setStat(1);
Thread.sleep(5*60*1000);
System.out.println("线程被唤醒!");
}
catch (InterruptedException e1){
e1.printStackTrace();
}
}
}
}
/**
*线程休眠之后避免程序又从h指定的初始值开始下载,造成重复下载
**/
public void setStat(int state){
this.state = state;
}
public int getStat(){
return state;
}
}