Bot İle Karayolları Yol Durumu Çekme

 

 

Merhaba Arkadaşlar,

Geçenlerde bir müşterimizin internet sitesine Karayolları Genel Müdürlüğü Yol Durumu Bülteni’nin eklenmesi talebi geldi. Tabi bu konuda herhangi bir servis olmadığı için (yada var ben bilmiyorum) bülten sayfasından bot yazarak çekmek gerekti. Bende gerekli bot’u yazarak sayfaya ekledim. Belki birilerine lazım olur diye buraya da ekliyorum.

Öncelikle projemizde kullanacağımız HtmlAgilityPack’i Nuget Console üzerinden Install-Package HtmlAgilityPack yazarak projemize ekliyoruz.  Sonra sayfaya bir GridView ekleyelim.

<asp:GridView ID="GridView" runat="server" AutoGenerateColumns="False" Width="1000" >
            <Columns>                
                <asp:BoundField DataField="CONTENT" HeaderText="Yol Durumu" ItemStyle-Width="1000" />
            </Columns>
        </asp:GridView>

Son olarak aşağıdaki kod yardımı ile GridView’ı dolduruyoruz.

WebRequest request = HttpWebRequest.Create("http://www.kgm.gov.tr/Sayfalar/KGM/SiteTr/YolDanisma/GunlukYolDurumuBulteni.aspx");

                WebResponse response = request.GetResponse();

                StreamReader reader = new StreamReader(response.GetResponseStream());

                string codes = reader.ReadToEnd();

                int startIndex = codes.IndexOf("<table class=\"table table-bordered\" cellspacing=\"5\" cellpadding=\"5\" rules=\"rows\" border=\"1\">") + 58;

                int endIndex = codes.Substring(startIndex).IndexOf("</table>");

                string resultCodes = codes.Substring(startIndex, endIndex);

                HtmlAgilityPack.HtmlDocument htmlDocument = new HtmlAgilityPack.HtmlDocument();
                htmlDocument.LoadHtml(resultCodes);

                DataTable resultTable = new DataTable();
                resultTable.Columns.Add("CONTENT", typeof(string));

                HtmlNodeCollection contents = htmlDocument.DocumentNode.SelectNodes("//tr");

                bool firstRecordControl = false;
                foreach (var content in contents)
                {
                    if (firstRecordControl != false)
                    {
                        string result = content.InnerText.Replace("\r\n\t\t\t\t\t\t\t", "").Replace("\r\n\t\t\t\t\t\t", "");

                        resultTable.Rows.Add(result);
                    }
                    firstRecordControl = true;
                }
                GridView.DataSource = resultTable;
                GridView.DataBind();

Kod kısmından biraz bahsetmek gerekirse öncelikle ilgili sayfayı çekiyoruz. Sonra bizim için önemli kısım table nesnesinin içi olduğu için bu kısmı ayrıştırıyoruz. Burada önemli olan nokta sayfaya bakarken f12 yaptığımızda gördüğümüz kodlar ile sayfayı çektiğimizde gelen kodların aynı olmaması. Eğer ayrıştırırken \ işaretini koymazsanız doğru şekilde ayrışmaz. Burada koda Breakpoint koyup gelen veriyi Notepad++ ‘a yapıştırıp incelemek en güzel çözüm. Daha sonra biraz önce eklediğimiz HtmlAgilityPack kullanıp oluşturduğumuz DataTable’ı dolduruyoruz. Tabi yine kod içinde gelen “\r\n\t\t\t\t\t\t\t” gibi kısımları replace etmemiz gerekiyor.

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir