在学习了简单的java语法之后,练习使用java做一个简单的爬虫,将一个电影网页的电影介绍爬下来,首先需要了解爬虫是什么!
网络爬虫(简称爬虫,又名网页蜘蛛、网络机器人),是一种按照按照一定的规则,自动地抓取万维网信息的程序或者脚本。
在了解了网络爬虫的概念之后,我们需要知道如何去爬,首先我们需要获取到这些信息,如同我们访问网页请求链接返回我们需要的数据一样,我们需要首先获取到网页的信息,这里我们使用的是jsoup中从一个URL加载一个Document,这里的可以参考jsoup使用手册,事实上我们这里通过jsoup获取到的就是整个网页的源码,同时jsoup有许多处理此源码的方法,在这篇中用的是正则匹配来进行爬虫操作。
首先使用Document 的toString方法将Document文档全部转化为字符串,然后使用字符串进行相应的片段匹配。这里要用到了以下的匹配规则:
Pattern reg_htm = Pattern.compile("<[^>]+>");
//用来匹配html标签,当我们匹配到一段主要信息之后,该短信息往往是包含一些html标签的,我们需要将这些html标签替换为空(即删除这些html标签)
Pattern reg_name_ = Pattern.compile("·");
//用来匹配演员英文名称中的姓氏与名字之间的点,由于名字中间的点在html源码中是使用转义的字符的,所以得到的字符串也是·;所以我们仍需要对它进行替换回去
Pattern p = Pattern.compile("<span property=\"v:itemre.*</span>");
//该项目的匹配是采用html标签以及标签内的内容组合的方式进行匹配,匹配的内容是电影的名字,往往每一个字段对会有特殊的class或id以及一些特殊的属性,所以可以根据这些属性进行匹配。
上面是要进行匹配的一些正则及其用处,是一些要进行匹配的规则,接下来我们要对匹配的字符串进行处理,第一个处理就是摘取出匹配的部分,使用Pattern.match(String)进行匹配的查找,得到所有能够匹配的位置(实质上该方法返回值为Boolean类型,表明匹配成功或者匹配失败),然后使用.find()方法判断是否存在匹配的结果,然后依次取该结果,输出,当需要进行替换或者html代码需要进行删除时分别再次使用不同的正则进行匹配替换,最后输出结果,同时,还可利用Java I/O操作,将要输出的内容存成文件,方便下次查看。
下面是一个简单的豆瓣电影介绍的爬虫示例:
package Jsoup;
import org.jsoup.*;
import org.jsoup.nodes.*;
import javax.sound.midi.SysexMessage;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* Created by zhuxinquan on 15-12-15.
*/
public class Test {
public static void main(String[] args) throws IOException {
Document doc = Jsoup.connect("http://movie.douban.com/subject/25809384/?from=showing").timeout(5000).get();
String html = doc.toString();
String s = "";
Pattern reg_htm = Pattern.compile("<[^>]+>");
Pattern reg_name_ = Pattern.compile("·");
Pattern p = Pattern.compile("<span property=\"v:itemre.*</span>");
Matcher m = p.matcher(html);
while(m.find()){
s = m.group(0);
}
m = reg_htm.matcher(s);
s = m.replaceAll("");
System.out.println(s);
p = Pattern.compile("(?s)<span class=\"pl\">.*?</span></span>.*?<br />");
m = p.matcher(html);
while (m.find()) {
s = m.group(0);
Matcher m1 = reg_htm.matcher(s);
s = m1.replaceAll("");
m1 = reg_name_.matcher(s);
s = m1.replaceAll("·");
System.out.println(s);
}
//System.out.println(html);
p = Pattern.compile("(?s)(<span class=\"pl\">.*?<span property=\"v:genre\">.*?</span>\n" +
" <br />)");
m = p.matcher(html);
while (m.find()) {
s = m.group(0);
Matcher m1 = reg_htm.matcher(s);
s = m1.replaceAll("");
m1 = reg_name_.matcher(s);
s = m1.replaceAll("·");
System.out.println(s);
}
}
}
!!初次尝试,错误之处望指正!!