用java写一个简单的爬虫示例

一、基础知识

  关于xml、html基本的标签标签文本知识

二、问题描述

完成一个单线程的爬虫程序。对给定的网址可以提取出其中所有的A标签中的包含的网址(href属性);

并根据这些网址再获得更多的网址。

要求:

  输入参数:网址,最大采集的网页数量。

输出:采集的网页文件

三、代码

import java.io.*;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.util.*;
public class SingleThreadJsoup {
    private  ArrayList<String> linksString;
    private int max;
    private int numberOfThread;

    //判断是否是String是不是一个链接,写的很简单,这里可以加逻辑
    public void SingleThreadJsoup(int m,int t){
        max = m;
        numberOfThread = t;
    }
    public Boolean isUrl(String href){
        if(href.startsWith("http://")){
            return true;
        }else
            return false;
    }
    //得到所有已知网页的href属性
    public void getHrefOfAll(String href,int m) throws IOException{
        linksString = new ArrayList<String>();
        max = m;
        int counter = 0;
        linksString.add(href);
        while(linksString.size() < max){
            getHrefOfA(linksString.get(counter++));
        }
        System.out.println(linksString);
    }
    //得到已知单个网页内的全部href
    public void getHrefOfA(String href) throws IOException{
        try{
            Document doc = Jsoup.connect(href).get();
            Elements links = doc.select("a[href]");
            for(Element link :links){
                if(linksString.size()<max){
                    String linkHref = link.attr("href");
                    if(isUrl(linkHref)&&!linksString.contains(linkHref)){
                        System.out.println(linkHref);
                        linksString.add(linkHref);
                    }
                }else{
                    System.out.println("满了");
                    return;    
                }
            }
        }catch(IOException e){
            System.out.println(e);
        }
    }
    //写入TXT文件
    public boolean write(String path) {
        BufferedWriter output = null;
        try {
            File f = new File(path);
            if (f.exists()) {
            } else {
                System.out.println("文件不存在,正在创建");
                if (f.createNewFile()) {
                    System.out.println("文件创建成功");
                } else {
                    System.out.println("文件创建失败");
                }
            }
            output = new BufferedWriter(new FileWriter(f));
            for(String s : linksString){
                output.write(s);
            }
            output.flush();
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            if (output != null) {
                try {
                    output.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    //用淘宝测试
    public static void main(String[] args) throws IOException{
        SingleThreadJsoup test = new SingleThreadJsoup();
        test.getHrefOfAll("http://www.taobao.com/",1000);
        test.write("saveRul.txt");
    }
}

 

写的比较乱 ..缺点有很多,比如当max很大的时候,占用内存会很高,只能当作爬虫的一个简简单单的“hello world”...

四、相关知识

  jsoup教程

  http://www.open-open.com/jsoup/

posted @ 2013-12-19 19:05  金发萌音  阅读(539)  评论(0编辑  收藏  举报