Προς το περιεχόμενο

IPBoard Online Users Parser


Προτεινόμενες αναρτήσεις

Δημοσ.

Καλημέρα μάγκες!

 

Έφτιαξα ένα "IPBoard Froum - Online Users Grabber". Δουλεύει άψογα με το Insomnia.gr, θα το δοκιμάσω και με άλλα Forums.

 

Αυτό που όμως θέλω να ρωτήσω είναι:
Πως μπορώ να το κάνω να τρέχει με σειρά; δηλαδή να το Parse(...) να περιμένει το webClient.DownloadString(...); δεν έχω ασχοληθεί με Tasks :(

 

 

Grabber Class

    class Grabber
    {
        private List<string> xUsersList = new List<string>();
        private string xHtmlData    = "";
        private string xUrl         = "";
        private string xPattern1    = "";
        private string xPattern2    = "";

        public Grabber(string url, string pattern1, string pattern2)
        {
            // Initiallization
            xUrl = url;
            xPattern1 = pattern1;
            xPattern2 = pattern2;

            // Download html data and parse for obtaining users
            ProcessInitiallizer();
        }

        private void ProcessInitiallizer() 
        {
            try
            {
                // Create request
                WebClient webClient = new WebClient();
                webClient.Encoding = Encoding.UTF8;
                xHtmlData = webClient.DownloadString(new Uri(xUrl));

                // Parse html data
                ParseHtml();
            }
            catch (Exception)
            {
                xUsersList.Clear();
                xUsersList.Add("[Exception]: Can't download html source. Please Check your Internet Connection!");
            }

        }

        private void ParseHtml()
        {
            // Parse Html Data - Phase 1
            string[] xArray = Regex.Matches(xHtmlData, xPattern1)
            .Cast<Match>()
            .Select(m => m.Value)
            .ToArray();

            // Remove Double Records
            xArray = xArray.Distinct().ToArray();

            // Parse Html Data - Phase 2
            foreach (string s in xArray)
            {
                var x = Regex.Match(s, xPattern2).ToString();
                x = x.Remove(0, 1);
                x = x.Remove(x.Length - 1, 1);

                xUsersList.Add(x);
            }

        }//ParseHtml

        public List<string> GetUsers()
        {
            if (xUsersList.Count >= 1)
            {
                return xUsersList;
            }
            else
            {
                xUsersList.Add("GetUsers(): An error happened! There are no users!");
                return xUsersList;
            }
        }//GetUsers

    }

How to call it!

        void CallGrabber()
        {
            // List to save users & Patterns that we will pass to Grabber class
            List<string> listUsers = new List<string>();
            string p1 = "href='http://www.insomnia.gr/user/\\d+\\-\\S+/'";
            string p2 = "-.*/";

		
	    // Get Users
            Grabber grabber = new Grabber("http://www.insomnia.gr/index", p1, p2);
            listUsers = grabber.GetUsers();
        
	    //You got the list with online users... do whatever you want (some statics maby?)
        }
Δημοσ.

Χρειάζεσαι την DownloadStringTaskAsync

WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
Task<string> task = webClient.DownloadStringTaskAsync(new Uri(xUrl));
task.ContinueWith(t => Parse(task.Result));

Σε ΝΕΤ 4.5 υπαρχουν και οι async/await

Δημοσ.

Χρειάζεσαι την DownloadStringTaskAsync

WebClient webClient = new WebClient();
webClient.Encoding = Encoding.UTF8;
Task<string> task = webClient.DownloadStringTaskAsync(new Uri(xUrl));
task.ContinueWith(t => Parse(task.Result));

Σε ΝΕΤ 4.5 υπαρχουν και οι async/await

 

 

Το δοκίμασα αλλά κάτι δεν έκανα καλά και δεν έπαιρνα ποτέ το Html Source.

PS: Το Project είναι σε 4.0, μπορώ να το κάνω Update/Upgrade χωρίς προβλήματα και χωρίς πολλές επεμβάσεις;

void Function()
{
   WebClient wc = new WebClient();
   wc.DownloadStringAsync();
   wc.DownloadStringAsyncCompleted += Event...
}

void Event(..., ...)
{
   xHtmlData = e.Text;
}
Δημοσ.

Ναι γιατι η Task =... επιστρεφει αμεσως,

Η ContinueWith θα εκτελεστει σε νεο thread μολις ερθουν τα δεδομένα.

Αν ειναι console application θα κλεισει πριν ερθουν τα δεδομενα. Βαλε ενα Console.ReadLine() στο τελος.

 

Η ουσια ειναι οτι δεν θα μπλοκαρεις περιμενοντας.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...