一个简单的爬虫(1)

来源:互联网 发布:婚纱照相册排版软件 编辑:程序博客网 时间:2024/05/21 10:54

在学习了简单的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("&middot;");//用来匹配演员英文名称中的姓氏与名字之间的点,由于名字中间的点在html源码中是使用转义的字符的,所以得到的字符串也是&middot;所以我们仍需要对它进行替换回去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("&middot;");        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);        }    }}

!!初次尝试,错误之处望指正!!

0 0
原创粉丝点击