CNKI网页下载器

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值