用java爬取杭电oj已ac代码

电脑的硬盘突然坏了,新安装的eclipse的代码全没了,后来发现杭电上已经ac的代码可以查看到,我是个有强迫症的人,我宁愿做很多件不同的事也不愿意做一件相同的事(复制黏贴)许多次,所以就突发奇想,做个爬虫爬取已经ac的代码。
首先打开杭电的首页,这里有我想要的信息
这里写图片描述
这里,解决的问题的序列号事我们想要的。查看网页源码
这里写图片描述
就在这里找到我们想要的信息,我们要将他存下来,然后进去分析。
接着随便点击一个进去分析。
这里写图片描述
对这个图片信息,注意链接是有规律的,通过简单拼凑就可以进入,注意第一个 run id这个信息,是需要分析抓取的,然后点击code len的链接。
这里写图片描述
发现自己的代码就在这。发现链接,就是通过run id拼凑而来。这样思路就清晰了。
1:抓取主页面,获得题目号。
2:对于每个题目号,拼凑地址进入第二个界面,在分析爬取这里的run id。
3:通过run id号拼凑地址进入有代码的网页,在通过解析工具获取代码。
4:通过io传输传到本地文件
5:ps(解析工具:jsoup)注意要通过f12抓取登陆过的cookie模拟登陆,因为只爬一次,就直接抓取cookie值传入。
附上代码:
1:抓取主页面

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class exercise {//爬取标题
    public static void main(String[] args) throws IOException
    {
        Map<String,String> map=new HashMap();//粗存id和正确的次数 
        String url="http://acm.hdu.edu.cn/userstatus.php?user=1315426911";//我的杭电页面
        Document doc=Jsoup.connect(url).get();
        Elements links=doc.getElementsByTag("script");
        Elements links1=links.attr("language", "javascript");
        Element links2=links1.get(links1.size()-2);
        String links3=links2.html();
        System.out.println(links3);//输出p(1001,2,6);p(1003,2,16);p(1006,1,3);p(1008,1,1);p(1009,3,16);**********
        String value[]=links3.split(";");//获取总共的题目数
        int length=value.length;
        for(int i=0;i<length;i++)
        {
            String id=value[i].substring(2, 6);//获取每题的题号
            String time="";
            System.out.println(value[i]);//每个题目的分页
            String url2="http://acm.hdu.edu.cn/status.php?user=1315426911&pid="+id+"&status=5";
            RunID run=new RunID(url2,id);//每个分页中调用获取代码,将题号传递下去
            run.getrunid();
        }

    }

}

2:抓取界面二:(需要分析网页源码结构)

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class RunID { //爬取run id
    String url;
    String id;//题目
    public RunID(String url,String id)
    {
        this.url=url;
        this.id=id;
    }
    public void getrunid() throws IOException
    {

        Document doc = Jsoup.connect(url).get();    
        Elements links=doc.getElementsByClass("table_text");//获取表格
        String link1=links.select("td[height]").text();//找到编号
        String a[]=link1.split(" ");        
      for(int i=2;i<3;i++)
      {
          System.out.println(a[i]+"  "+id);
          File file=new File("E:\\杭电oj\\杭电oj"+id+".java");//绝对路径
          if(!file.exists()) { file.createNewFile();}  // 不存在时,创建新的
          FileWriter  out=new FileWriter(file);//写入
          BufferedWriter bufw=new BufferedWriter (out);
          bufw.write(new gettext("http://acm.hdu.edu.cn/viewcode.php?rid="+a[i]).get());    
          bufw.close();
          out.close();//关闭流
      }

    }

}

3:截取代码:

import java.io.IOException;
import java.util.List;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;


public class gettext {
    String url;
    public gettext(String url)
    {
        this.url=url;
    }
    public String get() throws IOException
    {
        Connection con=Jsoup.connect(url);
          con.cookie("PHPSESSID", "jnoi0bm477r83220ft8nja4gv6");
          //这个cookie需要临时查看写上去
        Document doc=con.get();
        Element links=doc.getElementById("usercode");
        return links.text();//返回字符串代码
    }
}

这里写图片描述
这样在导入eclipse中就行了。

猜你喜欢

转载自blog.csdn.net/qq_40693171/article/details/80223984