jsoup ist ein Java-HTML-Parser, der eine URL-Adresse und HTML-Textinhalte direkt analysieren kann. Es bietet eine API mit sehr geringem Aufwand zum Abrufen und Bearbeiten von Daten über DOM, CSS und jQuery-ähnliche Manipulationsmethoden.
Ich arbeite derzeit an etwas, das regionale Daten im ganzen Land erfordert, von Provinzen und Städten bis hin zu Kreisen, Städten und Straßen. Bei verschiedenen Du Niang- und verschiedenen Google-Suchanfragen konnten keine vollständigen Daten gefunden werden. Am Ende hat sich die harte Arbeit gelohnt und ich habe endlich relativ vollständige Daten gefunden. Allerdings sind die Daten hier nur für die Stadtebene genau und es gibt keine Daten für die Dorfebene (ich habe später durch die Analyse der Daten erfahren, warum). (Quelle, haha). Außerdem sind einige der von Bloggern bereitgestellten Daten überflüssig. Für mich, der an einer Zwangsstörung leidet und nach Perfektion strebt, dachte ich, dass ich diesen Teil der Daten selbst herauskriechen muss.
Der Inhalt des obigen Blog-Beitrags ist ziemlich umfangreich. Als Erster in der Rangliste der Programmiersprachen zeigen wir Ihnen jetzt, wie man Java verwendet Crawlen Sie die gewünschten Daten von der Webseite ...
Der erste Schritt, Vorbereitung (Datenquelle + Tools):
Datenquelle (die bislang umfassendsten und maßgeblichsten offiziellen Daten): http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/
Tools zum Crawlen von Daten (Crawler-Tools): http://jsoup.org/
Der zweite Schritt, Datenquellenanalyse:
Zunächst werde ich hier nicht die Verwendung des jsoup-Tools erläutern. Wenn Sie interessiert sind, können Sie es selbst ausprobieren.
Bei der Entwicklung sollten Sie mehr über die Verwendung einiger Softwaretools erfahren. Erst wenn Sie im normalen Entwicklungsprozess auf sie stoßen, wissen Sie, wo Sie anfangen sollen, den Softwaretools um Sie herum mehr Aufmerksamkeit zu schenken ihnen. Bevor ich dieses Ding gemacht habe, wusste ich nicht, wie man Jsoup verwendet, aber ich weiß, wofür Jsoup verwendet werden kann. Wenn ich es verwenden muss, werde ich die Informationen nachschlagen und selbst lernen.
Die oben genannte Datenquelle wurde 2013 vom Nationalen Statistikamt der Volksrepublik China veröffentlicht und ihre Genauigkeit und Autorität sind offensichtlich.
Als nächstes analysieren wir die Struktur der Datenquelle, beginnend mit der Startseite:
Durch die Analyse des Quellcodes der Homepage können wir die folgenden drei Punkte ermitteln:
1. Das gesamte Layout der Seite wird durch das Tabellen-Tag gesteuert. Das heißt, wenn wir Hyperlinks über jsoup auswählen möchten, müssen wir darauf achten, dass im obigen Bild nicht nur die mit gekennzeichneten Stellen vorhanden sind In Provinzen, Städten und Regionen, die Tabellen verwenden, gibt es auf der gesamten Seite mehrere Tabellen, daher ist es nicht möglich, die Tabelle direkt zu übergeben
Dokument connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2013/");
Elemente rowProvince = connect.select("table");
um die Daten zu analysieren.
2. An wie vielen Stellen der Seite gibt es Hyperlinks? Vielleicht hat der Beamte darüber nachgedacht, warum Programmierer wie Sie solche Daten benötigen. Mit Ausnahme der Registrierungsnummer unten, bei der es sich um einen redundanten Hyperlink handelt, können andere Links direkt gecrawlt werden.
3. Datenmuster von Provinzen und Städten. Jede Zeile der Tabelle, die gültige Informationen enthält, verfügt über ein Klassenattribut, das sehr wichtig ist. Bitte lesen Sie weiter, es gibt mehrere td-Tags in jeder Datenzeile und jedes td-Tag enthält einen Hyperlink . und dieser Hyperlink ist genau der Hyperlink, den wir wollen. Der Text des Hyperlinks ist der Name der Provinz (Gemeinde usw.).
Werfen wir noch einmal einen Blick auf die allgemeine Datenseite (allgemeine Datenseiten umfassen dreistufige Datenanzeigeseiten auf Stadt-, Kreis- und Gemeindeebene):
Der Grund, warum wir die oben genannten drei Seiten zusammengestellt haben, liegt darin, dass wir durch Analyse feststellen können, dass die Datenseiten dieser drei Datenebenen vollständig konsistent sind. Der einzige Unterschied besteht darin, dass die Klassenattribute der Datenzeile tr in den HTML-Quellcodedaten vorliegen Tabelle sind jeweils inkonsistent: citytr, countrytr und towntr. Alles andere ist stimmig. Auf diese Weise können wir eine gemeinsame Methode verwenden, um das Daten-Crawling dieser drei Seiten zu lösen.
Als nächstes analysieren wir die Struktur der Datenquelle, beginnend mit der Startseite:
Werfen Sie abschließend einen Blick auf die Datenseite auf Dorfebene:
Das Datenformat auf Dorfebene stimmt nicht mit dem Datenformat der oben genannten Städte, Landkreise und Gemeinden überein. Die auf dieser Ebene dargestellten Daten sind die unterste Ebene, daher gibt es keine Verknüpfung, daher die Crawling-Methode der Stadt, des Landkreises Die obigen Daten können nicht gecrawlt werden. Die Klasse der Tabellenzeile, in der Daten angezeigt werden, ist villagegetr. Zusätzlich zu diesen beiden Daten enthält die erste Spalte den Stadtcode und die zweite Spalte Stadt- und Landklassifizierung (das Datenformat von Städten, Landkreisen und Gemeinden ist unterschiedlich. Dieses Element ist vorhanden), und die dritte Spalte ist der Name der Stadt.
Nachdem wir die oben genannten Punkte verstanden haben, können wir mit dem Codieren beginnen.
Der dritte Schritt, Codierungsimplementierung:
import java.io.BufferedWriter; import java.io.IOException; import java.util.Jsoup; org.jsoup.nodes.Document; import org.jsoup.nodes.Element; org.jsoup.select.Elements; /** * Daten-Crawling von Provinzen, Städten, Landkreisen, Gemeinden und Dörfern im ganzen Land * @author liushaofeng * @date -- am:: * @version .. */ public class JsoupTest { private static Map<Integer, String> cssMap = new HashMap<Integer, String>(); private static BufferedWriter bufferedWriter = null; "provincetr");// Provinz cssMap.put(, "citytr");// Stadt cssMap.put(, "countytr");// Landkreis cssMap.put(, "towntr");// Stadt cssMap.put (, "villagetr");//village} public static void main(String[] args) throws IOException { int level = ; initFile(); // Provinzinformationen im ganzen Land abrufen Document connect = connect("http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm//"); Elements rowProvince = connect.select("tr. " + cssMap.get(level)); for (Element ProvinceElement : rowProvince)//Durchlaufe die Provinzen und Städte in jeder Zeile{ Elements select = ProvinceElement.select("a"); for (Element Province : select)//Jede Provinz (Provinz Sichuan) { parseNextLevel(province, level + } } private static void initFile() { Versuchen Sie { 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) throws IOException { try { Thread.sleep();//Sleep, sonst können verschiedene Fehlerstatuscodes auftreten} Catch (InterruptedException e) { e.printStackTrace(); } Document doc = connect(parentElement.attr("abs:href")); doc != null) { Elements newsHeadlines = doc.select("tr." + cssMap.get(level));// // Eine Datenzeile aus der Tabelle abrufen für (Element element : newsHeadlines) { printInfo(element, level + ); Elements select = element.select("a");// Beim rekursiven Aufruf wird ermittelt, ob es sich um Daten auf Dorfebene handelt Daten haben kein Tag if (select.size() != ) { parseNextLevel(select.last(), level + ); } } } } /** * Schreibe eine Datenzeile in die Datendatei* @param Element gecrawltes Datenelement* @param level Stadtebene*/ private static void printInfo(Element element, int level) { try { bufferedWriter.write(element.select("td").last().text() + "{" + level + "}[" + 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(" Die Eingabe-URL('" + URL + "') ist ungültig!"); } try { return Jsoup.connect(url).timeout( * ).get(); } Catch (IOException e) { e.printStackTrace(); Der Daten-Crawling-Prozess ist ein langer Prozess. Haha, da die Ausführung des Programms lange dauert. Bitte drucken Sie die Ausgabe nicht auf der Konsole aus, da dies sonst den Programmbetrieb beeinträchtigen kann.
Das Format der endgültigen Daten ist wie folgt („{}“ stellt die Stadtebene dar und der Inhalt in „[]“ stellt den Stadtcode dar):
Gemeindebezirk {3}[110100000000]
Bezirk Dongcheng{4}[110101000000]
Unterbezirksbüro Donghuamen{5}[110101001000]
Duofu Lane Community Neighborhood Committee {6}[110101001001]
Nachbarschaftskomitee der Yinzha-Gemeinschaft{6}[110101001002]
Dongchang Community Neighborhood Committee{6}[110101001005]
Zhide Community Neighborhood Committee{6}[110101001006]
Nachbarschaftsausschuss der Gemeinde Nanchizi{6}[110101001007]
Nachbarschaftskomitee der Gemeinde Huangtugang{6}[110101001008]
Nachbarschaftskomitee der Dengshikou-Gemeinschaft{6}[110101001009]
Nachbarschaftskomitee der Gemeinde Zhengyi Road {6}[110101001010]
Nachbarschaftskomitee der Ganyu-Gemeinschaft {6}[110101001011]
Nachbarschaftskomitee der Taijichang-Gemeinschaft{6}[110101001013]
Nachbarschaftsausschuss der Gemeinde Shaojiu{6}[110101001014]
Nachbarschaftskomitee der Gemeinde Wangfujing{6}[110101001015]
Unterbezirksbüro Jingshan{5}[110101002000]
Nachbarschaftskomitee der Longfu-Tempelgemeinschaft {6}[110101002001]
Nachbarschaftskomitee der Gemeinde Jixiang {6}[110101002002]
Nachbarschaftskomitee der Gemeinde Huanghuamen{6}[110101002003]
Nachbarschaftskomitee der Gemeinde Zhonggu{6}[110101002004]
Nachbarschaftskomitee der Gemeinde Weijia{6}[110101002005]
Nachbarschaftskomitee der Gemeinde Wangzhima {6}[110101002006]
Nachbarschaftskomitee der Jingshan East Street Community {6}[110101002008]
Nachbarschaftskomitee der Huangcheng Genbei Street Community {6}[110101002009]
Unterbezirksbüro Jiaodaokou{5}[110101003000]
Nachbarschaftskomitee der Gemeinde Jiaodong{6}[110101003001]
Nachbarschaftskomitee der Gemeinde Fuxiang{6}[110101003002]
Nachbarschaftsausschuss der Gemeinde Daxing {6}[110101003003]
Nachbarschaftsausschuss der Gemeinde Fuxue{6}[110101003005]
Nachbarschaftskomitee der Gemeinde Gulouyuan{6}[110101003007]
Nachbarschaftsausschuss der Juer-Gemeinschaft{6}[110101003008]
Nachbarschaftsausschuss der Gemeinde Nanluoguxiang{6}[110101003009]
Unterbezirksbüro Andingmen{5}[110101004000]
Nachbarschaftskomitee der Gemeinde Jiaobei Toutiao {6}[110101004001]
Nachbarschaftsausschuss der Gemeinde Beiluoguxiang {6}[110101004002]
Nachbarschaftskomitee der Guozijian-Gemeinschaft{6}[110101004003]
...
Nachdem Sie die oben genannten Daten erhalten haben, können Sie selbst realisieren, was Sie tun möchten. Der obige Code kann direkt nach dem Crawlen aus der Datenquelle in das gewünschte Format konvertiert werden.