jsoup est un analyseur HTML Java qui peut analyser directement une adresse URL et le contenu du texte HTML. Il fournit une API à très faible effort pour récupérer et manipuler des données via des méthodes de manipulation de type DOM, CSS et jQuery.
Je travaille actuellement sur quelque chose qui nécessite des données régionales à travers le pays, des provinces et villes aux comtés, villes et rues. Diverses recherches de Du Niang et diverses recherches sur Google n'ont pas permis de trouver des données complètes. En fin de compte, le travail acharné a porté ses fruits et j'ai finalement trouvé des données relativement complètes. Cependant, les données ici ne sont précises qu'au niveau de la ville, et il n'y a pas de données au niveau du village (j'ai appris plus tard pourquoi en analysant les données). source, haha). De plus, certaines des données fournies par les blogueurs sont redondantes. Pour moi qui souffre de trouble obsessionnel-compulsif et qui recherche la perfection, j'ai pensé que je devais explorer moi-même cette partie des données.
Le contenu de l'article de blog ci-dessus est assez riche. Le blogueur a utilisé PHP pour l'implémenter. En tant que première place dans le classement des langages de programmation en 2015, je vais maintenant vous montrer comment utiliser Java. explorer les données que nous voulons à partir de la page Web...
La première étape, la préparation (source de données + outils) :
Source des données (les données officielles les plus complètes et faisant autorité à ce jour) : http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/
Outils d'exploration des données (outils d'exploration) : http://jsoup.org/
La deuxième étape, l'analyse des sources de données :
Tout d'abord, je n'expliquerai pas ici l'utilisation de l'outil jsoup. Si vous êtes intéressé, vous pouvez le vérifier vous-même.
Lors du développement, vous devriez en apprendre davantage sur l'utilisation de certains outils logiciels. Ce n'est que lorsque vous les rencontrerez dans le processus de développement normal que vous saurez par où commencer. J'encourage tout le monde à prêter plus d'attention aux outils logiciels qui vous entourent au cas où vous en auriez besoin. eux. Avant de créer ce truc, je ne savais pas comment utiliser jsoup, mais je sais à quoi peut servir jsoup. Lorsque j'aurai besoin de l'utiliser, je rechercherai les informations et j'apprendrai par moi-même.
La source de données mentionnée ci-dessus a été publiée par le Bureau national des statistiques de la République populaire de Chine en 2013, et son exactitude et son autorité vont de soi.
Analysons ensuite la structure de la source de données, en commençant par la page d'accueil :
En analysant le code source de la page d'accueil, nous pouvons obtenir les trois points suivants :
1. Toute la mise en page de la page est contrôlée par la balise table. C'est-à-dire que si nous voulons sélectionner des hyperliens via jsoup, nous devons faire attention au fait que dans l'image ci-dessus, ce ne sont pas seulement les endroits marqués de les provinces, les villes et les régions qui utilisent des tableaux, il y a plusieurs tableaux dans toute la page, il n'est donc pas possible de passer directement le tableau.
Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/");
Éléments rowProvince = connect.select("table");
pour analyser les données.
2. À combien d'endroits sur la page y a-t-il des hyperliens ? Peut-être que le responsable a réfléchi à la raison pour laquelle les programmeurs comme vous ont besoin d'obtenir de telles données. La page est très propre, à l'exception du numéro d'enregistrement ci-dessous qui est un lien hypertexte redondant, d'autres liens peuvent être explorés directement.
3. Modèles de données des provinces et des villes. Chaque ligne du tableau contenant des informations valides a un attribut de classe provincetr. Cet attribut est très important. Pour savoir pourquoi il est important, veuillez continuer à lire il y a plusieurs balises td dans chaque ligne de données, et chaque balise td contient un lien hypertexte ; . , et cet hyperlien est exactement l'hyperlien que nous souhaitons. Le texte de l'hyperlien est le nom de la province (municipalité, etc.).
Jetons à nouveau un coup d'œil à la page de données générales (les pages de données générales incluent des pages d'affichage de données à trois niveaux aux niveaux de la ville, du comté et de la ville) :
La raison pour laquelle nous avons rassemblé les trois pages ci-dessus est que grâce à l'analyse, nous pouvons constater que les pages de données de ces trois niveaux de données sont complètement cohérentes. La seule différence est que les attributs de classe de la ligne de données tr dans les données du code source HTML. Les tableaux sont incohérents, correspondant respectivement à : citytr, countrytr et towntr. Tout le reste est cohérent. De cette façon, nous pouvons utiliser une méthode commune pour résoudre l’exploration des données de ces trois pages.
Analysons ensuite la structure de la source de données, en commençant par la page d'accueil :
Enfin, jetez un œil à la page de données au niveau du village :
Le format des données au niveau du village n'est pas cohérent avec le format des données des villes, comtés et villages mentionnés ci-dessus. Les données représentées à ce niveau sont le niveau le plus bas, il n'y a donc pas de lien, donc la méthode d'exploration de la ville, du comté. et les données de ville ci-dessus ne peuvent pas être utilisées ; la classe de la ligne du tableau affichant les données ici est villagegetr. En plus de ces deux points, chaque ligne de données contient trois colonnes de données. La première colonne est citycode et la deuxième colonne est. classification urbaine et rurale (le format des données des villes, comtés et villages est différent. Cet élément existe), et la troisième colonne est le nom de la ville.
Après avoir compris les points ci-dessus, nous pouvons commencer à coder.
La troisième étape, la mise en œuvre du codage :
importer java.io.BufferedWriter; importer java.io.File; importer java.io.IOException; importer java.util.Map; org.jsoup.nodes.Document ; importer org.jsoup.nodes.Element ; org.jsoup.select.Elements; /** * Exploration des données des provinces, villes, comtés, villages et villages à travers le pays * @author liushaofeng * @date -- am:: * @version .. */ public class JsoupTest { private static Map<Integer, String> cssMap = new HashMap<Integer, String>(); private static BufferedWriter bufferedWriter = null static { cssMap.put(, "provincetr");// Province cssMap.put(, "citytr");// Ville cssMap.put(, "countytr");// Comté cssMap.put(, "towntr");// Ville cssMap.put (, "villagetr");//village} public static void main(String[] args) lance IOException { int level = ; initFile(); // Obtenez des informations provinciales à travers le pays Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm//"); Éléments rowProvince = connect.select("tr. " + cssMap.get(level)); for (Element provinceElement : rowProvince)//Parcourez les provinces et les villes dans chaque ligne{ Elements select = provinceElement.select("a"); for (Element province : select)//Chaque province (Province du Sichuan) { parseNextLevel(province, level + ); } closeStream( } private static void initFile() { essayez { 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(); bufferedWriter = null; } } private static void parseNextLevel (Element parentElement, int level) lance IOException { try { Thread.sleep();//Veille, sinon divers codes d'état d'erreur peuvent survenir} catch (InterruptedException e) { e.printStackTrace( } Document doc = connect(parentElement.attr("abs:href")); doc != null) { Elements newsHeadlines = doc.select("tr." + cssMap.get(level));// // Récupère une ligne de données de la table pour (Element element : newsHeadlines) { printInfo(element, level + ); Elements select = element.select("a");// Lors d'un appel récursif, il s'agit de déterminer s'il s'agit de données au niveau du village. data n'a pas de balise if (select.size() != ) { parseNextLevel(select.last(), level + ); } } } } /** * Écrivez une ligne de données dans le fichier de données* @param element élément de données analysé* @param level city level*/ private static void printInfo(Element element, int level) { try { bufferedWriter.write(element.select("td").last().text() + "{" + niveau + "}[" + 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(" L'url d'entrée('" + url + "') n'est pas valide !"); } try { return Jsoup.connect(url).timeout( * .get(); } catch (IOException e) { e.printStackTrace(); return null; Le processus d'exploration des données est un long processus. Attendez lentement. Haha, car le programme prend beaucoup de temps à s'exécuter, veuillez ne pas imprimer le résultat sur la console, sinon cela pourrait affecter le fonctionnement du programme....
Le format des données finales obtenues est le suivant ("{}" représente le niveau de la ville, et le contenu entre "[]" représente le code de la ville) :
Arrondissement municipal {3}[110100000000]
District de Dongcheng{4}[110101000000]
Bureau du sous-district de Donghuamen{5}[110101001000]
Comité de quartier communautaire de Duofu Lane {6}[110101001001]
Comité de quartier communautaire de Yinzha{6}[110101001002]
Comité de quartier communautaire de Dongchang{6}[110101001005]
Comité de quartier communautaire de Zhide{6}[110101001006]
Comité de quartier communautaire de Nanchizi{6}[110101001007]
Comité de quartier communautaire de Huangtugang{6}[110101001008]
Comité de quartier communautaire de Dengshikou{6}[110101001009]
Comité de quartier communautaire de Zhengyi Road {6}[110101001010]
Comité de quartier communautaire de Ganyu {6}[110101001011]
Comité de quartier communautaire de Taijichang{6}[110101001013]
Comité de quartier communautaire de Shaojiu{6}[110101001014]
Comité de quartier communautaire de Wangfujing{6}[110101001015]
Bureau du sous-district de Jingshan{5}[110101002000]
Comité de quartier communautaire du temple de Longfu {6}[110101002001]
Comité de quartier communautaire de Jixiang {6}[110101002002]
Comité de quartier communautaire de Huanghuamen{6}[110101002003]
Comité de quartier communautaire de Zhonggu{6}[110101002004]
Comité de quartier communautaire de Weijia{6}[110101002005]
Comité de quartier communautaire de Wangzhima {6}[110101002006]
Comité de quartier communautaire de la rue Jingshan East {6}[110101002008]
Comité de quartier communautaire de la rue Huangcheng Genbei {6}[110101002009]
Bureau du sous-district de Jiaodaokou{5}[110101003000]
Comité de quartier communautaire de Jiaodong{6}[110101003001]
Comité de quartier communautaire de Fuxiang{6}[110101003002]
Comité de quartier communautaire de Daxing {6}[110101003003]
Comité de quartier communautaire de Fuxue{6}[110101003005]
Comité de quartier communautaire de Gulouyuan{6}[110101003007]
Comité de quartier communautaire de Juer{6}[110101003008]
Comité de quartier communautaire de Nanluoguxiang{6}[110101003009]
Bureau du sous-district d'Andingmen{5}[110101004000]
Comité de quartier communautaire de Jiaobei Toutiao {6}[110101004001]
Comité de quartier communautaire de Beiluoguxiang {6}[110101004002]
Comité de quartier communautaire de Guozijian{6}[110101004003]
...
Après avoir obtenu les données ci-dessus, vous pouvez réaliser vous-même ce que vous voulez faire. Le code ci-dessus peut être exécuté directement après avoir exploré la source de données, il peut être directement converti dans le format souhaité.