Jsoup解析网页(二)爬虫解析一个完整的网页

以我做的一个项目中的需求为例子,
需求:爬虫一个网页,将这个网页的内容解析,解析完将这个网页下载到我们自己的服务器保存。然后通过ftp上传到另一个服务器作为外部资源给别人访问。

我们就爬一个百度新闻作为测试:http://qijunjie.baijia.baidu.com/article/825950

简单的代码:

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Random;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 
 * @author kxl
 * 
 */

public class CrawlNews {
    public static void main(String[] args) {
         String url="http://qijunjie.baijia.baidu.com/article/825950";
         doCrawlNews(url);
    }

    public static boolean doCrawlNews(String url) {
            boolean downloadSuccess=false;
            Document doc = null;
            try {
                doc = Jsoup.connect(url).timeout(5000).get();
                //解析网页,替换成绝对路径的地址
                // 解析css样式
                dealHtmlLinkStyle(doc);
                // 解析超链接
                dealHtmlAlinkStyle(doc);
                // 解析javascript脚本样式
                dealhtmlJSScriptStyle(doc);
                // 解析网页-替换图片
                parseWithHtmlImage(doc);
                String file_name = new Random().nextInt(1000) + "." + "html";
                String filePath ="D:/soft/download/test/";

                File f = new File(filePath);
                if (!f.exists()) {
                    f.mkdirs();
                }

                 downloadSuccess=DownLoad(doc, filePath+file_name);



            } catch (Exception e) {
                e.printStackTrace();
            }
             return downloadSuccess;

        }

    private static boolean DownLoad(Document doc, String filePath){

        OutputStreamWriter osw =null;
        BufferedWriter writer =null;
        try {
            osw = new OutputStreamWriter(new FileOutputStream(filePath), "utf-8");
            writer = new BufferedWriter(osw);
            writer.write(doc.html());
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return false;
        } catch (FileNotFoundException e) {;
        e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }finally {

            if (writer!=null) {
                try {
                    writer.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (osw!=null) {
                try {
                    osw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }
        return true;
    }


    private static void parseWithHtmlImage(Document doc) {
        Elements imgElements = doc.select("img[src]");
        for (Element element : imgElements) {
            String src = element.attr("abs:src");
            if (src != null && !src.equals("")) {
                if (src.indexOf("http:") == -1 && src.indexOf("https:") == -1) {

                    String original = element.attr("abs:data-original");
                    if (original != null && !original.equals("")) {
                        element.attr("src", original);
                    } else {
                        element.attr("src", src);
                    }

                }

            }
        }
    }


    private static void dealhtmlJSScriptStyle(Document doc) {
        Elements scriptElements = doc.select("script[src]");
        for (Element element : scriptElements) {
            String src = element.attr("abs:src");
            if (src != null && !src.equals("")) {
                if (src.indexOf("http:") == -1 || src.indexOf("https:") == -1) {
                    element.attr("src", src);
                }

            }
        }
    }

    private  static void dealHtmlAlinkStyle(Document doc) {
        Elements aElements = doc.select("a[href]");
        for (Element element : aElements) {
            String href = element.attr("abs:href");
            if (href != null && !href.equals("")) {
                if (href.indexOf("http:") == -1 || href.indexOf("https:") == -1) {
                    element.attr("href", href);

                }
            }

        }
    }

    private static void dealHtmlLinkStyle(Document doc) {
        Elements linkElements = doc.select("link[href]");
        for (Element element : linkElements) {
            String href = element.attr("abs:href");
            if (href.indexOf("http:") == -1 || href.indexOf("https:") == -1) {

                element.attr("href", href);

            }
        }
    }


}

本来是想把这些css样式,以及javascript的脚本都下载下来,但是感觉挺麻烦的,就没下载,就直接引用原新闻的地址,但要注意的是要将原新闻中的相对路径替换成绝对路径。

我们把怕下来的新闻在本地打开看看:
Jsoup解析网页(二)爬虫解析一个完整的网页_第1张图片

你可能感兴趣的:(Jsoup)