Eu escrevi muitos rastreadores de python de uma página única antes e sinto que o python ainda é muito útil. Aqui eu uso o Java para resumir um rastreador de várias páginas, rasteja iterativamente todos os links da página de sementes e salve-os todos no caminho do TMP.
1. Prefácio
A implementação deste rastreador requer suporte de duas estruturas de dados, fila não visitada (PriorityQueue: pode calcular a importância do URL) e a tabela visitada (hashset: pode descobrir rapidamente se a URL existe); A fila é usada para implementar o primeiro rastreamento de largura e a tabela visitada é usada para gravar o URL rastejado, não rasteja mais repetidamente, evitando anéis. Os kits de ferramentas exigidos pelos Java Crawlers incluem httpclient e htmlparser1.5, e você pode visualizar o download da versão específica no repo Maven.
1. Site de destino: Sina http://www.sina.com.cn/
2. Captura de tela dos resultados:
Vamos falar sobre a implementação de rastreadores. O código -fonte será enviado para o GitHub mais tarde. Amigos que precisam podem deixar uma mensagem:
2. Programação de rastreador
1. Crie o URL da página de sementes
Mycrawler rastreador = new mycrawler ();
crawler.crawling (new string [] {"http://www.sina.com.cn/"});
2. Inicialize a tabela não visitada como o URL de semente acima
Linkqueue.addunvisitedurl (sementes [i]);
3. A parte mais importante da implementação lógica: Retire o URL que não foi visitado na fila, faça o download e adicione a tabela visitada, analise outros URLs na página URL alterada e adicione a fila não lida à fila não visitada; itera até que a fila esteja vazia, então essa rede de URL ainda é muito grande. Observe que o download da página e a resolução da página aqui exigem a implementação do Java Toolkit, e o uso do kit de ferramentas é explicado em detalhes abaixo.
while (! linkQueue.unvisitedurlsEmpty () && LinkQueue.getVisitedUrlnum () <= 1000) {// O URL do cabeçalho sai da fila de string visiturl = (string) linkQueue.unvisitedurldequeue (); if (visiturl == null) continuar; Download do download do download do download = new downloadfile (); // Faça o download da página da web downloader.DownloadFile (visitUrl); // O URL é colocado no URL LinkQueue.AdvisitedUrl visitado (visitUrl); // Extrair o URL do conjunto de páginas da web download <Bring> links = htmlparsertool.extraclinks (visiturl, filtro); // novo URL não visitado ingresso para (String link: links) {linkQueue.addunvisitedurl (link); }}4. Baixe o kit de ferramentas para a seguinte página HTML
public String DownloadFile (String url) {string filepath = null; / * 1. Gere o objeto httpClinet e defina os parâmetros */ httpClient httpClient = new HttpClient (); // Defina o tempo limite da conexão HTTP para 5s httpclient.gethttpConnectionManager (). GetParams (). SetConnectionTimeout (5000); / * 2. Gere o objeto getMethod e defina os parâmetros */ getMethod getMethod = new getMethod (URL); // Defina o tempo limite da solicitação GET para 5s getMethod.getparams (). SetParameter (httpmethodparams.so_timeout, 5000); // Defina a solicitação de reproduzir processamento getMethod.getParams (). SetParameter (httpmethodparams.retry_handler, new DefaultTttpMethodRetRyHandler ()); /* 3. Execute http get request*/ try {int statusCode = httpclient.executemethod (getMethod); // determinar o código de status de acesso se (statusCode! = httpstatus.sc_ok) {System.err.println ("Método falhou:" + getMethod.getStatusLine ()); filepath = nulo; }/* 4. Processe conteúdo de resposta http*/byte [] Responsbody = getMethod.getResponseBody (); // Leia como uma matriz de bytes // gera o nome do arquivo ao salvar de acordo com a página da web url filepath = "temp //" + getFilenameByUrl (url, getMethod.getSoSoSoSoHeader (// " + getFilenameByurl (url, getMethOnSoSoSoSoHeader (//" + getFilenames. Savetolocal (resposta, filepath); } catch (httPexception e) {// ocorreu uma exceção fatal, o que pode ser que o protocolo esteja incorreto ou há um problema com o sistema de conteúdo retornado.out.println ("Verifique o endereço HTTP fornecido!"); E.PrintStackTrace (); } catch (ioexception e) {// uma exceção de rede ocorreu e.printStackTrace (); } finalmente {// libere a conexão getMethod.releaseconnection (); } retornar filepath; }5. HTML Page Parsing Toolkit:
Public Static Set <String> extraclinks (String URL, LinkFilter Filter) {Set <String> Links = new HashSet <String> (); tente {parser parser = novo analisador (url); parser.setEncoding ("GB2312"); // filtre o filtro da tag <cresch> para extrair o link representado pelo atributo src no quadro de nodefilter de tag -tag FrameFilter = new NodeFilter () {public boolean Acep (nó nó) {if (node.getText (). } else {return false; }}}}; // orfilter para definir tags de filtragem <a> e tags <crame> orfilter linkFilter = new orfilter (new NodeClassFilter (linkTag.class), FrameFilter); // Obtenha todas as tags filtradas nodelist list = parser.extractallnodesthatmatch (linkFilter); for (int i = 0; i <list.size (); i ++) {tag node = list.Elementat (i); if (tag instanceof linkTag) // <a> tag {linkTag link = (linkTag) tag; String linkurl = link.getLink (); // url if (filter.accept (linkurl)) links.add (linkurl); } else // <drame> tag {// extraia o link para o atributo src no quadro, como <ardem src = "test.html"/> string frame = tag.getText (); int start = frame.indexof ("src ="); frame = frame.substring (start); int end = frame.indexOf (""); if (end == -1) end = frame.indexof (">"); String FrameUrl = Frame.Substring (5, End - 1); if (filter.accept (frameurl)) links.add (frameurl); }}} catch (parserexception e) {e.printStackTrace (); } retornar links; }6. A página não visitada é salva usando priorityQueue com filas preferidas, principalmente para aplicar a algoritmos como o PageRank. Alguns URLs são mais leais; A tabela visitada é implementada usando hashset, preste atenção para descobrir rapidamente se existe;
classe pública LinkQueue {// Acessado URL Collection Private Static Set VisitedUrl = new HashSet (); // Coleção de URL acessada Fila estática privada unvisitedurl = new priorityQueue (); // obtém url fila public static fila getunvisitedurl () {return Unvisitedurl; } // Adicione à fila de URL visitada public static void addvisitedurl (String url) {visitedurl.add (url); } // Remova o URL acessado Public Static void RemoverVisitedUrl (String url) {visitedurl.remove (url); } // URLs não vendidos estão fora do objeto estático público da fila unvisitedurldequeue () {return Unvisitedurl.poll (); } // Verifique se cada URL é acessado apenas uma vez que public estático void addunvisitedurl (String url) {if (url! = Null &&! Url.trim (). Equals ("") &&! Visitedurl.contains (url) &&! Unvisited (url); } // Obtenha o número de URLs que foram acessados estáticos públicos int getvisitedurlnum () {return visitedurl.size (); } // julgue se a fila de URL não visitada é vazia public estática booleana unvisitedurlsEmpty () {return Unvisitedurl.isEmpty (); }}O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.