Dans le dernier épisode, nous avons parlé de la nécessité d'utiliser Java pour créer un robot Zhihu, donc cette fois, nous étudierons comment utiliser le code pour obtenir le contenu de la page Web.
Tout d'abord, si vous n'avez aucune expérience avec HTML, CSS, JS et AJAX, il est recommandé d'aller au W3C (cliquez sur moi, cliquez sur moi) pour en apprendre un peu.
En parlant de HTML, cela implique un problème d'accès GET et d'accès POST.
Si vous ne comprenez pas cet aspect, vous pouvez lire cet article du W3C : "GET vs. POST".
Aha, je n'entrerai pas dans les détails ici.
Ensuite, nous devons ensuite utiliser Java pour explorer le contenu d'une page Web.
À ce moment-là, notre Baidu vous sera utile.
Oui, il n'est plus l'inconnu des testeurs de débit internet, il est en passe de devenir notre cobaye reptile ! ~
Jetons d'abord un coup d'œil à la page d'accueil de Baidu :
Je crois que tout le monde sait qu'une page comme celle-ci est désormais le résultat du travail conjoint de HTML et CSS.
Nous faisons un clic droit sur la page dans le navigateur et sélectionnons « Afficher le code source de la page » :
Oui, C'est exactement comme cette chose. Il s'agit du code source de la page Baidu.
Notre prochaine tâche consiste à utiliser notre robot d'exploration pour obtenir la même chose.
Regardons d'abord un code source simple :
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); } }
Ce qui précède est la méthode principale de simulation Java. Accédez à Baidu
Vous pouvez exécuter. pour voir le résultat :
Aha, c'est exactement la même chose que ce qu'on a vu dans le navigateur auparavant. À ce stade, le robot d’exploration le plus simple est prêt.
Mais toutes ces choses ne sont pas ce que je veux. Comment puis-je en obtenir ce que je veux ?
Prenons l'exemple du logo de la grosse patte de Baidu.
Besoin temporaire :
Obtenez le lien photo de la grosse patte du logo Baidu.
Parlons d’abord de la façon d’afficher le navigateur.
Cliquez avec le bouton droit sur l'image et sélectionnez Inspecter les éléments (Firefox, Google et IE11 ont tous cette fonction, mais les noms sont différents) :
Aha, vous pouvez voir la pauvre balise img entourée de nombreux divs.
Cette src est le lien vers l'image.
Alors, comment fait-on cela en Java ?
Veuillez noter à l'avance que afin de faciliter la démonstration du code, tous les codes ne sont pas encapsulés par classes, veuillez comprendre.
Nous encapsulons d'abord le code précédent dans une fonction sendGet :
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); } }
Cela a l'air un peu plus soigné, s'il vous plaît, pardonnez-moi pour mon trouble obsessionnel-compulsif.
La tâche suivante consiste à trouver le lien vers l'image parmi un grand nombre de choses obtenues.
La première méthode à laquelle nous pouvons penser est d'utiliser la fonction indexof pour rechercher des sous-chaînes String dans le résultat de chaîne du code source de la page.
Oui, cette méthode peut résoudre progressivement ce problème, par exemple directement indexOf("src") pour trouver le numéro de série de départ, puis obtenir rapidement le numéro de série de fin.
Cependant, on ne peut pas utiliser cette méthode tout le temps. Après tout, les sandales en paille ne conviennent que pour se promener. Plus tard, il faudra encore couper la jambe prothétique pour tenir la tête.
Veuillez pardonner mon intrusion et continuer.
Alors comment trouver le src de cette image ?
Oui, comme l'a dit le public ci-dessous, une correspondance régulière.
Si des étudiants ne sont pas sûrs des expressions régulières, vous pouvez vous référer à cet article : [Python] Web Crawler (7) : Tutoriel sur les expressions régulières en Python.
Pour faire simple, l'expression régulière est comme la correspondance.
Par exemple, trois gros hommes se tiennent ici, portant des vêtements rouges, des vêtements bleus et des vêtements verts.
La règle est : attrapez celui en vert !
Puis le gros homme vert a été capturé seul.
C'est aussi simple que cela.
Cependant, la grammaire régulière est toujours vaste et profonde. Il est inévitable que vous soyez un peu confus lorsque vous entrez en contact avec elle
Je recommande à tout le monde un outil de test en ligne régulier. : test en ligne d'expression régulière.
Avec la régularité comme arme magique, comment utiliser la régularité en java ?
Ce qui précède est le contenu de l'écriture du robot Java Zhihu sans aucune connaissance de base. Tout d'abord, entraînez-vous avec la page d'accueil de Baidu. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www. php.cn) !