前言
做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;
}
}