为什么crawler4j随机挂?

时间:2014-07-17 15:24:14

标签: java crawler4j

我已经使用了crawler4j几个月了。我最近开始注意到它挂在一些网站上永远不会返回。建议的解决方案是将resumable设置为true。这不是我的选择,因为我的空间有限。我跑了多次测试,发现挂起很随机。它将在90-140个网址之间爬行,然后停止。我想也许是网站,但网站robot.txt没有任何可疑之处,所有页面都响应200 OK。我知道抓取工具没有抓取整个网站,否则会关闭。可能导致这种情况的原因以及我应该从哪里开始?

有趣的是,我使用nonBlocking启动抓取工具,之后是一个while循环检查状态

controller.startNonBlocking(CrawlProcess.class, numberOfCrawlers);

while(true){
  System.out.println("While looping");
}

当爬虫挂起时,while循环也会停止响应,但线程仍处于活动状态。这意味着整个线程没有响应。因此,我无法发送关机命令。

更新 我弄清楚导致它挂起的原因。我在访问方法的mysql步骤中运行了一个商店。步骤如下:

public void insertToTable(String dbTable, String url2, String cleanFileName, String dmn, String AID, 
        String TID, String LID, String att, String ttl, String type, String lbl, String QL,
        String referrer, String DID, String fp_type, String ipAddress, String aT, String sNmbr) throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException{
    try{
        String strdmn = "";
        if(dmn.contains("www")){
            strdmn = dmn.replace("http://www.","");
        }else{
            strdmn = dmn.replace("http://","");
        }
        String query = "INSERT INTO "+dbTable
                +" (url,filename, dmn, AID, TID, LID, att, ttl, type, lbl, tracklist, referrer, DID, searchtype, description, fp_type, ipaddress," +
                " aT, sNmbr, URL_Hash, iteration)VALUES('"
                +url2+"','"+cleanFileName+"','"+strdmn+"','"+AID+"','"+TID+"','"+LID+"','"+att+"','"+ttl+"','"+type+"'" +
                ",'"+lbl+"','"+QL+"','"+dmn+"','"+DID+"','spider','"+cleanFileName+"','"+fp_type+"'," +
                "'"+ipAddress+"','"+aT+"','"+sNmbr+"',MD5('"+url2+"'), 1) ON DUPLICATE KEY UPDATE iteration = iteration + 1";
        Statement st2 = null;
        con = DbConfig.openCons();
        st2 = con.createStatement();
        st2.executeUpdate(query);
        //st2.execute("SELECT NOW()");
        st2.close();
        con.close();
        if(con.isClosed()){
            System.out.println("CON is CLOSED");
        }else{
            System.out.println("CON is OPEN");
        }
        if(st.isClosed()){
            System.out.println("ST is CLOSED");
        }else{
            System.out.println("ST is OPEN");
        }
    }catch(NullPointerException npe){
        System.out.println("NPE: " + npe);
    }
}

当我运行st2.execute(" SELECT NOW()")时,非常有趣的是什么。而不是当前的st2.execute(查询);它工作正常,无需挂起就可以抓取网站。但由于某种原因,st2.execute(查询)导致它在几次查询后挂起。它不是mysql,因为它不会输出任何异常。我想也许我得到了太多的联系"来自mysql,但事实并非如此。我的过程对任何人都有意义吗?

1 个答案:

答案 0 :(得分:2)

最终阻止的重要性。

crawler4j正在使用c3p0池来插入mysql。经过几次查询后,爬虫将停止响应。由于@ djechlin的建议,它原来是c3p0中的连接泄漏。我在下面添加了一个finally块,现在效果很好!

try{
   //the insert method is here
}catch(SQLException e){
  e.printStackTrace();
}finally{
  if(st != null){
    st.close();
  }
  if(rs != null){
   rs.close();
  }

}