【问题标题】:Crawler in jsoup (need optimization )jsoup 中的爬虫(需要优化)
【发布时间】:2014-02-28 22:02:44
【问题描述】:

我在 jSoup 的帮助下用 Java 制作了一个爬虫,我需要优化或建议以使我的爬虫更好且无错误。请帮助我理解最后一个 for(Element link: questions) 中的 for each 循环这个循环实际上做了什么它获取同一页面的所有链接然后抓取或只是找到第一个链接并抓取到该链接。

提前致谢

  public class crawler_html {
  public static db_Connection db = new db_Connection();
  public crawler_html(String url) throws SQLException, IOException
 {      //db.runSql2("TRUNCATE Record;");
    processPage(url);
 }
public static void processPage(String url) throws SQLException, IOException{
    //check if the given URL is already in database
    String sql = "select * from crawler where URL ='"+url+"'";
    ResultSet rs = db.runSql(sql);
            if(rs.next()){
                System.out.println("URL Found");
                //If url found what to do next

    }else{
              System.out.println("Store the URL to database");
        //store the URL to database to avoid parsing again
        sql = "INSERT INTO crawler (URL) VALUES ('"+url+"')";
        PreparedStatement stmt = db.conn.prepareStatement(sql);

                     if(stmt!=null){
                         stmt.execute();
                         System.out.println("Executed well");

             }
        //get useful information
                     // timeout(0) sets the time to infinite
        Document doc = Jsoup.connect(url)
                            .userAgent("Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.110 Safari/537.36")
                            .timeout(0)
                            .ignoreHttpErrors(true)
                            .followRedirects(true)
                            .execute()
                            .parse();

        //get all links and recursively call the processPage method
        Elements questions = doc.select("a[href]");
                       for(Element link: questions){
                        {
                                    db.stmtclose();
                processPage(link.attr("abs:href"));
                           }
        }
                    }
        }
    }
}

}

【问题讨论】:

    标签: java html jsoup web-crawler


    【解决方案1】:

    首先,我认为不需要递归调用。它只会让你的代码更复杂。

    您可以有两种方法,一种方法是检查 URL 是否存在于数据库中,并基于该方法插入或继续。

    另一种从页面获取数据的方法。

    所以我会这样写:

    public class htmlCrawler{
    
        public static db_Connection db = new db_Connection();
    
        public htmlCrawler(String url){
    
        getLinksFromPage(url);
    }
    
    public boolean checkInDb(String url){
    //your data base logic here
    }
    
    public boolean getLinksFromPage(String url){
    
    //your jsoup thing
    
    //the loop
    
    Elements questions = doc.select("a[href]").getAll();
    for(Element link: questions){
                        {
                          String link = link.attr("abs:href");
                          checkInDb(link);
                           }
        }
    
    }
    

    如果您需要更多帮助,请告诉我。

    【讨论】:

    • 嘿,感谢 Nischal 的帮助,它非常有用,请告诉我一些我必须添加到这个爬虫中以使其更好的东西。请帮助我处理可能发生的异常
    • 当你第一次写东西时,使用 IDE 例如 ECLIPSE ,它将帮助你处理异常。避免递归,除非你确定你需要它。如果您认为我之前的回答对您有帮助,请标记为回答。
    猜你喜欢
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-16
    相关资源
    最近更新 更多