Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jsoup中的爬虫程序(需要优化)_Java_Html_Jsoup_Web Crawler - Fatal编程技术网

Java jsoup中的爬虫程序(需要优化)

Java jsoup中的爬虫程序(需要优化),java,html,jsoup,web-crawler,Java,Html,Jsoup,Web Crawler,我在jSoup的帮助下用Java制作了一个爬虫程序,我需要优化或建议来使我的爬虫程序更好、无错误。请帮助我理解最后for中的for each循环(元素链接:问题)这个循环实际上做什么?它获取同一页面的所有链接,然后爬网,或者只是找到第一个链接,然后爬网到该链接 提前谢谢 public class crawler_html { public static db_Connection db = new db_Connection(); public crawler_html(String

我在jSoup的帮助下用Java制作了一个爬虫程序,我需要优化或建议来使我的爬虫程序更好、无错误。请帮助我理解最后for中的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"));
                           }
        }
                    }
        }
    }
}

}

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

您可以有两种方法,一种方法用于检查数据库中是否存在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,它将帮助你处理异常。除非确定需要,否则避免递归。如果你认为我之前的回答对你有帮助,请将其标记为答案。