Sur la base des liens vers le site Web cible, cet article augmente encore la difficulté, capture le contenu dont nous avons besoin sur la page cible et l'enregistre dans la base de données. Le cas de test utilise ici un site Web de téléchargement de film que j'utilise souvent (http://www.80s.la/). À l'origine, je voulais ramper tous les liens de téléchargement de films sur le site Web, mais plus tard, j'ai senti que cela prenait trop de temps, alors je l'ai changé pour ramper les liens de téléchargement pour le film 2015.
Introduction au premier principe
En fait, les principes sont similaires au premier article. La différence est que comme il y a trop de listes de classification sur ce site Web, il est inimaginable si ces balises ne sont pas choisies.
Vous n'avez pas besoin d'utiliser des liens de catégorie ou des liens de balise. Vous n'utilisez pas ces liens pour ramper d'autres pages. Vous ne pouvez obtenir la liste des autres pages que par la pagination de tous les types de films en bas de la page. Dans le même temps, pour la page Détails du film, vous ne faites que ramper le titre de film et les liens de téléchargement de Thunder, et ne rampez pas en profondeur. Vous n'avez pas besoin de films et autres liens recommandés sur la page Détails.
Enfin, enregistrez les liens de téléchargement de tous les films obtenus dans la collection VideoluLinkMap et enregistrez les données dans MySQL en traversant cette collection.
Implémentation à deux code
Le principe de mise en œuvre a été mentionné ci-dessus, et il y a des commentaires détaillés dans le code, donc je n'en parlerai pas ici, le code est le suivant:
Action de package; import java.io.buffereDReader; import java.io.ioexception; import java.io.inputstream; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.malformmedUrlexect; java.sql.preparedStatement; import java.sql.sqlexception; import java.util.linkedhashmap; import java.util.map; import java.util.regex.matcher; import java.util.regex.pattern; classe publique VideoLinkGrab {public static void main (String [] args) {videoLinkGrab videoLinkGrab = new videoLinkGrab (); videolunkgrab.savedata ("http://www.80s.la/movie/list/-2015-----p"); } / ** * Enregistrez les données récupérées dans la base de données * * @param BUSTURL * CRAWLER Point de départ * @return Null * * / public void SaveData (String bounseUrl) {map <String, boolean> oldmap = new LinkedHashMap <string, boolean> (); // Stocker link-est-il traversé par map <string, string> videoLkMap = new LinkedHashMap <String, String> (); // lien de téléchargement vidéo String oldLinkHost = ""; // Host Pattern p = motive.compile ("(https?: //)? [^ /// s] *"); // par exemple: http://www.zifangsky.cn Matcher M = P.Matcher (BUSURL); if (m.find ()) {oldLinkHost = M.Group (); } oldmap.put (substandul, false); VideoLinkMap = CrawLlinks (OldLinkHost, OldMap); // Traversé et enregistrer les données dans la base de données try {connection connection = jdbcdemo.getConnection (); for (map.entry <string, string> mapping: videolinkmap.entryset ()) {préparéStatement pStatement = connection .preparestatement ("insérer dans le film (movieName, movieLink) valeurs (?,?)"); pStation.SetString (1, mapping.getKey ()); pStation.SetString (2, mapping.getValue ()); pstatement.executeUpdate (); pstatement.close (); // system.out.println (mapping.getKey () + ":" + mapping.getValue ()); } connection.close (); } catch (sqlexception e) {e.printStackTrace (); }} / ** * Crawer tous les liens de la page Web qui peuvent être rampés sur un site Web. Dans l'idée, l'algorithme de priorité d'étendue est utilisé pour initier en permanence des demandes de nouveaux liens qui n'ont pas été traversés. Jusqu'à ce que l'ensemble complet soit traversé, aucun nouveau lien ne peut être trouvé *, ce qui signifie que de nouveaux liens ne peuvent être trouvés. La tâche se termine * * Lorsque vous faites une demande de lien, utilisez des recherches régulières pour le lien vidéo dont nous avons besoin pour la page Web, puis enregistrez-le dans la collection VideoLinkMap * * @param oldLinkhost * Domain Name, tel que: http://www.zifangsky.cn * @param oldmap * Collection de téléchargement de liaison CrawLinks (String OldLinkHost, Map <String, boolean> oldmap) {map <string, boolean> newmap = new LinkedHashMap <String, boolean> (); // Nouveau lien obtenu à partir de chaque carte de boucle <string, string> videoLkmap = new LinkedHashMap <String, String> (); // lien de téléchargement vidéo String oldLink = ""; for (map.entry <string, booléan> mapping: oldmap.entryset ()) {// system.out.println ("link:" + mapping.getKey () + "-------- Vérifier:" // + mapping.getValue ()); // s'il n'a pas été traversé par (! Mapping.getValue ()) {oldLink = mapping.getKey (); // initier une demande de get try {url url = new URL (oldLink); HttpurlConnection Connection = (httpurlConnection) url .OpenConnection (); connection.setRequestMethod ("get"); connection.setConnectTimeout (2500); connection.setReadTimeout (2500); if (connection.getResponSEcode () == 200) {inputStream inputStream = connection.getInputStream (); BufferedReader Reader = new BufferedReader (new InputStreamReader (InputStream, "UTF-8")); Chaîne line = ""; Motif motif = null; Matcher Matcher = NULL; // Page Détails du film, retirez le lien de téléchargement vidéo et ne continuez pas à ramper d'autres pages en profondeur si (isMoviEPage (oldLink)) {Boolean CheckTitle = false; String title = ""; while ((line = reader.readline ())! = null) {// Récupère le titre vidéo dans la page if (! checkTitle) {Pattern = Pattern.Compile ("([^ // s] +). *? </ title>"); Matcher = Pattern.matcher (ligne); if (Matcher.Find ()) {title = Matcher.Group (1); checkTitle = true; continuer; }} // Supprimez le lien de téléchargement vidéo dans la page Pattern = Pattern .Compile ("(Thunder: [^ /"] +). * Thunder [rr] es [tt] itle = / "[^ /"] * / ""); Matcher = Pattern.matcher (ligne); if (Matcher.Find ()) {videolinkMap.put (Title, Matcher.Group (1)); System.out.println ("Nom de la vidéo:" + Title + "------ Lien vidéo:" + Matcher.Group (1)); casser; // La page actuelle a été détectée}}} // la page de liste de films else if (checkUrl (oldLink)) {while ((line = reader.readline ())! = Null) {Pattern = motive Matcher.group (1) .trim (); (newlink.endswith ("/")) newlink = newlink.substring (0, newlink.length () - 1); System.out.Println (Temp: "+ NewLink); } essayez {Thread.Sleep (1000); } catch (InterruptedException e) {e.printStackTrace (); } oldmap.replace (oldlink, false, true); }} // Il y a un nouveau lien, continuez à traverser if (! Newmap.isempty ()) {oldmap.putall (newmap); videolukmap.putall (CrawLlinks (OldLinkhost, OldMap)); // En raison des caractéristiques de la carte, les paires de valeurs clés en double ne se produiront pas} return videolinkMap; } / ** * Jugez s'il s'agit d'une page de liste de films 2015 * @param URL URL à cocher * @return Status * * / public boolean checkurl (String URL) {Pattern Pattern = Pattern.Compile ("http://www.80s.la/movie/list/-2015----p/d*"); Matcher Matcher = Pattern.matcher (URL); if (Matcher.Find ()) Renvoie True; // Liste 2015 Else Retour False; } / ** * Jugez si la page est une page de détails de film * @param URL Page Link * @return Status * * / public boolean isMoViePage (String URL) {Pattern Pattern = Pattern.Compile ("http://www.80s.la/movie//d+"); Matcher Matcher = Pattern.matcher (URL); if (Matcher.Find ()) Renvoie True; // Page de film Else Retour False; }} Remarque: Si vous souhaitez explorer un contenu spécifié à partir d'autres sites Web, vous devez modifier certaines des expressions régulières raisonnablement en fonction de la situation réelle.
Trois résultats de test
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.