# Mini-Crawler in Java schreiben



## aminskee (6. März 2012)

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 :

```
import java.net.URL;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
 
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTMLDocument;
import javax.swing.text.html.HTMLEditorKit;

public class Java {

	public static List<String> addLinks(List<String> links,String urlLink){
			links = new ArrayList<String>();
			String line="";
			HTMLEditorKit editorKit = new HTMLEditorKit();
	        HTMLDocument htmlDoc = new HTMLDocument();
	        try{
	        editorKit.read(new URL(urlLink).openStream(), htmlDoc, 0);
	        }catch(Exception e){
	        	
	        e.getStackTrace();	
	        }
	        for(HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);iter.isValid();iter.next()) {
	        		line=(String)(iter.getAttributes().getAttribute(HTML.Attribute.HREF));
	        		if (links.size()<10000){
	        		//System.out.println(line);	
	        		links.add(line);
	        		}
	        		
  }
			return links;}
	        
	
	
	public static void startCrawler(int threads){
	
	}
	       
	
	public static void main(String[] args) {
		List <String> link = new ArrayList<String>();
		addLinks(link,"http://www.tutorials.de");
		System.out.println(link.size());
		for(String element:link){
			//hier habe ich ein problem dass die Liste leer bekomme  
			System.out.println(element);
			// und wie geht es weiter 
		}

	}

}
```


----------



## Thomas Darimont (6. März 2012)

Hallo,

ich würde an deiner Stelle Apache Nutch verwenden:
http://nutch.apache.org/

Btw. ein Beispiel zur Link Extrahierung haben wir auch:
http://www.tutorials.de/java/202949-alle-links-eines-html-dokuments-extrahieren.html

Gruß Tom


----------



## aminskee (6. März 2012)

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


----------



## Fabio Hellmann (6. März 2012)

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. 


```
package de.tutorials;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

import javax.swing.text.MutableAttributeSet;
import javax.swing.text.html.HTML;
import javax.swing.text.html.HTML.Tag;
import javax.swing.text.html.HTMLEditorKit.ParserCallback;
import javax.swing.text.html.parser.ParserDelegator;


/**
 * @author FabioH
 * @author $Author$
 * @version $Revision$ $Date$
 */
public class UrlCrawler
{
	private Thread crawlerThread;
	
	/**
	 * 
	 */
	public UrlCrawler() {
	}
	
	/**
	 * @param proxyHost
	 * @param proxyPort
	 */
	public UrlCrawler(final String proxyHost, final int proxyPort) {
		System.setProperty("http.proxyHost", proxyHost);
		System.setProperty("http.proxyPort", String.valueOf(proxyPort));
	}
	
	/**
	 * @param url
	 * @param maxUrls
	 */
	public void start(final String url, final int maxUrls) {
		if(crawlerThread == null) {
			try {
				crawlerThread = new Thread(new RecursiveCrawler(url, maxUrls), "Crawler");
				crawlerThread.start();
			} catch(final MalformedURLException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 
	 */
	public void stop() {
		if(crawlerThread != null) {
			crawlerThread.interrupt();
			crawlerThread = null;
		}
	}
	
	private final class RecursiveCrawler implements Runnable
	{
		private final URL url;
		private final Set<String> alreadyParsedUrls = new TreeSet<String>();
		private int counter = 0;
		private final int maxUrls;
		
		/**
		 * @param urlStr
		 * @param maxUrls
		 * @throws MalformedURLException
		 */
		public RecursiveCrawler(final String urlStr, final int maxUrls)
				throws MalformedURLException {
			this.maxUrls = maxUrls;
			url = new URL(urlStr);
		}
		
		/*
		 * (non-Javadoc)
		 * 
		 * @see java.lang.Runnable#run()
		 */
		@Override
		public void run() {
			crawl(url);
		}
		
		/**
		 * @param crawlUrl
		 */
		private void crawl(final URL crawlUrl) {
			if(maxUrls < counter && alreadyParsedUrls.add(crawlUrl.toString())) {
				final HtmlParser parser = new HtmlParser();
				final List<URL> allHyperlinksFromUrl = parser.getAllHyperlinksFromUrl(crawlUrl);
				counter++;
				System.out.println(counter + ".\t Crawl: " + crawlUrl + ", Hyperlinks found="
						+ allHyperlinksFromUrl.size());
				for(final URL url : allHyperlinksFromUrl) {
					crawl(url);
				}
			}
		}
	}
	
	private class HtmlParser extends ParserCallback
	{
		private List<URL> hyperlinks;
		private String host;
		
		/**
		 * @param url
		 * @return a list with all hyperlinks from the delivered url
		 */
		public List<URL> getAllHyperlinksFromUrl(final URL url) {
			host = url.getHost();
			hyperlinks = new ArrayList<URL>();
			InputStream in = null;
			InputStreamReader reader = null;
			try {
				in = url.openStream();
				reader = new InputStreamReader(in);
				
				new ParserDelegator().parse(reader, this, true);
			} catch(final MalformedURLException e) {
				// Ignore?!
			} catch(final IOException e) {
				// Ignore?!
			} finally {
				try {
					if(reader != null)
						reader.close();
				} catch(final IOException e) {
					e.printStackTrace();
				}
				try {
					if(in != null)
						in.close();
				} catch(final IOException e) {
					e.printStackTrace();
				}
			}
			return hyperlinks;
		}
		
		/*
		 * (non-Javadoc)
		 * 
		 * @see
		 * javax.swing.text.html.HTMLEditorKit.ParserCallback#handleStartTag(javax.swing.text.html
		 * .HTML.Tag, javax.swing.text.MutableAttributeSet, int)
		 */
		@Override
		public void handleStartTag(final Tag t, final MutableAttributeSet a, final int pos) {
			if(Tag.A == t) {
				final Object attributeHref = a.getAttribute(HTML.Attribute.HREF);
				if(attributeHref != null) {
					String href = attributeHref.toString();
					if(href.startsWith("/")) {
						href = host + href;
					}
					
					try {
						hyperlinks.add(new URL(href));
					} catch(final MalformedURLException e) {
						// Ignore?!
					}
				}
			}
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(final String[] args) {
		final UrlCrawler crawler = new UrlCrawler();
		crawler.start("http://www.tutorials.de/", 50);
	}
}
```

