jsoup é um analisador Java HTML que pode analisar diretamente um endereço URL e conteúdo de texto HTML. Ele fornece uma API de muito baixo esforço para recuperar e manipular dados por meio de métodos de manipulação semelhantes a DOM, CSS e jQuery.
Atualmente estou trabalhando em algo que requer dados regionais em todo o país, desde províncias e cidades até condados, vilas e ruas. Vários Du Niang e várias pesquisas no Google não conseguiram encontrar dados completos. No final, o trabalho árduo valeu a pena e finalmente encontrei dados relativamente completos. No entanto, os dados aqui são precisos apenas ao nível da cidade e não há dados ao nível da aldeia (mais tarde aprendi porquê, analisando os dados). fonte, haha). Além disso, alguns dos dados fornecidos pelos blogueiros são redundantes. Para mim, que tenho transtorno obsessivo-compulsivo e busco a perfeição, pensei que deveria rastrear eu mesmo essa parte dos dados.
O conteúdo da postagem do blog acima é bastante rico. O blogueiro usou PHP para implementá-lo. Como primeiro lugar no ranking de linguagens de programação em 2015, não podemos mostrar fraqueza. rastrear os dados que queremos da página da web ...
A primeira etapa, preparação (fonte de dados + ferramentas):
Fonte de dados (os dados oficiais mais abrangentes e confiáveis até agora): http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/
Ferramentas para rastreamento de dados (ferramentas de rastreamento): http://jsoup.org/
A segunda etapa, análise da fonte de dados:
Em primeiro lugar, não vou explicar o uso da ferramenta jsoup aqui. Se estiver interessado, você mesmo pode conferir.
Ao desenvolver, você deve aprender mais sobre o uso de algumas ferramentas de software. Somente quando as encontrar no processo normal de desenvolvimento você saberá por onde começar. Recomendo a todos que prestem mais atenção às ferramentas de software ao seu redor, caso precisem. eles. Antes de fazer isso, eu não sabia como usar o jsoup, mas sei para que serve o jsoup. Quando precisar usá-lo, procurarei as informações e aprenderei sozinho.
A fonte de dados acima mencionada foi divulgada pelo Gabinete Nacional de Estatísticas da República Popular da China em 2013, e a sua precisão e autoridade são evidentes.
A seguir, vamos analisar a estrutura da fonte de dados, começando pela página inicial:
Ao analisar o código-fonte da página inicial, podemos obter os três pontos a seguir:
1. Todo o layout da página é controlado pela tag table Ou seja, se quisermos selecionar hiperlinks através do jsoup, devemos atentar para o fato de que na imagem acima não são apenas os locais marcados com. províncias, cidades e regiões que usam tabelas, existem várias tabelas em toda a página, portanto não é possível passar a tabela diretamente.
Documento conectar = conectar("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/");
Elementos rowProvince = connect.select("tabela");
para analisar os dados.
2. Em quantos lugares da página existem hiperlinks? Talvez o funcionário tenha considerado por que programadores como você precisam obter esses dados. A página é muito limpa. Exceto pelo número de registro abaixo, que é um hiperlink redundante, outros links podem ser rastreados diretamente.
3. Padrões de dados de províncias e cidades. Cada linha da tabela que contém informações válidas possui um atributo de classe provincialtr. Este atributo é muito importante, continue lendo, há várias tags td em cada linha de dados e cada tag td contém um hiperlink. ., e este hiperlink é exatamente o hiperlink que desejamos. O texto do hiperlink é o nome da província (município, etc.).
Vamos dar uma olhada na página de dados gerais novamente (as páginas de dados gerais incluem páginas de exibição de dados em três níveis nos níveis de cidade, condado e vila):
A razão pela qual reunimos as três páginas acima é porque, por meio da análise, podemos descobrir que as páginas de dados desses três níveis de dados são completamente consistentes. A única diferença é que os atributos de classe da linha de dados tr nos dados do código-fonte HTML. tabela são inconsistentes, correspondendo respectivamente a: citytr, countrytr e towntr. Todo o resto é consistente. Desta forma, podemos usar um método comum para resolver o rastreamento de dados dessas três páginas.
A seguir, vamos analisar a estrutura da fonte de dados, começando pela página inicial:
Finalmente, dê uma olhada na página de dados em nível de aldeia:
O formato dos dados ao nível da aldeia é inconsistente com o formato dos dados das cidades, condados e vilas mencionados acima. Os dados representados a este nível são o nível mais baixo, pelo que não existe uma ligação, pelo que o método de rastreamento da cidade, condado. e os dados da cidade acima não podem ser usados; a classe da linha da tabela que exibe os dados aqui é villagegetr. classificação urbana e rural (o formato dos dados de cidades, condados e vilas é diferente. Este item existe), e a terceira coluna é o nome da cidade.
Depois de compreender os pontos acima, podemos começar a codificar.
A terceira etapa, implementação de codificação:
importar java.io.BufferedWriter; importar java.io.FileWriter; importar java.io.IOException; org.jsoup.nodes.Document; importar org.jsoup.nodes.Element; org.jsoup.select.Elements; /** * Rastreamento de dados de províncias, cidades, condados, vilas e vilas em todo o país * @author liushaofeng * @date -- am:: * @version .. */ public class JsoupTest { private static Map<Integer, String> cssMap = new HashMap<Integer, String>(); "provincetr");// Província cssMap.put(, "citytr");// Cidade cssMap.put(, "countytr");// Condado cssMap.put(, "towntr");// Cidade cssMap.put (, "villagetr");//village} public static void main(String[] args) throws IOException { int level = ; initFile(); // Obtenha informações provinciais em todo o país Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm//"); " + cssMap.get(level)); for (Element provincialElement : rowProvince)//Percorra as províncias e cidades em cada linha{ Elementos select = provincialElement.select("a"); for (Elemento província: select)//Cada província (Província de Sichuan) { parseNextLevel(província, nível + } closeStream(); tente {bufferedWriter = new BufferedWriter(new FileWriter(new File("d://CityInfo.txt"), true)); (IOException e) { e.printStackTrace() } } private static void closeStream() { if (bufferedWriter != null) { try { bufferedWriter.close() } catch (IOException e) { e.printStackTrace(); bufferedWriter = null } } private static void parseNextLevel(Element parentElement, int level) lança IOException { tentar { Thread.sleep();//Sleep, caso contrário, vários códigos de status de erro podem ocorrer} catch (InterruptedException e) { e.printStackTrace(); doc != null) { Elements newsHeadlines = doc.select("tr." + cssMap.get(level));// // Obtém uma linha de dados da tabela para (Element element : newsHeadlines) { printInfo(element, level + ); Elements select = element.select("a");// Ao chamar recursivamente, isso é para determinar se são dados em nível de vila. os dados não possuem uma tag if (select.size() != ) { parseNextLevel(select.last(), level + } } } } /** * Escreva uma linha de dados no arquivo de dados* @param elemento de dados rastreados elemento* @param nível nível da cidade*/ private static void printInfo(Element element, int level) { try { bufferedWriter.write(element.select("td").last().text() + "{" + nível + "}[" + element.select("td").first().text() + "]"); bufferedWriter.flush(); catch (IOException e) { e.printStackTrace(); } private static Document connect(String url) { if (url == null || url.isEmpty()) { throw new IllegalArgumentException(" A entrada url('" + url + "') é inválida!"); } try { return Jsoup.connect(url).timeout( * .get(); } catch (IOException e) { e.printStackTrace(); O processo de rastreamento de dados é um processo longo. Espere devagar Haha, porque o programa demora muito para ser executado, por favor não imprima a saída no console, caso contrário pode afetar o funcionamento do programa....
O formato dos dados finais obtidos é o seguinte ("{}" representa o nível da cidade e o conteúdo em "[]" representa o código da cidade):
Distrito municipal {3}[110100000000]
Distrito de Dongcheng{4}[110101000000]
Escritório do subdistrito de Donghuamen{5}[110101001000]
Comitê de bairro comunitário de Duofu Lane {6}[110101001001]
Comitê de Bairro Comunitário de Yinzha{6}[110101001002]
Comitê de Bairro Comunitário de Dongchang{6}[110101001005]
Comitê de Vizinhança da Comunidade Zhide{6}[110101001006]
Comitê de Bairro Comunitário de Nanchizi{6}[110101001007]
Comitê de Bairro Comunitário de Huangtugang{6}[110101001008]
Comitê de Vizinhança Comunitária de Dengshikou{6}[110101001009]
Comitê de bairro comunitário da estrada Zhengyi {6}[110101001010]
Comitê de Bairro da Comunidade Ganyu {6}[110101001011]
Comitê de Vizinhança Comunitária de Taijichang{6}[110101001013]
Comitê de Bairro Comunitário de Shaojiu{6}[110101001014]
Comitê de Bairro Comunitário de Wangfujing{6}[110101001015]
Escritório do subdistrito de Jingshan{5}[110101002000]
Comitê de Bairro da Comunidade do Templo Longfu {6}[110101002001]
Comitê de Bairro Comunitário de Jixiang {6}[110101002002]
Comitê de Bairro Comunitário de Huanghuamen{6}[110101002003]
Comitê de Vizinhança Comunitária de Zhonggu{6}[110101002004]
Comitê de Vizinhança Comunitária de Weijia{6}[110101002005]
Comitê de Bairro Comunitário de Wangzhima {6}[110101002006]
Comitê do Bairro Comunitário da Rua Leste de Jingshan {6}[110101002008]
Comitê de bairro comunitário da rua Huangcheng Genbei {6}[110101002009]
Escritório do subdistrito de Jiaodaokou{5}[110101003000]
Comitê de Vizinhança Comunitária de Jiaodong{6}[110101003001]
Comitê de Bairro Comunitário de Fuxiang{6}[110101003002]
Comitê de Bairro Comunitário de Daxing {6}[110101003003]
Comitê de Bairro Comunitário de Fuxue{6}[110101003005]
Comitê de Vizinhança Comunitária de Gulouyuan{6}[110101003007]
Comitê de Bairro da Comunidade Juer{6}[110101003008]
Comitê de Vizinhança Comunitária de Nanluoguxiang{6}[110101003009]
Escritório do subdistrito de Andingmen{5}[110101004000]
Comitê de Bairro Comunitário de Jiaobei Toutiao {6}[110101004001]
Comitê de Bairro Comunitário de Beiluoguxiang {6}[110101004002]
Comitê de Vizinhança Comunitária de Guozijian{6}[110101004003]
...
Depois de obter os dados acima, você pode realizar tudo o que deseja fazer sozinho. O código acima pode ser executado diretamente. Após o rastreamento da fonte de dados, ele pode ser convertido diretamente no formato desejado.