Categorías
Java Projects

¿Cómo escribir un rastreador usando Java?

En realidad, escribir un programa rastreador de Java no es muy difícil utilizando las API existentes, pero escribir su propio rastreador probablemente le permitirá realizar todas las funciones que desee. Debería ser muy interesante obtener información específica de Internet. Proporcionar el código no es fácil, pero busqué y encontré el algoritmo básico para un rastreador.

Estarás reinventando la rueda, sin duda. Pero aquí está lo básico:

1. Una lista de URL no visitadas: inserte esto con una o más páginas de inicio.
2. Una lista de URL visitadas, para que no dé vueltas en círculos.
3. Un conjunto de reglas para las URL que no le interesan, por lo que no indexa toda Internet.
4. Es necesario poner estos almacenados en una base de datos, ya que el rastreador puede detenerse y necesitar reiniciar con el mismo lugar sin perder el estado.

El algoritmo es el siguiente.

while(list of unvisited URLs is not empty) {
      take URL from list
      fetch content
      record whatever it is you want to about the content
      if content is HTML {
          parse out URLs from links
          foreach URL {
                 if it matches your rules
                 and it's not already in either the visited or unvisited list
                 add it to the unvisited list
          }
     }
}

Discutamos si decides hacer uno. Ahora el problema aquí es la lista de URL.

¿Dónde encontrar la lista de sitios web? Supongo que solo necesita encontrarlo en algunos directorios existentes o en algún lugar, o incluso manualmente.

Jsoup es un analizador de HTML que podría hacer que la parte de análisis sea muy fácil e interesante de hacer.

Actualización: he hecho un sencillo tutorial sobre rastreadores.

El siguiente código todavía tiene problemas.

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
 
 
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
public class FileCrawler {
 
	public static void main(String[] args) throws IOException {
 
		File dir = new File(".");
		String loc = dir.getCanonicalPath() + File.separator + "record.txt";
		FileWriter fstream = new FileWriter(loc, true);
		BufferedWriter out = new BufferedWriter(fstream);
		out.newLine();
		out.close();
 
		processPage("http://cis.udel.edu");
 
		File file = new File(loc);
 
		if (file.delete()) {
 
		}
	}
 
	// givn a String, and a File
	// return if the String is contained in the File
	public static boolean checkExist(String s, File fin) throws IOException {
 
		FileInputStream fis = new FileInputStream(fin);
		// //Construct the BufferedReader object
		BufferedReader in = new BufferedReader(new InputStreamReader(fis));
 
		String aLine = null;
		while ((aLine = in.readLine()) != null) {
			// //Process each line
			if (aLine.trim().contains(s)) {
				//System.out.println("contains " + s);
				in.close();
				fis.close();
				return true;
			}
		}
 
		// do not forget to close the buffer reader
		in.close();
		fis.close();
 
		return false;
	}
 
	public static void processPage(String URL) throws IOException {
 
		File dir = new File(".");
		String loc = dir.getCanonicalPath() + File.separator + "record.txt";
 
		// invalid link
		if (URL.contains(".pdf") || URL.contains("@") 
				|| URL.contains("adfad") || URL.contains(":80")
				|| URL.contains("fdafd") || URL.contains(".jpg")
				|| URL.contains(".pdf") || URL.contains(".jpg"))
			return;
 
		// process the url first
		if (URL.contains("cis.udel.edu") && !URL.endsWith("/")) {
 
		} else if(URL.contains("cis.udel.edu") && URL.endsWith("/")){
			URL = URL.substring(0, URL.length()-1);
		}else{
			// url of other site -> do nothing
			return;
		}
 
		File file = new File(loc);
 
		// check existance
		boolean e = checkExist(URL, file);
		if (!e) {
			System.out.println("------ :  " + URL);
			// insert to file
			FileWriter fstream = new FileWriter(loc, true);
			BufferedWriter out = new BufferedWriter(fstream);
			out.write(URL);
			out.newLine();
			out.close();
 
			Document doc = null;
			try {
				doc = Jsoup.connect(URL).get();
			} catch (IOException e1) {
				e1.printStackTrace();
				return;
			}
 
			if (doc.text().contains("PhD")) {
				//System.out.println(URL);
			}
 
			Elements questions = doc.select("a[href]");
			for (Element link : questions) {
				processPage(link.attr("abs:href"));
			}
		} else {
			// do nothing
			return;
		}
 
	}
}

Categorías
Java Projects

¿Cómo hacer un rastreador web usando Java?

Hay mucha información útil en Internet. ¿Cómo podemos obtener esa información automáticamente? – Sí, Web Crawler.

Esta publicación muestra cómo hacer un prototipo de rastreador web simple usando Java. Hacer un rastreador web no es tan difícil como parece. Simplemente siga la guía y llegará rápidamente en 1 hora o menos, y luego disfrute de la gran cantidad de información que puede obtener para usted. Como este es solo un prototipo, necesita dedicar más tiempo a personalizarlo según sus necesidades.

