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:
- 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.
- Usar las URL que se recuperaron del paso 1 y analizar esas URL
- 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.
Enlaces:
Descarga del código fuente de Java Crawler
Rastreador de Java en GitHub