none
Login olunan bir siteden veri çekme hızını artırma RRS feed

  • Soru

  • Merhaba arkadaşlar...

    Aşağıdaki kod ile ilgili siteye gidip login olup istediğim veriyi  çekebiliyorum ancak bu işlem bir hayli zaman alıyor....

    Veriler oldukça çok bu işlemi hızlandırmanın bir yöntemi var mıdır acaba?

     private async void STOKKONTROLSON()
            {
    
    
                 int courow = dataGridView2.RowCount;
                
                for (int j = 0; j < courow; j++)
                {
                    var LİNK1 = dataGridView2.Rows[j].Cells["productSpecialInfoContent"].Value.ToString();
                    
                    if (dataGridView2.Rows[j].Cells["brand"].Value.ToString() == "BLA1")
                    {
    
                        webBrowser1.Navigate(LİNK1);
                        while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                        {
                            Application.DoEvents();  //waits until document loaded
                        }
                        using (var client = new CookieliWebClient())
                        {
                            var values = new NameValueCollection
                        {
                         { "kullaniciadi", "BLA1KA" },
                            { "sifre", "BLA1SİFRE" },
                             };
                            client.UploadValues("https://BLA1/giris", values);
    
                            // Eğer kullanıcı adı ve parolamız geçerli ise  geçerli bir cookiemiz olacak
                            // Artık Login gerektiren sayfalara erişebiliriz.
                            client.Encoding = Encoding.UTF8;
                            
                            string result = await client.DownloadStringTaskAsync(LİNK1);
    
                            HtmlAgilityPack.HtmlDocument dokuman = new HtmlAgilityPack.HtmlDocument();
                            dokuman.LoadHtml(result);
    
                            var ÜRÜNİSMİ = dokuman.DocumentNode.SelectNodes("//h1[@class='renk-malkoc fs18 mt0']")[0].InnerText;
                            var ÜRÜNKODU = dokuman.DocumentNode.SelectNodes("//div[@class='mt10 mb10']/table/tbody/tr/td")[1].InnerText;
    
                            HtmlElementCollection elc = this.webBrowser1.Document.GetElementsByTagName("button");
    
    
    
    
                            foreach (HtmlElement el in elc)
                            {
                                if (el.GetAttribute("className").Equals("fs14 w100 t-center bn on bsn p12 pl15 pr15 ml5 left col-xs-w100 col-xs-ml0 btn btn-malkoc"))
                                {
                                    el.InvokeMember("Click");
                                    break;
    
                                }
    
    
                            }
    
                            webBrowser1.Navigate("BLA1/sepetim");
                            while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete)
                            {
                                Application.DoEvents();  //waits until document loaded
                            }
    
                            string result1 = await client.DownloadStringTaskAsync("BLA1/sepetim");
                            HtmlAgilityPack.HtmlDocument dokuman1 = new HtmlAgilityPack.HtmlDocument();
                            dokuman1.LoadHtml(result1);
    
                            bool f = result1.Contains(ÜRÜNKODU);
    
                            if (f == true)
                            {
                                dataGridView2.Rows[j].Cells["stockAmount"].Value = 10;
                                DataGridViewCellStyle renk1 = new DataGridViewCellStyle();
    
                                renk1.BackColor = Color.Green;
                                dataGridView2.Rows[j].DefaultCellStyle = renk1;
                            }
                            else
                            {
                                dataGridView2.Rows[j].Cells["stockAmount"].Value = 0;
                                DataGridViewCellStyle renk2 = new DataGridViewCellStyle();
    
                                renk2.BackColor = Color.Red;
                                dataGridView2.Rows[j].DefaultCellStyle = renk2;
                            }
    
                        }
    
                    }
    
                    if (dataGridView2.Rows[j].Cells["brand"].Value.ToString() == "BLA2")
                    {
                        
                        using (var client = new CookieliWebClient())
                        {
                            var values = new NameValueCollection
                        {
                         { "bayikod", "BLA2KOD" },
                            { "sifre", "BLA2SİFRE" },
                             };
                            client.UploadValues("BLA2/uye/giris", values);
    
                            // Eğer kullanıcı adı ve parolamız geçerli ise  geçerli bir cookiemiz olacak
                            // Artık Login gerektiren sayfalara erişebiliriz.
                            client.Encoding = Encoding.UTF8;
                            string result = await client.DownloadStringTaskAsync(LİNK1);
    
    
                            HtmlAgilityPack.HtmlDocument dokuman = new HtmlAgilityPack.HtmlDocument();
                            dokuman.LoadHtml(result);
    
    
                            var STOK = dokuman.DocumentNode.SelectNodes("//*[@id='content']/ section/div/div/div/div/div[1]/div[2]/div[4]")[0].InnerText;
    
                            
    
                            if (STOK == "Ürün çok yakında stoklarımıza girecektir.")
                            {
                                DataGridViewCellStyle renk1 = new DataGridViewCellStyle();
    
                                renk1.BackColor = Color.Red;
                                dataGridView2.Rows[j].DefaultCellStyle = renk1;
                                dataGridView2.Rows[j].Cells["stockAmount"].Value = 0;
    
                            }
                            else
                            {
                                DataGridViewCellStyle renk = new DataGridViewCellStyle();
    
                                renk.BackColor = Color.Green;
                                dataGridView2.Rows[j].DefaultCellStyle = renk;
                            }
    
                     
    
                        }
    
                    }
    
                }
            }


    • Düzenleyen ciciks 22 Ağustos 2019 Perşembe 07:00
    22 Ağustos 2019 Perşembe 06:57