Los siguientes son requisitos previos para este tutorial:

  • Programación básica de Java
  • Un poco sobre SQL y MySQL Database.

Si no desea utilizar una base de datos, puede utilizar un archivo para realizar un seguimiento del historial de rastreo.

1. El objetivo

En este tutorial, el objetivo es el siguiente:

Dada la URL raíz de una escuela, por ejemplo, «mit.edu», devuelve todas las páginas que contienen una cadena «investigación» de esta escuela.

Un rastreador típico funciona en los siguientes pasos:

  1. Analice la página web raíz («mit.edu») y obtenga todos los enlaces de esta página. Para acceder a cada URL y analizar la página HTML, usaré JSoup que es un conveniente analizador de páginas web escrito en Java.
  2. Usar las URL que se recuperaron del paso 1 y analizar esas URL
  3. Al realizar los pasos anteriores, debemos rastrear qué página se ha procesado antes, de modo que cada página web solo se procese una vez. Ésta es la razón por la que necesitamos una base de datos.

2. Configurar la base de datos MySQL

Si está utilizando Ubuntu, puede seguir esta guía para instalar Apache, MySQL, PHP y phpMyAdmin.

Si está usando Windows, simplemente puede usar WampServer. Puede descargarlo de wampserver.com e instalarlo en un minuto y listo para el siguiente paso.

Usaré phpMyAdmin para manipular la base de datos MySQL. Es simplemente una interfaz GUI para usar MySQL. Está totalmente bien si tiene otras herramientas o no usa herramientas de GUI.

3. Crea una base de datos y una tabla.

Cree una base de datos llamada «Rastreador» y cree una tabla llamada «Registro» como la siguiente:

CREATE TABLE IF NOT EXISTS `Record` (
  `RecordID` INT(11) NOT NULL AUTO_INCREMENT,
  `URL` text NOT NULL,
  PRIMARY KEY (`RecordID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

4. Empiece a rastrear con Java

1). Descargue la biblioteca principal de JSoup desde http://jsoup.org/download.
Descargue mysql-connector-java-xxxbin.jar desde http://dev.mysql.com/downloads/connector/j/

2). Ahora cree un proyecto en su eclipse con el nombre «Crawler» y agregue los archivos jar JSoup y mysql-connector que descargó en Java Build Path. (haga clic con el botón derecho en el proyecto -> seleccione «Ruta de compilación» -> «Configurar ruta de compilación» -> haga clic en la pestaña «Bibliotecas» -> haga clic en «Agregar archivos JAR externos»)

3). Cree una clase llamada «DB» que se utiliza para manejar las acciones de la base de datos.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class DB {
 
	public Connection conn = null;
 
	public DB() {
		try {
			Class.forName("com.mysql.jdbc.Driver");
			String url = "jdbc:mysql://localhost:3306/Crawler";
			conn = DriverManager.getConnection(url, "root", "admin213");
			System.out.println("conn built");
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
 
	public ResultSet runSql(String sql) throws SQLException {
		Statement sta = conn.createStatement();
		return sta.executeQuery(sql);
	}
 
	public boolean runSql2(String sql) throws SQLException {
		Statement sta = conn.createStatement();
		return sta.execute(sql);
	}
 
	@Override
	protected void finalize() throws Throwable {
		if (conn != null || !conn.isClosed()) {
			conn.close();
		}
	}
}

4). Cree una clase con el nombre «Main» que será nuestro rastreador.

import java.io.IOException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
 
 
public class Main {
	public static DB db = new DB();
 
	public static void main(String[] args) throws SQLException, IOException {
		db.runSql2("TRUNCATE Record;");
		processPage("http://www.mit.edu");
	}
 
	public static void processPage(String URL) throws SQLException, IOException{
		//check if the given URL is already in database
		String sql = "select * from Record where URL = '"+URL+"'";
		ResultSet rs = db.runSql(sql);
		if(rs.next()){
 
		}else{
			//store the URL to database to avoid parsing again
			sql = "INSERT INTO  `Crawler`.`Record` " + "(`URL`) VALUES " + "(?);";
			PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
			stmt.setString(1, URL);
			stmt.execute();
 
			//get useful information
			Document doc = Jsoup.connect("http://www.mit.edu/").get();
 
			if(doc.text().contains("research")){
				System.out.println(URL);
			}
 
			//get all links and recursively call the processPage method
			Elements questions = doc.select("a[href]");
			for(Element link: questions){
				if(link.attr("href").contains("mit.edu"))
					processPage(link.attr("abs:href"));
			}
		}
	}
}

Ahora tiene su propio rastreador web. Por supuesto, deberá filtrar algunos enlaces que no desea rastrear.

El resultado es el siguiente cuando ejecuté el código el 26 de mayo de 2014.

web-crawler-java-result

Enlaces:
Descarga del código fuente de Java Crawler
Rastreador de Java en GitHub