前言

    做jsp大作业时,需要采集一些网站的数据,人工查阅工作量太大了,网络爬虫成了很好的选择。当然也要小心翼翼,很多网站都有反爬虫机制,被发现的话,ip可能会被封。我是小白,刚接触爬虫,就爬几十个数据,用于学习,一般不会被封。

    本文记载一下我第一次使用java爬虫的案例,很简单,复杂的功能没涉及,后续补习。

爬虫类

这里是一个别人写好的爬虫类ConnectionURL.java(稍有修改),直接复制粘贴即可。只有一个静态方法,功能是根据传入的地址(address),获取网站源代码(html),并以String的形式返回。

然后我们就可以根据返回的html,通过正则表达式得到我们想要的数据。

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class ConnectionURL {
    public static String Connect(String address){
        HttpURLConnection conn = null;
        URL url = null;
        InputStream in = null;
        BufferedReader reader = null;
        StringBuffer stringBuffer = null;
        try {
            url = new URL(address);
            conn = (HttpURLConnection) url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setDoInput(true);
            conn.connect();
            in = conn.getInputStream();
            reader = new BufferedReader(new InputStreamReader(in));
            stringBuffer = new StringBuffer();
            String line = null;
            while((line = reader.readLine()) != null){
                stringBuffer.append(line+'\n');
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally{
            if(conn!=null)conn.disconnect();
            try {
                if(in!=null)in.close();
                if(in!=null)reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if(stringBuffer!=null)return stringBuffer.toString();
        return "";
    }
}

爬虫示例

新建一个Test.java ,直接将你要爬取的那个页面的网址,扔进ConnectionURL.Connec(address),即可返回页面的html源码,

然后找到自己想要的数据所在的字符串,用正则表达式匹配出来,就得到我的最终数据。

(正则表达式不再累赘,百度一下有很多完美的讲解)

import Reptile.ConnectionURL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {
        //更新用户的cf rating
        String score=getRating("tourist");
        System.out.println("爬取到的rating是:"+score);
    }
    
    public static String getRating(String cfName){
        String html= ConnectionURL.Connect("http://Codeforces.com/profile/"+cfName);

        Pattern pattern=Pattern.compile("<span style=\"font-weight:bold;\" class=\"\\S*\">[0-9]+");
        Matcher matcher=pattern.matcher(html);
        
        String score="0";
        if(matcher.find()){
            //只取第一个就行了,如果正则匹配到多个,那就把这里if改成while
            int s=matcher.group().indexOf(">");
            score=matcher.group().substring(s+1);
        }
        return score;
    }
}