In der letzten Folge haben wir über die Notwendigkeit gesprochen, Java zum Erstellen eines Zhihu-Crawlers zu verwenden. Dieses Mal werden wir untersuchen, wie Code verwendet wird, um den Inhalt der Webseite abzurufen.
Wenn Sie keine Erfahrung mit HTML, CSS, JS und AJAX haben, wird zunächst empfohlen, zum W3C zu gehen (klicken Sie auf mich, klicken Sie auf mich), um ein wenig zu lernen.
Apropos HTML: Hier geht es um ein Problem des GET-Zugriffs und des POST-Zugriffs.
Wenn Sie diesen Aspekt nicht verstehen, können Sie diesen Artikel von W3C lesen: „GET vs. POST“.
Aha, ich werde hier nicht auf Details eingehen.
Dann müssen wir als Nächstes Java verwenden, um den Inhalt einer Webseite zu crawlen.
Zu diesem Zeitpunkt wird sich unser Baidu als nützlich erweisen.
Ja, er ist nicht mehr der unbekannte Internet-Geschwindigkeitstester, er wird bald unser Reptilien-Versuchskaninchen! ~
Werfen wir zunächst einen Blick auf die Homepage von Baidu:
Ich glaube, jeder weiß, dass eine Seite wie diese mittlerweile das Ergebnis der gemeinsamen Arbeit von HTML ist und CSS.
Wir klicken mit der rechten Maustaste auf die Seite im Browser und wählen „Seitenquellcode anzeigen“:
Ja, Es ist genau wie dieses Ding. Dies ist der Quellcode der Baidu-Seite.
Unsere nächste Aufgabe besteht darin, unseren Crawler zu verwenden, um dasselbe zu erhalten.
Sehen wir uns zunächst einen einfachen Quellcode an:
import java.io.*; import java.net.*; public class Main { public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 定义一个字符串用来存储网页内容 String result = ""; // 定义一个缓冲字符输入流 BufferedReader in = null; try { // 将string转成url对象 URL realUrl = new URL(url); // 初始化一个链接到那个url的连接 URLConnection connection = realUrl.openConnection(); // 开始实际的连接 connection.connect(); // 初始化 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); // 用来临时存储抓取到的每一行的数据 String line; while ((line = in.readLine()) != null) { //遍历抓取到的每一行并将其存储到result里面 result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } System.out.println(result); } }
Das Obige ist die Hauptmethode der Java-Simulation. Erhalten Sie Zugriff auf Baidu
Sie können ausführen es, um das Ergebnis zu sehen:
Aha, es ist genau das Gleiche, was wir zuvor im Browser gesehen haben. An diesem Punkt ist der einfachste Crawler fertig.
Aber nicht alle dieser Dinge sind das, was ich will.
Nehmen Sie als Beispiel das große Pfotenlogo von Baidu.
Vorübergehender Bedarf:
Holen Sie sich den Bildlink der großen Pfote des Baidu-Logos.
Lassen Sie uns zunächst darüber sprechen, wie Sie den Browser anzeigen.
Klicken Sie mit der rechten Maustaste auf das Bild und wählen Sie „Elemente prüfen“ (Firefox, Google und IE11 verfügen alle über diese Funktion, aber die Namen sind unterschiedlich):
Aha, Sie können das schlechte IMG-Tag sehen, das von vielen Divs umgeben ist.
Diese Quelle ist der Link zum Bild.
Wie machen wir das also in Java?
Bitte beachten Sie im Voraus, dass zur Erleichterung der Demonstration des Codes nicht alle Codes in Klassen gekapselt sind. Bitte haben Sie Verständnis.
Wir kapseln zunächst den vorherigen Code in eine sendGet-Funktion:
import java.io.*; import java.net.*; public class Main { static String sendGet(String url) { // 定义一个字符串用来存储网页内容 String result = ""; // 定义一个缓冲字符输入流 BufferedReader in = null; try { // 将string转成url对象 URL realUrl = new URL(url); // 初始化一个链接到那个url的连接 URLConnection connection = realUrl.openConnection(); // 开始实际的连接 connection.connect(); // 初始化 BufferedReader输入流来读取URL的响应 in = new BufferedReader(new InputStreamReader( connection.getInputStream())); // 用来临时存储抓取到的每一行的数据 String line; while ((line = in.readLine()) != null) { // 遍历抓取到的每一行并将其存储到result里面 result += line; } } catch (Exception e) { System.out.println("发送GET请求出现异常!" + e); e.printStackTrace(); } // 使用finally来关闭输入流 finally { try { if (in != null) { in.close(); } } catch (Exception e2) { e2.printStackTrace(); } } return result; } public static void main(String[] args) { // 定义即将访问的链接 String url = "http://www.baidu.com"; // 访问链接并获取页面内容 String result = sendGet(url); System.out.println(result); } }
Das sieht etwas ordentlicher aus, bitte verzeihen Sie mir meine Zwangsstörung.
Die nächste Aufgabe besteht darin, aus vielen erhaltenen Dingen den Link zum Bild zu finden.
Die erste Methode, die uns einfällt, besteht darin, die Funktion indexof zu verwenden, um im String-Ergebnis des Seitenquellcodes nach String-Teilstrings zu suchen.
Ja, diese Methode kann dieses Problem langsam lösen, z. B. direkt indexOf("src"), um die Startseriennummer zu finden und dann schnell die Endseriennummer abzurufen.
Diese Methode können wir jedoch nicht immer anwenden, schließlich sind Strohsandalen nur zum Herumlaufen geeignet. Im späteren Stadium müssen dann noch Prothesenbeine geschnitten werden, um den Kopf zu halten.
Bitte verzeihen Sie meine Störung und fahren Sie fort.
Wie finden wir also die Quelle dieses Bildes?
Ja, wie die Zielgruppe unten sagte, regelmäßiges Matching.
Wenn Schüler sich bei regulären Ausdrücken nicht sicher sind, können Sie diesen Artikel lesen: [Python] Web Crawler (7): Tutorial zu regulären Ausdrücken in Python.
Einfach ausgedrückt ist ein regulärer Ausdruck wie ein Abgleich.
Zum Beispiel stehen hier drei dicke Männer, die rote Kleidung, blaue Kleidung und grüne Kleidung tragen.
Die Regel lautet: Fang den in Grün!
Dann wurde der dicke grüne Mann alleine gefangen genommen.
So einfach ist das.
Allerdings ist die reguläre Grammatik immer noch umfangreich und tiefgründig. Es ist unvermeidlich, dass Sie ein wenig verwirrt sind, wenn Sie zum ersten Mal damit in Berührung kommen.
Ich empfehle jedem, ein regelmäßiges Online-Testtool zu verwenden : Online-Test für reguläre Ausdrücke.
Wie nutzt man Regelmäßigkeit in Java, wenn Regelmäßigkeit eine magische Waffe ist?
Das Obige ist der Inhalt des Java-Zhihu-Crawlers ohne Grundkenntnisse. Üben Sie zunächst mit der Baidu-Homepage. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website. php.cn)!