SpiderBaixaURL.java
上传用户:yadaxi
上传日期:2013-07-11
资源大小:20k
文件大小:12k
源码类别:

搜索引擎

开发平台:

Java

  1. import java.io.*;
  2. import java.net.*;
  3. //import java.util.*;
  4. import java.util.regex.*;
  5. import java.sql.*;
  6. public class SpiderBaixaURL extends Thread
  7. {
  8. URL url_a_baixar;
  9. Statement stmt = null; 
  10. ResultSet rsVistos = null;
  11. ResultSet rsPerVeure = null; 
  12. ResultSet rs = null;
  13. concurrencia conc;
  14. boolean control;
  15. Connection conn;
  16. int n_links=0; //number of links the current url has to all pages (own, and other)
  17. int n_links_other=0; //number of links the page has to other pages
  18. int id_scanning;
  19. public SpiderBaixaURL(concurrencia conc,Connection conn,Statement stmt)
  20. {
  21. this.conc=conc;
  22. try{
  23. this.conn=conn;
  24. this.stmt=stmt;
  25. primerABaixar();
  26. }
  27. catch(Exception e)
  28. {
  29. e.printStackTrace();
  30. }
  31. }
  32. public void run()
  33. {
  34. try
  35. {
  36. InputStream b;
  37. String r = url_a_baixar.toString();
  38. String nomfitx, nomfitx2;
  39. URL url_a_baixar1 = new URL(r);
  40. URLConnection url_conn;
  41. url_conn = url_a_baixar1.openConnection();
  42. //nomfitx = url_a_baixar.getFile();
  43. //we get the id of the page we are scanning
  44. id_scanning();
  45. sense_zip(url_a_baixar);
  46. freeResultSets();
  47. }
  48. catch(Exception e)
  49. {
  50. e.printStackTrace();
  51. }
  52. }
  53. public void sense_zip(URL b)
  54. {
  55. try
  56. {
  57. String a=new String();
  58. String ascii=new String();
  59. String c=new String();
  60. Character f= new Character('1');
  61. int i;
  62. System.out.println("Downloading Page..."+url_a_baixar.toString());
  63. BufferedReader dis  = new BufferedReader(new InputStreamReader( b.openStream())); 
  64. i=dis.read();
  65. f= new Character((char)i);
  66. c=f.toString();
  67. a+=c;
  68. while(i!=-1)
  69. {
  70. i=dis.read();
  71. f= new Character((char)i);
  72. c=f.toString();
  73. if(i!=-1)
  74. a+=c;
  75. }
  76. /* a=eliminaExpresion("<font[^>]*>",a);
  77. a=eliminaExpresion("</font>",a);
  78. a=eliminaExpresion("<FONT[^>]*>",a);
  79. a=eliminaExpresion("</FONT>",a);
  80. a=eliminaExpresion("<SCRIPT[^>]*>.*</SCRIPT>",a);
  81. a=eliminaExpresion("<script[^>]*>.*</script>",a);
  82. */
  83. HTML2ASCII d = new HTML2ASCII(b.openStream());
  84. do
  85. {
  86. i=d.read();
  87. f= new Character((char)i);
  88. c=f.toString();
  89. if(i!=-1)
  90. ascii+=c;
  91. }while(i!=-1);
  92. ascii=ascii.toLowerCase();
  93. //control de la concurrencia
  94. control=false;
  95. while(!control)
  96. {
  97. System.out.print(".");
  98. if(!conc.isLocked())
  99. {
  100. conc.lock();
  101. afegirHTML(a,url_a_baixar.toString());
  102. coincidencies coin = new coincidencies(url_a_baixar,ascii,a,conn,stmt);
  103. control=true;
  104. conc.unLock();
  105. }
  106. else
  107. {
  108. System.out.print(".");
  109. control=false;
  110. this.sleep(5000);
  111. }
  112. }
  113. System.out.println("Pagina en mem騬ia.");
  114. Pattern p;
  115. Matcher m;
  116. boolean resultado;
  117. //MAIL p = Pattern.compile("([a-z0-9_]|\-|\.)+@(([a-z0-9_]|\-)+\.)+[a-z]{2,4}");
  118. p = Pattern.compile("(www\.*)+(([a-z0-9_]|\-)+\.)+[a-z]{2,4}");
  119. m = p.matcher(a);
  120. resultado=m.find();
  121. i=0;
  122. //marquem com a visitada la url q estem llegint
  123. while(resultado)
  124. {
  125. i++;
  126. String nova_adreca= new String(a.subSequence(m.start(),m.end()).toString());
  127. //comprovem que comen鏸 amb http://
  128. if(!nova_adreca.startsWith("http://"))
  129. {
  130. nova_adreca="http://"+nova_adreca;
  131. }
  132. //afegim cadascuna de les adreces trobades
  133. afegirNovaURL(nova_adreca);
  134. // System.out.println(i+". "+nova_adreca);
  135. resultado=m.find();
  136. //el poses a vistos i l'elimines
  137. }
  138. linkCounter();
  139. }
  140. catch(IOException e)
  141. {
  142. posarAVistos(url_a_baixar.toString());
  143. System.out.println("La URL "+url_a_baixar.toString()+" no existeix.");
  144. }
  145. catch(Exception e)
  146. {
  147. e.printStackTrace();
  148. }
  149. finally
  150. // it is a good idea to release
  151. // resources in a finally{} block 
  152. // in reverse-order of their creation 
  153. // if they are no-longer needed 
  154. if (rs != null) 
  155. try 
  156. {
  157. rs.close(); 
  158. }
  159. catch (SQLException sqlEx) 
  160. { // ignore 
  161. rs = null; 
  162. }
  163. }
  164. }
  165. //This method will delete all tags that contains format and javascript. Like <font...> and <script>...
  166. public String eliminaExpresion(String pattern,String text)
  167. {
  168. Pattern p;
  169. Matcher m;
  170. boolean resultado=true;
  171. String paraula="";
  172. try
  173. {
  174. text=text.replaceAll(pattern,"");//we delete the tag
  175. }
  176. catch(Exception e)
  177. {
  178. System.out.println("ERROR: Replacing Pattern!");
  179. e.printStackTrace();
  180. }
  181. return text;
  182. }
  183. public void posarAVistos(String novaAdreca)
  184. {
  185. try
  186. {
  187. if(stmt.execute("SELECT * FROM vistes WHERE url='"+novaAdreca+"'"))
  188. {
  189. try
  190. {
  191. int id_pagina;
  192. //si existeix ens quedem amb el seu id
  193. rsPerVeure = stmt.getResultSet();
  194. rsPerVeure.first(); 
  195. id_pagina=rsPerVeure.getInt("id");
  196. }
  197. catch(SQLException ex)
  198. {
  199. stmt.execute("insert into vistes (url) values ('"+novaAdreca+"')");
  200. }
  201. }
  202. }
  203. catch(SQLException ex) 
  204. {
  205.    // handle any errors 
  206.    System.out.println("SQLException: " + ex.getMessage()); 
  207.    System.out.println("SQLState: " + ex.getSQLState()); 
  208.    System.out.println("VendorError: " + ex.getErrorCode()); 
  209. }
  210. // l'elimines de la taula de per veure
  211. eliminaPerVeure();
  212. }
  213. public void eliminaPerVeure()
  214. {
  215. try{
  216. // eliminem la url que acabem de fer
  217.  stmt.execute("DELETE FROM perVeure where url ='"+url_a_baixar.toString()+"' ");   
  218.   }
  219.   catch(SQLException ex) 
  220.   {
  221.  // handle any errors 
  222.  System.out.println("SQLException: " + ex.getMessage()); 
  223.  System.out.println("SQLState: " + ex.getSQLState()); 
  224.  System.out.println("VendorError: " + ex.getErrorCode()); 
  225.  ex.printStackTrace();
  226.   }
  227.   //fi
  228. }
  229. public void id_scanning()
  230. {
  231. try
  232. {
  233. rs = stmt.executeQuery("SELECT id FROM vistes WHERE url='"+url_a_baixar.toString()+"'");
  234. rs.first(); 
  235. id_scanning=rs.getInt("id");//we have the id
  236. }
  237. catch(SQLException ex) 
  238. {
  239.    // handle any errors 
  240.    System.out.println("SQLException: " + ex.getMessage()); 
  241.    System.out.println("SQLState: " + ex.getSQLState()); 
  242.    System.out.println("VendorError: " + ex.getErrorCode()); 
  243.    ex.printStackTrace();
  244. }
  245. }
  246. //this method will count the number of links on the web we are scanning
  247. public void linkCounter()
  248. {
  249.   try
  250.       {
  251. //Afegim la nova URL
  252.    int propis=n_links-n_links_other;
  253.   
  254. ResultSet rs = stmt.executeQuery("SELECT * FROM vistes WHERE id ='"+id_scanning+"' ");
  255. //rs.first();
  256. rs.absolute(1); // moves the cursor to the first row of rs
  257. rs.updateInt("n_links_propis",propis);
  258. rs.updateRow(); 
  259.   
  260.   
  261. //stmt.execute("insert into vistes (n_links_propis) values ('"+propis+"')");
  262.   }
  263.   catch(SQLException ex) 
  264.   {
  265.  // handle any errors 
  266.  System.out.println("SQLException: " + ex.getMessage()); 
  267.  System.out.println("SQLState: " + ex.getSQLState()); 
  268.  System.out.println("VendorError: " + ex.getErrorCode()); 
  269.  ex.printStackTrace();
  270.  
  271.   }
  272. }
  273. public void linkA(String newLink)
  274. {
  275. try
  276. {
  277. int id_scanned,n_times=1;
  278. //have we allready visited the page?
  279. rsPerVeure = stmt.executeQuery("SELECT id FROM vistes WHERE url='"+newLink+"'");
  280. if(countItems(rsPerVeure)>0)
  281. {
  282. rsPerVeure.first(); 
  283. id_scanned=rsPerVeure.getInt("id");
  284. if(id_scanned!=id_scanning)
  285. {
  286. //how many times have we linked to this page
  287. rsPerVeure = stmt.executeQuery("SELECT COUNT(*) FROM links WHERE pagina_els_rep='"+id_scanned+"' AND pagina_envia='"+id_scanning+"'");
  288. if(countItems(rsPerVeure)>0)
  289. {
  290. rsPerVeure.first(); 
  291. n_times=rsPerVeure.getInt(1);
  292. n_times++;
  293. }
  294. else
  295. {
  296. n_times=1;
  297. }
  298. stmt.execute("insert into links (pagina_els_rep,pagina_envia,num) values ('"+id_scanned+"','"+id_scanning+"','"+n_times+"')");
  299. }
  300. }
  301. else // we havn't visited yet the web page that we link at, so we can't take the id
  302. { // TODO in a future!
  303. System.out.println("Link a: "+newLink+" no ha estat possible");
  304. }
  305. }
  306. catch(SQLException ex) 
  307. {
  308.    // handle any errors 
  309.    System.out.println("SQLException: " + ex.getMessage()); 
  310.    System.out.println("SQLState: " + ex.getSQLState()); 
  311.    System.out.println("VendorError: " + ex.getErrorCode()); 
  312.    ex.printStackTrace();
  313. }
  314. }
  315. public void afegirNovaURL(String novaAdreca)
  316. {
  317. linkA(novaAdreca);
  318. n_links++;
  319. if((!hiEs(novaAdreca,new String("perVeure")))&&(!hiEs(novaAdreca,new String("vistes"))))
  320. n_links_other++;
  321. System.out.println("AFEGIDA "+novaAdreca);
  322. try{
  323. //Afegim la nova URL
  324. stmt.execute("insert into perVeure (url) values ('"+novaAdreca+"')");
  325.   }
  326.   catch(SQLException ex) 
  327.   {
  328.  // handle any errors 
  329.  System.out.println("SQLException: " + ex.getMessage()); 
  330.  System.out.println("SQLState: " + ex.getSQLState()); 
  331.  System.out.println("VendorError: " + ex.getErrorCode()); 
  332.   }
  333.   //fi
  334. }
  335. }
  336. public void primerABaixar()
  337. {
  338. try{
  339. // baixem les dades del servidor MYSQL
  340. if (stmt.execute("SELECT * FROM perVeure ORDER BY id DESC"))
  341. {
  342.   rsPerVeure = stmt.getResultSet();
  343.   rsPerVeure.last(); 
  344.   url_a_baixar=new URL(rsPerVeure.getString(2));
  345.   System.out.println("A Baixar!: "+url_a_baixar.toString());
  346. //  rsPerVeure.close();
  347.   posarAVistos(url_a_baixar.toString());
  348. }
  349.   }
  350.   catch(SQLException ex) 
  351.   {
  352.  // handle any errors 
  353.  System.out.println("SQLException: " + ex.getMessage()); 
  354.  System.out.println("SQLState: " + ex.getSQLState()); 
  355.  System.out.println("VendorError: " + ex.getErrorCode()); 
  356.   }
  357.   catch(Exception ex )
  358.   {
  359. ex.printStackTrace();
  360.   }
  361.   //fi
  362. }
  363. public boolean hiEs(String url,String taula)
  364. {
  365. int i=0;
  366. try
  367. {
  368. ResultSet rs = stmt.executeQuery("SELECT * FROM "+taula+" WHERE url='"+url+"'");
  369.  while (rs.next()) 
  370.  {
  371. //System.out.println(i);
  372.  i++;
  373.  }
  374. // rs.close();
  375. }
  376. catch(SQLException ex) 
  377. {
  378.    // handle any errors 
  379.    System.out.println("SQLException: " + ex.getMessage()); 
  380.    System.out.println("SQLState: " + ex.getSQLState()); 
  381.    System.out.println("VendorError: " + ex.getErrorCode()); 
  382. }
  383. if(i>0)
  384. return true;
  385. else
  386. return false;
  387. }
  388. public void afegirHTML(String a,String url)
  389. {
  390. try
  391. {
  392. ResultSet rs = stmt.executeQuery("SELECT * FROM vistes WHERE url ='"+url+"' ");
  393. //rs.first();
  394. rs.absolute(1); // moves the cursor to the first row of rs
  395. rs.updateString(3,a);
  396. rs.updateRow(); // updates the row in the data source
  397. //rs.close();
  398.  
  399. }
  400. catch(SQLException ex) 
  401. {
  402.    // handle any errors 
  403.    System.out.println("SQLException: " + ex.getMessage()); 
  404.    System.out.println("SQLState: " + ex.getSQLState()); 
  405.    System.out.println("VendorError: " + ex.getErrorCode()); 
  406. }
  407. }
  408. public void freeResultSets()
  409. {
  410. if (rs != null) 
  411. try 
  412. {
  413. rs.close(); 
  414. }
  415. catch (SQLException sqlEx) 
  416. { // ignore 
  417. rs = null; 
  418. }
  419. if (rsPerVeure != null) 
  420. try 
  421. {
  422. rsPerVeure.close(); 
  423. }
  424. catch (SQLException sqlEx) 
  425. { // ignore 
  426. rs = null; 
  427. }
  428. if (rsVistos != null) 
  429. try 
  430. {
  431. rsVistos.close(); 
  432. }
  433. catch (SQLException sqlEx) 
  434. { // ignore 
  435. rs = null; 
  436. }
  437. }
  438. //count the number of items are in this query
  439. public int countItems(ResultSet rs)
  440. {
  441. int i=0;
  442. try{
  443. while(rs.next())
  444. i++;
  445. }
  446. catch(Exception e)
  447. {
  448. System.out.println("ERROR: while counting items");
  449. e.printStackTrace();
  450. }
  451. return i;
  452. }
  453. }