1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Mini-Crawler in Java schreiben

Dieses Thema im Forum "Java" wurde erstellt von aminskee, 6. März 2012.

  1. aminskee

    aminskee Grünschnabel

    Die Aufgabe lautet :

    1.Der Crawler lädt das HTML von einer URL
    2.Er sucht die Link-URLs aus dem HTML (<a href=...>)
    3.er lädt die URLs der gefundenen Links (zurück zu 1.)
    4.Nach 10000 Pages bricht er ab.

    1und 2 habe ich schon den Rest habe ich 2 tage daran gedacht und gesucht aber leider nichts gefunden was einfach ist ich bitte sie um Hilfe
    voila mein code :
    Code (Java):
    1.  
    2. import java.net.URL;
    3. import java.util.ArrayList;
    4. import java.util.LinkedList;
    5. import java.util.List;
    6.  
    7. import javax.swing.text.html.HTML;
    8. import javax.swing.text.html.HTMLDocument;
    9. import javax.swing.text.html.HTMLEditorKit;
    10.  
    11. public class Java {
    12.  
    13.     public static List<String> addLinks(List<String> links,String urlLink){
    14.             links = new ArrayList<String>();
    15.             String line="";
    16.             HTMLEditorKit editorKit = new HTMLEditorKit();
    17.             HTMLDocument htmlDoc = new HTMLDocument();
    18.             try{
    19.             editorKit.read(new URL(urlLink).openStream(), htmlDoc, 0);
    20.             }catch(Exception e){
    21.                
    22.             e.getStackTrace(); 
    23.             }
    24.             for(HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);iter.isValid();iter.next()) {
    25.                     line=(String)(iter.getAttributes().getAttribute(HTML.Attribute.HREF));
    26.                     if (links.size()<10000){
    27.                     //System.out.println(line);
    28.                     links.add(line);
    29.                     }
    30.                    
    31.   }
    32.             return links;}
    33.            
    34.    
    35.    
    36.     public static void startCrawler(int threads){
    37.    
    38.     }
    39.            
    40.    
    41.     public static void main(String[] args) {
    42.         List <String> link = new ArrayList<String>();
    43.         addLinks(link,"http://www.tutorials.de");
    44.         System.out.println(link.size());
    45.         for(String element:link){
    46.             //hier habe ich ein problem dass die Liste leer bekomme  
    47.             System.out.println(element);
    48.             // und wie geht es weiter
    49.         }
    50.  
    51.     }
    52.  
    53. }
    54.  
    Zuletzt von einem Moderator bearbeitet: 6. März 2012
  2. Thomas Darimont

    Thomas Darimont Administrator

  3. aminskee

    aminskee Grünschnabel

    Danke für die schnelle Antwort mit der Aufgabe würde ich ein Praktikum platz bekommen unter der Bedienung dass ich dass Programm in java 6 mache und nur in eine classe ,ich habe dass gefunden http://www.uni-koblenz-landau.de/koblenz/fb4/AGStaab/Teaching/SS08/ir08/2.Praxisaufgabe

    warum in main mein liste ist leer ,obwohl habe ich ein Methode um es auszufüllen (siehe Kommentare),bitte Thomson ich habe gesehen dass du drauf hast bitte hilf mir um mein studium abzuschliessen

    Danke ,vielen Dank
    lg
  4. Fabio Hellmann

    Fabio Hellmann Erfahrenes Mitglied

    Hi,
    also ich habe bisher auch noch keinen Crawler geschrieben. Allerdings wollte ich das selber schon seit längerem mal ausprobieren. Perfekt ist er vielleicht nicht, aber er erfüllt seinen Zweck. :)

    Code (Java):
    1. package de.tutorials;
    2.  
    3. import java.io.IOException;
    4. import java.io.InputStream;
    5. import java.io.InputStreamReader;
    6. import java.net.MalformedURLException;
    7. import java.net.URL;
    8. import java.util.ArrayList;
    9. import java.util.List;
    10. import java.util.Set;
    11. import java.util.TreeSet;
    12.  
    13. import javax.swing.text.MutableAttributeSet;
    14. import javax.swing.text.html.HTML;
    15. import javax.swing.text.html.HTML.Tag;
    16. import javax.swing.text.html.HTMLEditorKit.ParserCallback;
    17. import javax.swing.text.html.parser.ParserDelegator;
    18.  
    19.  
    20. /**
    21.  * @author FabioH
    22.  * @author $Author$
    23.  * @version $Revision$ $Date$
    24.  */
    25. public class UrlCrawler
    26. {
    27.     private Thread crawlerThread;
    28.    
    29.     /**
    30.      *
    31.      */
    32.     public UrlCrawler() {
    33.     }
    34.    
    35.     /**
    36.      * @param proxyHost
    37.      * @param proxyPort
    38.      */
    39.     public UrlCrawler(final String proxyHost, final int proxyPort) {
    40.         System.setProperty("http.proxyHost", proxyHost);
    41.         System.setProperty("http.proxyPort", String.valueOf(proxyPort));
    42.     }
    43.    
    44.     /**
    45.      * @param url
    46.      * @param maxUrls
    47.      */
    48.     public void start(final String url, final int maxUrls) {
    49.         if(crawlerThread == null) {
    50.             try {
    51.                 crawlerThread = new Thread(new RecursiveCrawler(url, maxUrls), "Crawler");
    52.                 crawlerThread.start();
    53.             } catch(final MalformedURLException e) {
    54.                 e.printStackTrace();
    55.             }
    56.         }
    57.     }
    58.    
    59.     /**
    60.      *
    61.      */
    62.     public void stop() {
    63.         if(crawlerThread != null) {
    64.             crawlerThread.interrupt();
    65.             crawlerThread = null;
    66.         }
    67.     }
    68.    
    69.     private final class RecursiveCrawler implements Runnable
    70.     {
    71.         private final URL url;
    72.         private final Set<String> alreadyParsedUrls = new TreeSet<String>();
    73.         private int counter = 0;
    74.         private final int maxUrls;
    75.        
    76.         /**
    77.          * @param urlStr
    78.          * @param maxUrls
    79.          * @throws MalformedURLException
    80.          */
    81.         public RecursiveCrawler(final String urlStr, final int maxUrls)
    82.                 throws MalformedURLException {
    83.             this.maxUrls = maxUrls;
    84.             url = new URL(urlStr);
    85.         }
    86.        
    87.         /*
    88.          * (non-Javadoc)
    89.          *
    90.          * @see java.lang.Runnable#run()
    91.          */
    92.         @Override
    93.         public void run() {
    94.             crawl(url);
    95.         }
    96.        
    97.         /**
    98.          * @param crawlUrl
    99.          */
    100.         private void crawl(final URL crawlUrl) {
    101.             if(maxUrls < counter && alreadyParsedUrls.add(crawlUrl.toString())) {
    102.                 final HtmlParser parser = new HtmlParser();
    103.                 final List<URL> allHyperlinksFromUrl = parser.getAllHyperlinksFromUrl(crawlUrl);
    104.                 counter++;
    105.                 System.out.println(counter + ".\t Crawl: " + crawlUrl + ", Hyperlinks found="
    106.                         + allHyperlinksFromUrl.size());
    107.                 for(final URL url : allHyperlinksFromUrl) {
    108.                     crawl(url);
    109.                 }
    110.             }
    111.         }
    112.     }
    113.    
    114.     private class HtmlParser extends ParserCallback
    115.     {
    116.         private List<URL> hyperlinks;
    117.         private String host;
    118.        
    119.         /**
    120.          * @param url
    121.          * @return a list with all hyperlinks from the delivered url
    122.          */
    123.         public List<URL> getAllHyperlinksFromUrl(final URL url) {
    124.             host = url.getHost();
    125.             hyperlinks = new ArrayList<URL>();
    126.             InputStream in = null;
    127.             InputStreamReader reader = null;
    128.             try {
    129.                 in = url.openStream();
    130.                 reader = new InputStreamReader(in);
    131.                
    132.                 new ParserDelegator().parse(reader, this, true);
    133.             } catch(final MalformedURLException e) {
    134.                 // Ignore?!
    135.             } catch(final IOException e) {
    136.                 // Ignore?!
    137.             } finally {
    138.                 try {
    139.                     if(reader != null)
    140.                         reader.close();
    141.                 } catch(final IOException e) {
    142.                     e.printStackTrace();
    143.                 }
    144.                 try {
    145.                     if(in != null)
    146.                         in.close();
    147.                 } catch(final IOException e) {
    148.                     e.printStackTrace();
    149.                 }
    150.             }
    151.             return hyperlinks;
    152.         }
    153.        
    154.         /*
    155.          * (non-Javadoc)
    156.          *
    157.          * @see
    158.          * javax.swing.text.html.HTMLEditorKit.ParserCallback#handleStartTag(javax.swing.text.html
    159.          * .HTML.Tag, javax.swing.text.MutableAttributeSet, int)
    160.          */
    161.         @Override
    162.         public void handleStartTag(final Tag t, final MutableAttributeSet a, final int pos) {
    163.             if(Tag.A == t) {
    164.                 final Object attributeHref = a.getAttribute(HTML.Attribute.HREF);
    165.                 if(attributeHref != null) {
    166.                     String href = attributeHref.toString();
    167.                     if(href.startsWith("/")) {
    168.                         href = host + href;
    169.                     }
    170.                    
    171.                     try {
    172.                         hyperlinks.add(new URL(href));
    173.                     } catch(final MalformedURLException e) {
    174.                         // Ignore?!
    175.                     }
    176.                 }
    177.             }
    178.         }
    179.     }
    180.    
    181.     /**
    182.      * @param args
    183.      */
    184.     public static void main(final String[] args) {
    185.         final UrlCrawler crawler = new UrlCrawler();
    186.         crawler.start("http://www.tutorials.de/", 50);
    187.     }
    188. }
    189.  
    Gruß

    Fabio
    Zuletzt bearbeitet: 6. März 2012
  5. genodeftest

    genodeftest Erfahrenes Mitglied

    Der Crawler von Fabio berücksichtigt aber nur das Attribut HREF. Bilder, Stylesheets, Scripte, Objekte, Videos, … werden ignoriert.
  6. Fabio Hellmann

    Fabio Hellmann Erfahrenes Mitglied

    Ja das ist klar. Aber Bilder, Stylesheets, etc. noch mit einzubinden ist jetzt nicht mehr weiter schwer. Das ist schließlich nur ein Grundgerüst. ;)
  7. aminskee

    aminskee Grünschnabel

    ich habe es doch gelöst hier ist die lösung.
    Code (Java):
    1.  
    2. import java.net.URL;
    3. import java.util.ArrayList;
    4. import java.util.List;
    5. import javax.swing.text.html.*;
    6.  
    7.  
    8. public class Aufgabe {
    9.  
    10.     /**
    11.      * @param args
    12.      */
    13.    
    14.     //Methode füllt eine List mit Urls auf
    15.     public static List <String> addUrls(String urlLink){
    16.            
    17.         List<String>list=new ArrayList<String>();
    18.         String line="";
    19.  
    20.         HTMLEditorKit editorKit = new HTMLEditorKit();
    21.         HTMLDocument htmlDoc = new HTMLDocument();
    22.         htmlDoc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
    23.    
    24.         try{
    25.             editorKit.read(new URL(urlLink).openStream(), htmlDoc, 0);
    26.         }catch(Exception e){
    27.             e.getStackTrace(); 
    28.         }
    29.  
    30.         for(HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);iter.isValid();iter.next()){
    31.            
    32.             line=(String)(iter.getAttributes().getAttribute(HTML.Attribute.HREF));
    33.             if((line!=null)&&(list.indexOf(line)==-1)){
    34.             list.add(line);          
    35.         }
    36.         }
    37.     return list;
    38.     }
    39.        
    40.        
    41.        
    42.     //Metohde füllt die Ergebnisliste mit den gefundenen Listen von Urls  
    43.     public static List<String> addList(String url,List<String>urlList){
    44.         int i=0;
    45.         int counter=0;
    46.         urlList.addAll(addUrls(url));
    47.            
    48.         while(urlList.size()<=10000){
    49.             int j=0;
    50.            for(String e:addUrls(urlList.get(i))){
    51.                
    52.                System.out.println(counter+" : "+e);
    53.                urlList.add(addUrls(urlList.get(i)).get(j));
    54.                counter++;
    55.             j++;
    56.            }
    57.            
    58.            i++;
    59.         }
    60.     return urlList;
    61.     }
    62.        
    63.      
    64.    
    65.    
    66.     public static void main(String[] args) {
    67.         List <String> allLinks=new ArrayList<String>();
    68.         addList("http://www.der-webdesigner.net",allLinks);
    69.         int i=1;
    70.              
    71.         for(String e:allLinks){
    72.             System.out.println(i+": "+e);
    73.             i++;
    74.         }
    75.     }
    76. }
    77.  
  8. genodeftest

    genodeftest Erfahrenes Mitglied

    Kannst du den Code bitte in Java-Tags fassen ? (siehe meine Signatur)

Diese Seite empfehlen