Tüm Yanıtlar

  • Çalıştığınız site size WebService vermiyor mu? 

    Ek olarak, kodların geneline baktım. Yavaş vermesi çok normal. 

    Stok kontrol diye method yazdığınıza göre, izlediğiniz yol yanlış. Sürekli WebBrowser'ı refresh yapmak durumunda kalırsınız. Stok dediğiniz önemli bir şey. Bence bunu çalıştığınız siteden webService olarak istemeniz daha doğru. Sipariş girileceğinde stok durumuna anlık olarak bakmanız gerekebilir. Bu şekilde olmayan bir ürünü (stoğu tükenen) varmış gibi de görebilirsiniz.


    İletişim

    22 Ağustos 2019 Perşembe 08:50
    Moderatör
  • Malesef ne WebService ne de xml veriyorlar.

    Çok başları ağrımış ondan dolayı...

    Benim yaptığım kodun sağlıklı bir sonuç vermediğini biliyorum ancak ilgili ürünlerin alternatifi olduğundan dolayı tam stok adedi pek fazla önemli olmuyor. Ona göre ayarlama yapabiliyorum...

    Ancak dediğim gibi ürün sayısı fazla olduğundan süre çok uzun oluyo ve Login olunup veri çekebilecek WebBrowser harici bir yöntem bilmiyorum. O nedenle bu şekilde yapmaya çalıştım. 

    Eğer WebBrowser harici bir yöntemle aynı verileri çekebileceğimz bir yöntem biliyiyorsanız paylaşmanızı rica edebilirmiyiz?

    22 Ağustos 2019 Perşembe 16:27
  • Malesef ne WebService ne de xml veriyorlar.

    Çok başları ağrımış ondan dolayı...

    Benim yaptığım kodun sağlıklı bir sonuç vermediğini biliyorum ancak ilgili ürünlerin alternatifi olduğundan dolayı tam stok adedi pek fazla önemli olmuyor. Ona göre ayarlama yapabiliyorum...

    Ancak dediğim gibi ürün sayısı fazla olduğundan süre çok uzun oluyo ve Login olunup veri çekebilecek WebBrowser harici bir yöntem bilmiyorum. O nedenle bu şekilde yapmaya çalıştım. 

    Eğer WebBrowser harici bir yöntemle aynı verileri çekebileceğimz bir yöntem biliyiyorsanız paylaşmanızı rica edebilirmiyiz?

          Request atıp verileri alabilirsiniz , browser ile karşılaştırırsak kat kat hızlı olur.Response olarak aldığınız html içeriğini de htmlagilitypack kullanarak parçalarsınız.

         Ayrıca datagrid'in datasource özelliğini kullanın  , bu şekilde satır sütun erişmek hem külfetli hem de size eziyet.

          NOT:Verileri siteden habersiz bir şekilde bu yada başka yöntemlerle almak pek etik durmuyor.

    24 Ağustos 2019 Cumartesi 06:40
  • Merhaba!!!

    Haklısınız etik değil ancak çok ısrar etmeme rağmen vermediler xml ve ben alırım dedim ve birşey demediler o nedenle sorun yok:) Bilgileri dahilinde yani :)

    Ancak geri dönen değerlerden biri buton clickte;

     foreach (HtmlElement el in elc)
                            {
                                if (el.GetAttribute("className").Equals("fs14 w100 t-center bn on bsn p12 pl15 pr15 ml5 left col-xs-w100 col-xs-ml0 btn btn-malkoc"))
                                {
                                    el.InvokeMember("Click");
                                    break;
    
                                }
    
    
                            }
    

    Bunu request ile nasıl sağlayabilirim onu bir türlü yapamadığım için browser üzerinden gittim...

    Biraz acemiyim kodda kusura bakmayın.

    Eğer kısa bir yönlendirme yapabilirseniz ve ya kaynak gösterebilirseniz yapmaya çalışayım çünkü request ile ilgili hiçbir bilgim yok.


    koksal_tuna@hotmail.com

    24 Ağustos 2019 Cumartesi 07:53
  • Merhaba!!!

    Haklısınız etik değil ancak çok ısrar etmeme rağmen vermediler xml ve ben alırım dedim ve birşey demediler o nedenle sorun yok:) Bilgileri dahilinde yani :)

    Ancak geri dönen değerlerden biri buton clickte;

     foreach (HtmlElement el in elc)
                            {
                                if (el.GetAttribute("className").Equals("fs14 w100 t-center bn on bsn p12 pl15 pr15 ml5 left col-xs-w100 col-xs-ml0 btn btn-malkoc"))
                                {
                                    el.InvokeMember("Click");
                                    break;
    
                                }
    
    
                            }

    Bunu request ile nasıl sağlayabilirim onu bir türlü yapamadığım için browser üzerinden gittim...

    Biraz acemiyim kodda kusura bakmayın.

    Eğer kısa bir yönlendirme yapabilirseniz ve ya kaynak gösterebilirseniz yapmaya çalışayım çünkü request ile ilgili hiçbir bilgim yok.


    koksal_tuna@hotmail.com

          Siz server'a bir Request yollarsınız oda size ilgili bir Response döner aslında her şey bundan ibaret.Sizin yapmanız gereken , internet sitesine chrome ile girerken arka planda gönderilen requestler ve responseları takip edip bunları C# ile taklit etmek.

         Arka plan da olan biteni dinlemek için çeşitli programlar var bunlar arasından fiddler işinizi görür diye düşünüyorum.

    24 Ağustos 2019 Cumartesi 16:08