¿Cómo implementar un rastreador web Java?
Los rastreadores tradicionales parten de la URL de una o varias páginas web iniciales y obtienen la URL de la página web inicial. En el proceso de rastreo de páginas web, extrae continuamente nuevas URL de la página actual y las coloca en la cola hasta que se cumplan ciertas condiciones de detención del sistema. Para la búsqueda vertical, es más adecuado centrarse en rastreadores, es decir, rastreadores que rastrean páginas web sobre temas específicos.
El siguiente es el código central de un rastreador simple implementado en Java:
Public void rastreo() throws Throwable {
mientras (continueCrawling()) {
URL del rastreador URL = get nexturl(); //Obtiene la siguiente URL de la cola que se va a rastrear.
If (URL! = null) {
printCrawlInfo();
string content = get content(URL); URL
//Los rastreadores enfocados solo rastrean páginas web relacionadas con el contenido del tema. Aquí, la coincidencia de reglas se utiliza para un procesamiento simple.
if(iscontentrelevent(content, this.regexpSearchPattern)) {
saveContent(url, content); //Guarda la página web localmente.
//Obtenga los enlaces en el contenido de la página web y colóquelos en la cola para su rastreo.
Establecer urlStrings = extractUrls(content, URL);
addUrlsToUrlQueue(url, URL strings
} De lo contrario {
System); .out.println(url + "Ignorar irrelevante...");
}
//Retraso para evitar ser bloqueado por la otra parte
hilo . dormir (este . retraso entre URL);
}
}
closeOutputStream();
}
. privado CrawlerUrl getNextUrl() lanza Throwable {
CrawlerUrl nextUrl = null
while((nextUrl == null)&&(!urlQueue.isEmpty())) {
p>
URL del rastreador URL del rastreador = this . URL queue remove();
//doWeHavePermissionToVisit: independientemente de si tiene permiso para acceder a la URL, lo seguirá un rastreador amigable. el "Robot.txt" para rastrear las reglas configuradas en "Robot.txt".
//IsurlReadyVisited: ¿Se ha visitado la URL? Los grandes motores de búsqueda suelen utilizar BloomFilter para replicar esto. Aquí, simplemente use HashMap.
///isprofundidadaceptable: si se ha alcanzado el límite de profundidad especificado. Los reptiles suelen adoptar un enfoque que prioriza la amplitud. Algunos sitios web crearán trampas de rastreadores (generarán automáticamente algunos enlaces no válidos para atrapar a los rastreadores en un bucle infinito) y adoptarán restricciones de profundidad para evitarlas.
if(doWeHavePermissionToVisit(URL del rastreador)
& amp& amp(!isurlareadyvisited(URL del rastreador))
& amp& ampis profundidad aceptable (URL del rastreador)){
nextUrl = crawlerUrl
// System.out.println("La siguiente URL a la que se accederá es "Siguiente URL
}
}
Devolver nextUrl
}
La cadena privada getContent(CrawlerUrl) activa la llamada de Throwable {
//HttpClient4.1 El camino es diferente al anterior.
cliente http cliente = nuevo cliente http predeterminado();
http get http get = nuevo http get(URL . geturlstring());
búfer de cadena strBuf = nuevo buffer de cadena();
respuesta HTTPResponse = cliente ejecutar(http get);
if (HttpStatus.SC_OK == respuesta.getStatusLine().getStatusCode()) {
HttpEntity entidad = respuesta. get entidad();
if (entidad! = null) {
Lector BufferedReader = nuevo BufferedReader(
new InputStreamReader(entidad. get content(), "UTF-8"));
línea de cadena = null
if(entidad. get contentlength()> 0 ) {
strBuf = nueva cadena buffer((int)entidad . get contentlength());
mientras ((line = lector.readLine())!= null) {
strBuf.append(line);
}
}
}
if (entidad!= nulo ) {
nsumeContent();
}
}
//Marcar la URL como visitada.
markUrlAsVisited(URL);
Devuelve strbuf . tostring();
}
El booleano estático público es relevante para el contenido (cadena Contenido). ,
Patrón regexpPattern) {
Valor de retorno booleano = false
if (contenido! = nulo) {
// Hace ¿Cumple las condiciones de la expresión regular?
matcher m = regexppattern . matcher(content . tolowercase());
retValue = m . >Devolver retValue
}
Lista pública ExtractUrl(String text, CrawlerUrl crawlerUrl) {
map URL map = new HashMap();
extracthttpurls(mapa de URL, texto);
extractreativeurls(mapa de URL, texto, URL del rastreador);
Devuelve nueva ArrayList(mapa de URL. keyset()); >
}
Extracto vacío privadoHttpUrls(mapa urlMap, texto de cadena) {
matcher m = (texto
while ( m.find(); )) {
cadena URL = m . grupo();
cadena[]terms = URL . for(string term:term){
//system out . println(" Term = "+Term);
if (term.startsWith(" http")) {
int index = término . índice de(" \ ");
if(index & gt; 0) {
term = term.substring(0 , índice);
}
urlMap.put(término, término);
System.out.println("Hipervínculo: "+término);
}
}
}
}
extracto vacío privadoRelativeUrls(mapeo urlMap, texto de cadena, p>
Rastreador(reptil){
matcher m = expresión regular relativa .
URL textURL = URL del rastreador geturl();
cadena host = texturl . gethost();
mientras (m.find()) {
cadena URL = m grupo( );
string[]terms = URL . split(" a href = \ ");
for(string term:term){
if (term . comienza con("/") {
int index = término . índice de(" \ ");
if(index & gt; 0) {
term = term.substring( 0, índice);
}
Cadena s = //+host+term;
urlMap.put(s, s);
System.out.println("URL relativa:"+s);
}
}
}
}
Public static void main(String[] args) {
prueba {
String url =
cola URL cola = nuevo vinculado list();
String regexp = " java
urlQueue.add(new CrawlerUrl(url, 0));
String regexp = " java p>
urlQueue.add(new CrawlerUrl(url, 0));
p>rastreador ingenuo = nuevo rastreador ingenuo(cola de URL, 100, 5, 1000L,
regexp);
//booleano permitir rastreo = rastreador. areweallowedtovisit(URL);
// System.out.println("Permitir rastreo: "+ url + " " +
//permitir rastreo);
crawler .crawl();
} catch (Throwable t) {
sistema. . println(t . tostring());
t .printstacktrace ();
}
}
.