2012-05-04 19 views
8

He creado un simple rastreador web, pero quiero añadir la función de la recursividad para que cada página que se abre puedo conseguir las direcciones URL en esta página, pero no tengo ni idea de cómo puedo hacer eso y también quiero incluir roscas para hacerlo más rápido aquí está mi códigosimple rastreador web en C#

namespace Crawler 
{ 
    public partial class Form1 : Form 
    { 
     String Rstring; 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void button1_Click(object sender, EventArgs e) 
     { 

      WebRequest myWebRequest; 
      WebResponse myWebResponse; 
      String URL = textBox1.Text; 

      myWebRequest = WebRequest.Create(URL); 
      myWebResponse = myWebRequest.GetResponse();//Returns a response from an Internet resource 

      Stream streamResponse = myWebResponse.GetResponseStream();//return the data stream from the internet 
                     //and save it in the stream 

      StreamReader sreader = new StreamReader(streamResponse);//reads the data stream 
      Rstring = sreader.ReadToEnd();//reads it to the end 
      String Links = GetContent(Rstring);//gets the links only 

      textBox2.Text = Rstring; 
      textBox3.Text = Links; 
      streamResponse.Close(); 
      sreader.Close(); 
      myWebResponse.Close(); 




     } 

     private String GetContent(String Rstring) 
     { 
      String sString=""; 
      HTMLDocument d = new HTMLDocument(); 
      IHTMLDocument2 doc = (IHTMLDocument2)d; 
      doc.write(Rstring); 

      IHTMLElementCollection L = doc.links; 

      foreach (IHTMLElement links in L) 
      { 
       sString += links.getAttribute("href", 0); 
       sString += "/n"; 
      } 
      return sString; 
     } 
+0

Votar para cerrar como una pregunta no bien definida. Considere buscar "rastreador web en C#" y refinar su pregunta para que sea más específica. –

+0

Definitivamente no desea utilizar la recursividad como usted no será capaz de mantener el estado de internet en el stack.You local podría utilizar una pila como Tom sugirió, pero se debe invertir el orden en el que se agrega a AbsoluteUris ser rastreado, de lo contrario, la naturaleza de la pila hará que se arrastre desde la parte inferior de la página y, si va a escribir un rastreador, deberá hacer coincidir el comportamiento de recuperación con un navegador lo más posible. Una cola es una mejor opción. A PriorityQueue es aún mejor. –

+0

PriorityQueue https://svn.arachnode.net/svn/arachnodenet/trunk/Structures/PriorityQueue.cs nombre de usuario/contraseña: Públicas/ –

Respuesta

8

me fijo su método de getContent que seguir para obtener nuevos enlaces de la página arrastrado:

public ISet<string> GetNewLinks(string content) 
{ 
    Regex regexLink = new Regex("(?<=<a\\s*?href=(?:'|\"))[^'\"]*?(?=(?:'|\"))"); 

    ISet<string> newLinks = new HashSet<string>();  
    foreach (var match in regexLink.Matches(content)) 
    { 
     if (!newLinks.Contains(match.ToString())) 
      newLinks.Add(match.ToString()); 
    } 

    return newLinks; 
} 

Actualizado

Solucionado: regex debe ser regexLink. Gracias @shashlearner por señalar esto (mi mistype).

+0

Evitando el problema del uso de expresiones regulares para el análisis de HTML pero que no coincide bastante. –

+1

¿Qué es regexLink aquí? – SLearner

+0

regex debe ser regexLink, gracias @shashlearner por señalar esto –

2

A continuación se incluye una respuesta/recomendación.

Creo que debería usar un dataGridView en lugar de un textBox ya que cuando lo mira en la GUI es más fácil ver los enlaces (URL) encontrados.

Usted podría cambiar:

textBox3.Text = Links; 

a

dataGridView.DataSource = Links; 

Ahora la pregunta, no se ha incluido:

using System. "'s" 

que se utilizaron queridos, ya que sería apreciado si pudiera obtenerlos como no puedo resolverlo.

0

Desde el punto de vista de diseño, he escrito un par de webcrawlers. Básicamente, desea implementar una primera búsqueda de profundidad utilizando una estructura de datos de pila. También puede usar la Búsqueda inicial de ancho, pero es probable que tenga problemas de memoria en la pila. Buena suerte.

+2

Creo que el OP está pidiendo más detalles. –

7

he creado algo similar con Reactive Extension.

https://github.com/Misterhex/WebCrawler

espero que le puede ayudar.

Crawler crawler = new Crawler(); 

IObservable observable = crawler.Crawl(new Uri("http://www.codinghorror.com/")); 

observable.Subscribe(onNext: Console.WriteLine, 
onCompleted:() => Console.WriteLine("Crawling completed")); 
+2

¡Guau! Esa es una sintaxis bastante simple. ¿Es esto multiproceso? En cualquier caso, muy fácil de digerir: se parece mucho a javascript. – FredTheWebGuy