|
|
Publicado em 30/11/2014 16:56:56
|
|
|
|

[mw_shl_code=java,true]/** * @author Jack.Wang
* */ importar java.io.BufferedReader; importar java.io.InputStreamReader; importar java.net.URL; importar java.util.ArrayList; importar java.util.HashMap; importar java.util.HashSet; importar java.util.LinkedHashSet; import java.util.regex.Matcher; importar java.util.regex.Pattern;
Procure por rastreadores web classe pública SearchCrawler implementa Runnable {
/* * o robô cache disallowListCache não permite URLs pesquisadas. O protocolo Robot define um arquivo robots.txt na diretório raiz do site, * Especifica quais páginas do site são pesquisáveis para busca restrita. * O programa de busca deve pular essas áreas durante a busca, aqui está um exemplo de robots.txt: * # robots.txt para http://somehost.com/ User-agent: * Proibir: /cgi-bin/ * Proibir: /registro # Proibir robôs na página de registro * Disallow: /login */
private HashMap<String, ArrayList<String>> disallowListCache = new HashMap<String, ArrayList<String>>(); <String> ArrayList erroLista = novo ArrayList<String>(); Mensagem de erro <String> Resultado de ArrayList = novo <String>ArrayList(); Resultados pesquisados String startUrl; Um ponto de partida para iniciar sua busca int maxUrl; O número máximo de URLs processadas String searchString; Strings para buscar booleano Sensível ao caso = falso; Se deve ou não ser sensível a maiúsculas minúsculas boolean limitHost = false; Se deve pesquisar dentro de um hospedeiro restrito
Public SearchCrawler(String startUrl, int maxUrl, String searchString) { this.startUrl = startUrl; this.maxUrl = maxUrl; this.searchString = searchString;
}
public ArrayList<String> getResult() { resultado do retorno;
}
public void run() { // Iniciar o tópico de busca crawl(startUrl, maxUrl, searchString, limitHost, majúsculaSensitiva);
}
Detectar formatação de URL private URL verifyUrl(String url) { Apenas URLs HTTP são processadas. if (!url.url.toLowerCase().startsWith("http://")) return null; URL verificadaUrl = null; try { verifiedUrl = nova URL(url); } captura (Exceção e) { return null; } return verifiedUrl;
}
Detecta se o robô permite acesso à URL fornecida. private boolean isRobotAllowed(URL urlToCheck) { String host = urlToCheck.getHost().toLowerCase(); Pegue o host que dá o RUL System.out.println("host="+host);
Obtenha um cache de URLs que seu host não permite pesquisar ArrayList<String> disallowList = disallowListCache.get(host);
Se você ainda não tem cache, baixe e coloque em cache. if (disallowList == null) { disallowList = nova ArrayList<String>(); try { URL robotsFileUrl = nova URL("http://" + host + "/robots.txt"); Leitor BufferedReader = novo BufferedReader( novo InputStreamReader(robotsFileUrl.openStream()));
Leia o arquivo robô para criar uma lista de caminhos que não podem ser acessados. Linha de cordas; enquanto ((linha = leitor.readLine()) != nulo) { if (line.indexOf("Disallow:") == 0) {// Contém "Disallow:" String disallowPath = linha.substring("Disallow:" .length()); Obtenha o caminho para acesso proibido
Verifique as anotações. int commentIndex = disallowPath.indexOf("#"); if (commentIndex != -1) { disallowPath = disallowPath.substring(0, comentáriosÍndice); Remova o comentário }
disallowPath = disallowPath.trim(); disallowList.add(disallowPath); } }
Caminhos de cache que esse host não tem permissão para acessar. disallowListCache.put (host, disallowList); } captura (Exceção e) { retorno verdadeiro; Não há arquivos robots.txt no diretório raiz do site, e ele retorna true } }
String file = urlToCheck.getFile(); System.out.println("File getFile()="+file); para (int i = 0; i < disallist.size(); i++) { String disallow = disallowList.get(i); if (file.startsWith(disallow)) { retorne falso; } }
retorno verdadeiro;
}
private String downloadPage(URL pageUrl) { try { Abrir a conexão para a URL para leitura. Leitor BufferedReader = novo BufferedReader(novo InputStreamReader( pageUrl.openStream()));
Leia a página para o buffer. Linha de cordas; StringBuffer pageBuffer = novo StringBuffer(); enquanto ((linha = leitor.readLine()) != nulo) { pageBuffer.append(linha); }
return pageBuffer.toString(); } captura (Exceção e) { }
return null;
}
Remova "www" da URL private String removeWwwFromUrl(String url) { int index = url.indexOf("://www."); if (índice != -1) { return url.substring(0, index + 3) + url.substring(index + 7); }
return (url);
}
Analise a página e encontre o link private ArrayList<String> retrieveLinks(URL páginaUrl, String páginaConteúdo, HashSet crawledList, boolean limitHost) { Compile o padrão correspondente do link com expressões regulares. Padrão p = Pattern.compile("<a\\s+href\\s*=\\s*\"?(. *?) [\"|>]", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(pageContents);
<String> ArrayList linkList = novo <String>ArrayList(); enquanto (m.find()) { Link da cadeia = m.group(1).trim();
se (link.length() < 1) { continue; }
Pule o link para esta página. if (link.charAt(0) == '#') { continue; }
if (link.indexOf("mailto:") != -1) { continue; }
if (link.toLowerCase().indexOf("javascript") != -1) { continue; }
if (link.indexOf("://") == -1) { if (link.charAt(0) == '/') {// lida com absolutamente link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + link; } else { Arquivo string = pageUrl.getFile(); if (file.indexOf('/') == -1) {// lida com endereços relativos link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + "/" + link; } else { Caminho da cadeia = file.substring(0, file.lastIndexOf('/') + 1); link = "http://" + pageUrl.getHost() + ":" + pageUrl.getPort() + caminho + link; } } }
int index = link.indexOf('#'); if (índice != -1) { link = link.substring(0, índice); }
link = removeWwwFromUrl(link);
URL verificadaLink = verifyUrl(link); if (verifiedLink == null) { continue; }
/* Se você restringir hosts, exclua aquelas URLs que não atendem aos critérios */ if (limitHost && !pageUrl.getHost().toLowerCase().equals( verifiedLink.getHost().toLowerCase())) { continue; }
Pule aqueles links que já foram processados. if (crawledList.contains(link)) { continue; }
linkList.add(link); }
return (linkList);
}
Pesquise o conteúdo de uma página web baixada para determinar se há uma string de busca especificada na página
busca booleana privadaStringMatches(String pageContents, String searchString, boolean caseSensitive) { String searchConteúdo = páginaConteúdo; if (!caseSensitive) {// if insensitive minúsculas e minúsculas pesquisaConteúdo = páginaConteúdos.paraLowerPoint(); }
Padrão p = Pattern.compile("[\\s]+"); Termos String[] = p.split(searchString); para (int i = 0; Eu < termos. Comprimento; i++) { if (SensitivoMajúscula) { if (searchContents.indexOf(termos) == -1) { retorne falso; } } else { if (searchContents.indexOf(termos.toLowerPoint()) == -1) { retorne falso; } } }
retorno verdadeiro;
}
Realize a operação de busca propriamente dita crawl public<String> ArrayList (String startUrl, int maxUrls, String searchString, boolean limithost, boolean caseSensitive) {
HashSet<String> crawledList = novo <String>HashSet(); LinkedHashSet<String> paraCrawlList = novo <String>LinkedHashSet();
if (maxUrls < 1) { errorList.add("Valor de URL Max Invalidado."); System.out.println ("Valor de URLs Max Inválidos."); }
if (searchString.length() < 1) { errorList.add ("String de busca faltante."); System.out.println ("String de busca faltante"); }
if (errorList.size() > 0) { System.out.println("err!!"); return errorList; }
Mova www para fora da URL inicial startUrl = removeWwwFromUrl(startUrl);
toCrawlList.add (startUrl); while (toCrawlList.size() > 0) {
if (maxUrls != -1) { if (crawledList.size() == maxUrls) { intervalo; } }
Obtenha a URL no final da lista. URL da string = toCrawlList.iterator().next();
Remova a URL da lista de rastreamento. toCrawlList.remove(url);
Converter a URL da string em objeto URL. URL verificadaUrl = verifyUrl(url);
Pule URL se robôs não tiverem permissão para acessá-la. if (!isRobotAllowed(verifiedUrl)) { continue; }
Adicionar URLs processadas à crawledList crawledList.add(url); String pageConteúdo = downloadPage(verifiedUrl);
if (pageContents != null && pageContents.length() > 0) { Obtenha um link válido na página <String> ArrayList links = retrieveLinks(verifiedUrl, pageContents, crawledList, limitHost);
toCrawlList.addAll(links);
se (searchStringMatches(pageContents, searchString, Sensível a maiúsculas minúsculas)) { result.add(url); System.out.println(url); } }
} resultado do retorno;
}
Função principal public static void main(String[] args) { SearchCrawler crawler = novo SearchCrawler("http://www.itsvse.com/", 100,"Delver_Si"); Busca por threads = nova Thread(crawler); System.out.println ("Iniciar busca..."); System.out.println("resultado:"); search.start(); try { search.join(); } catch (InterruptedException e) { TODO Bloco de captura gerado automaticamente e.printStackTrace(); }
}
} [/mw_shl_code]
|
-
1.png
(100.02 KB, Número de downloads: 591)
-
2.png
(72.18 KB, Número de downloads: 596)
-
3.png
(188.46 KB, Número de downloads: 606)
Anterior:PHP representa 82,2% dos principais sites do 100WPróximo:Visualizador de Código-Fonte Web da Edição Java
|