web-dev-qa-db-fra.com

Un robot d'exploration Web simple en C #

J'ai créé un robot d'exploration Web simple, mais je veux ajouter la fonction de récursivité de sorte que chaque page ouverte s'ouvre, je peux obtenir les URL dans cette page, mais je n'ai aucune idée de la façon dont je peux le faire et je veux également inclure des discussions pour en faire plus vite ici c'est mon code

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;
        }
8
Khaled Mohamed

J'ai corrigé votre méthode GetContent comme suit pour obtenir de nouveaux liens à partir de la page explorée:

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;
}

Mis à jour

Corrigé: regex devrait être regexLink. Merci @shashlearner pour l'avoir signalé (mon type d'erreur).

8
Darius Kucinskas

j'ai créé quelque chose de similaire en utilisant Reactive Extension .

https://github.com/Misterhex/WebCrawler

j'espère que cela peut vous aider.

Crawler crawler = new Crawler();

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

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

Ce qui suit comprend une réponse/recommandation.

Je crois que vous devriez utiliser dataGridView au lieu de textBox car lorsque vous le regardez dans l'interface graphique, il est plus facile de voir les liens (URL) trouvés.

Vous pouvez changer:

textBox3.Text = Links;

à 

 dataGridView.DataSource = Links;  

Maintenant pour la question, vous n'avez pas inclus: 

using System.  "'s"

lesquels ont été utilisés, il serait apprécié si je pouvais les obtenir car je ne peux pas le comprendre.

2
Connor

Du point de vue de la conception, j'ai écrit quelques robots Web. En gros, vous voulez implémenter une recherche en profondeur d'abord à l'aide d'une structure de données Stack. Vous pouvez également utiliser Breadth First Search, mais vous rencontrerez probablement des problèmes de mémoire de pile. Bonne chance.

0
Tom