这一份博客直接贴代码了,因为:),作为平时的学习我习惯写完代码后反观一次,做比较详细的注释。
在这里BB一句,有时候我们学点东西之前总会正儿八经正襟危坐地问啊问啊“怎么入门怎么入门怎么入门呢”。个人有点小感慨:边学边做就是很好的开始,特别是有一个任务有一个目的地学习,知识就是个无向循环图,你可能会为了一个任务,不说“学到”,你也会接触到很多其它方面的知识,你以前学过的东西也都铺垫成你追求其它知识的道路。所以不要再喊着“入门”了直接上路吧!
比如说,下面我们来爬取豆瓣影评(静态页面,即还不去处理由js来承载的评论),然后我们就接触到了一点服务端与客户端交互的知识,一点有关于java流的东西,一点正则的东西 (每一个这样的括号(.*?)都对应了要提取的部分)
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Spider {
public static String SendGet(String url, String decode){
//定义一个字符串用来存储网页内容
String result = "";
//定义一个缓冲字符输入流
BufferedReader in = null; //为什么要用buffered,因为是可追加的。为什么不用byte,因为是定长的。若未超长则可追加,若超长了则不能追加
try{
//将string 转成url对象
URL realUrl = new URL(url);
//初始化一个链接到那个url的连接
URLConnection connection = realUrl.openConnection();
//开始实际的连接
connection.connect();
//初始化bufferedReader输入流来读取url的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream(), decode));
//用来临时存储抓取到的每一行数据
String line;
while((line = in.readLine()) != null){
//遍历抓取到的每一行都放到result中去
result += line;
}
} catch (Exception e){
System.out.println("something wrong when sending GET requirement! " +e);
e.printStackTrace();
}
//无论成功与否,用finally来关闭输入流
finally{
try{
if(in != null){
in.close();
}
} catch(Exception e2){
e2.printStackTrace();
}
}
return result;
}
public static String RegexString(String targetStr, String patternStr){
//定义一个样式模板,此中使用正则表达式,括号中是要抓的内容
Pattern pattern = Pattern.compile(patternStr);
//定义一个matcher用来做匹配
Matcher matcher = pattern.matcher(targetStr);
if(matcher.find()){
String res = "";
for(int i = 0; i <= matcher.groupCount(); i ++){
res = res + matcher.group(i) + " ";
}
return res;
}
return "Nothing";
}
public static void GetDouBan(String content){
//ArrayList<douban> results = new ArrayList<douban>();
Pattern pattern = Pattern.compile("subject-title.*?>(.*?)<.*?allstar(.*?)0 main-title-rating.*?short-content\">(.*?)<"); //正则表达式匹配我们需要的地方
Matcher matcher = pattern.matcher(content);
boolean isfind = matcher.find();
while(isfind){
//group(0)取出的是全部内容
System.out.println("name: " + matcher.group(1));
System.out.println("score: " + matcher.group(2));
System.out.println("comment: " + matcher.group(3));
isfind = matcher.find();
}
}
/**/
public static void main(String[] args) {
String url = "https://movie.douban.com/review/best/";
String result = SendGet(url, "utf-8");
GetDouBan(result);
}
}