Gruß

Fabio


----------



## genodeftest (6. März 2012)

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


----------



## Fabio Hellmann (6. März 2012)

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.


----------



## aminskee (7. März 2012)

ich habe es doch gelöst hier ist die lösung.

```
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.swing.text.html.*;


public class Aufgabe {

	/**
	 * @param args
	 */
    
    //Methode füllt eine List mit Urls auf
    public static List <String> addUrls(String urlLink){
            
        List<String>list=new ArrayList<String>();
        String line="";

        HTMLEditorKit editorKit = new HTMLEditorKit();
        HTMLDocument htmlDoc = new HTMLDocument();
        htmlDoc.putProperty("IgnoreCharsetDirective", Boolean.TRUE);
    
        try{
            editorKit.read(new URL(urlLink).openStream(), htmlDoc, 0);
        }catch(Exception e){
            e.getStackTrace();	
        }

        for(HTMLDocument.Iterator iter = htmlDoc.getIterator(HTML.Tag.A);iter.isValid();iter.next()){
           
            line=(String)(iter.getAttributes().getAttribute(HTML.Attribute.HREF));
            if((line!=null)&&(list.indexOf(line)==-1)){
            list.add(line);           
        }
        }
    return list;
    }
        
        
        
    //Metohde füllt die Ergebnisliste mit den gefundenen Listen von Urls   
    public static List<String> addList(String url,List<String>urlList){
        int i=0;
        int counter=0;
        urlList.addAll(addUrls(url));
           
        while(urlList.size()<=10000){
            int j=0;
           for(String e:addUrls(urlList.get(i))){
               
               System.out.println(counter+" : "+e);
               urlList.add(addUrls(urlList.get(i)).get(j));
               counter++;
            j++;
           } 
           
           i++;
        }
    return urlList;
    }
        
     
    
	
    public static void main(String[] args) {
        List <String> allLinks=new ArrayList<String>();
        addList("http://www.der-webdesigner.net",allLinks);
        int i=1;
             
        for(String e:allLinks){
            System.out.println(i+": "+e);
            i++;
        }
    }
}
```


----------



## genodeftest (7. März 2012)

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


----------

