Percorrer links recursivamente

2 respostas
F

Olá pessoal.

Estou querendo um algoritmo que percorra, a partir de uma página, todos os links seus links recursivamente.
Já dei uma mexida com Parser de HTML, tentei implementar algo, mas não rolou. Abaixo o código que eu fiz até agora. ele tá imprimindo todos os links da página que eu passo por parâmetro.

private static void getPages(String url) throws ParserException {

		Parser htmlParser = new Parser(url);
		HasAttributeFilter filter = new HasAttributeFilter("href");

		NodeList nodeList = htmlParser.parse(filter);

		for (NodeIterator i = nodeList.elements(); i.hasMoreNodes();) {

			Node n = i.nextNode();

			if (n instanceof TagNode) {

				TagNode tag = (TagNode) n;

				System.out.println(tag.getAttribute("href"));

			}

		}
	}

Porém não estou conseguindo implementar a recursividade. Alguém poderia me ajudar com isso?

2 Respostas

sergiotaborda

fabioo:
Olá pessoal.

Estou querendo um algoritmo que percorra, a partir de uma página, todos os links seus links recursivamente.
Já dei uma mexida com Parser de HTML, tentei implementar algo, mas não rolou. Abaixo o código que eu fiz até agora. ele tá imprimindo todos os links da página que eu passo por parâmetro.

private static void getPages(String url) throws ParserException {

		Parser htmlParser = new Parser(url);
		HasAttributeFilter filter = new HasAttributeFilter("href");

		NodeList nodeList = htmlParser.parse(filter);

		for (NodeIterator i = nodeList.elements(); i.hasMoreNodes();) {

			Node n = i.nextNode();

			if (n instanceof TagNode) {

				TagNode tag = (TagNode) n;

				System.out.println(tag.getAttribute("href"));

			}

		}
	}

Porém não estou conseguindo implementar a recursividade. Alguém poderia me ajudar com isso?

Algoritmos de spider são recursivos, mas não usam recursividade de metodo.
O que vc faz é ter um fila ( Queue) e coloca os links nela.
Enquanto a queue não estiver vazia, puxa o primeiro link, lê todos os links da página e joga na fila de novo, e assim vai.

Vc pode fazer com multithread fazendo várias thread usarem a mesma fila.

Ou seja, o segredo para a recursividade é a fila, e não um método especial ou um encadiamento especial de metodos.

E

O bom de usar multithread nesse caso é que você pode fazer com que várias conexões sejam usadas ao mesmo tempo, o que otimiza o tempo de carregamento da página. Use um esquema de “produtor” / “consumidor”, onde o “produtor” é o cara que interpreta as páginas e põe os links encontrados na fila, e os “consumidores” são as threads que pegam as coisas da fila, checam se o tal link já não foi baixado (isso é importante!) e então começam a baixar os links. Se um link baixado for uma página, devolve para o produtor (o produtor também pode ter uma fila, mas de páginas já baixadas).

Criado 8 de fevereiro de 2013
Ultima resposta 8 de fev. de 2013
Respostas 2
Participantes 3