Crawler IBGE - JSOUP

Olá Senhores, eu fiz(Pelo menos tentei) um crawler que entra no site do IBGE e acessa o link das cidades e faz o download dos CSV contendo as informações que preciso para jogar no B.I. aqui da empresa, mas acho que minha lógica está errada e não está visitando TODOS os links de cidades, ele visita apenas alguns, poderiam me ajudar?

Já tinha perguntado algo parecido em outro lugar, mas não me ajudaram :frowning:

http://www.guj.com.br/6256-crawler-web-dados-ibge-com-jsoup

Segue o código.

[code]import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.MalformedURLException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.jsoup.HttpStatusException;
import org.jsoup.Jsoup;
import org.jsoup.UnsupportedMimeTypeException;
import org.jsoup.helper.HttpConnection;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class craw {

public static void getLinksUF(String URL) throws IOException {

	FileWriter f = new FileWriter("logs.txt", true);
	PrintWriter logs = new PrintWriter(f);

	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY HH:mm");
	String dataHoraFormatada = sdf.format(d);

	Document doc = Jsoup.connect("http://cidades.ibge.gov.br/xtras/home.php").get();
	Elements questions = doc.select("a[href]");
	for (Element link : questions) {
		if (link.attr("href").contains("uf.php?lang=") && !link.attr("href").contains("lang=_"))
			try {
			System.out.println(link.attr("abs:href"));
			getLinksCidadesPerfil(link.attr("abs:href"));
			
			}catch (SocketTimeoutException e) {
				
			}catch (HttpStatusException e) {
				
			}
	}

	logs.close();

}

public static void getLinksCidadesPerfil(String URL) throws IOException {

	FileWriter f = new FileWriter("logs.txt", true);
	PrintWriter logs = new PrintWriter(f);

	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY HH:mm");
	String dataHoraFormatada = sdf.format(d);

	Document doc = Jsoup.connect(URL).get();
	Elements questions = doc.select("a[href]");
	for (Element link : questions) {
		if (link.attr("href").contains("perfil.php?lang=&codmun=") && !link.attr("href").contains("lang=_"))
			System.out.println(link.attr("abs:href"));
			getLinksCidadesSintese(link.attr("abs:href"));
	}

	logs.close();

}

public static void getLinksCidadesSintese(String URL) throws IOException {

	FileWriter f = new FileWriter("logs.txt", true);
	PrintWriter logs = new PrintWriter(f);

	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY HH:mm");
	String dataHoraFormatada = sdf.format(d);

	Document doc = Jsoup.connect(URL).get();
	Elements questions = doc.select("a[href]");
	for (Element link : questions) {
		if (link.attr("href").contains("idtema=16") && !link.attr("href").contains("lang=_") && !link.attr("href").contains("csv.php?lang="))
			System.out.println(link.attr("abs:href"));
			getLinksCidadesClass(link.attr("abs:href"));
	}

	logs.close();

}

public static void getLinksCidadesClass(String URL) throws IOException {

	InputStream is = null;  
    BufferedInputStream buf = null;  
    FileOutputStream grava = null;  
    
    
	
	FileWriter f = new FileWriter("logs.txt", true);
	PrintWriter logs = new PrintWriter(f);
	
	String outputFolder = "C:\\Users\\rbrasil\\Desktop\\Imagem\\";

	Date d = new Date();
	SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/YYYY HH:mm");
	String dataHoraFormatada = sdf.format(d);

	Document doc = Jsoup.connect(URL).get();
	Elements titulo = doc.select(".csv");
	Elements valor = doc.select("span[class=municipio titulo]");
	Elements estado = doc.select(".uf");
	for (Element linkTitulo : titulo) {
			try {
				if(linkTitulo.attr("href").contains("idtema=16") && !linkTitulo.attr("href").contains("lang=_EN")){
				System.out.println("Estado: " + estado.text() + " - Cidade: " + valor.text() +" - Link Download: "+ linkTitulo.attr("abs:href"));
				logs.write("Estado: " + estado.text() + " - Cidade: " + valor.text() +" - Link Download: "+ linkTitulo.attr("abs:href"));
				//OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(new java.io.File(outputFolder + valor.text())));
				//out.write(linkTitulo.attr("abs:href"));
				
				URL url = new URL(linkTitulo.attr("abs:href"));  
		        url.getHost();  
		        url.getFile();  
		        url.getPort();  
		        url.getUserInfo();  
		        URLConnection con = url.openConnection();  
		        buf = new BufferedInputStream(con.getInputStream());  
		        grava = new FileOutputStream("C:\\Users\\rbrasil\\Desktop\\Imagem\\" + estado.text() + " - " + valor.text() + ".csv");  
				
		        int i = 0;  
	            byte[] bytesIn = new byte[1024];  
	            while ((i = buf.read(bytesIn)) >= 0) {  
	                grava.write(bytesIn, 0, i);  
	            }  
				
	            if (buf != null) {  
                    buf.close();  
                }  
                if (grava != null) {  
                    grava.close();  
                }  
				}
			}catch (NullPointerException e) {
			
			}	
		
	}

	logs.close();

}

public static void main(String[] args) throws IOException {
	getLinksUF("");
}

}[/code]