Лучший подход в C# для поиска данных на стороннем веб-сайте

Вот мое требование. Существует общедоступный веб-сайт, который принимает буквенно-цифровую строку в качестве входных данных и извлекает данные в элемент таблицы (с помощью нажатия кнопки). Элемент таблицы имеет несколько меток, которые заполняются соответствующими данными. Мне нужен инструмент / решение, которое может проверить, существует ли конкретная строка в базе данных сайта. Если это так, получить все идентификаторы всех вхождений этой строки. Глядя на "просмотр исходного кода" веб-сайта (там не использовался JavaScript), я отметил имя элемента ввода и имя элемента кнопки, и с помощью существующих примеров я смог получить рабочее решение. Ниже приведен код, который работает, но я хочу проверить, есть ли лучший и более быстрый подход. Я знаю, что в приведенном ниже коде есть некоторые проблемы, такие как проблема "бесконечного цикла" и другие. Но я в основном ищу альтернативное решение, которое может работать быстро на миллион записей.

    namespace SearchWebSite
    {
        public partial class Form1 : Form
        {
            bool searched = false;
            long i; 

            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                i = 1;
                WebBrowser browser = new WebBrowser();
                string target = "http://www.SomePublicWebsite.com";
                browser.Navigate(target);
                browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(XYZ);
            }


            private void XYZ(object sender, WebBrowserDocumentCompletedEventArgs e)
            {
                WebBrowser b = null;
                if (searched == false)
                {
                    b = (WebBrowser)sender;
                    b.Document.GetElementById("txtId").InnerText = "M" + i.ToString();
                    b.Document.GetElementById("btnSearch").InvokeMember("click");
                    searched = true;
                }

                if (b.ReadyState == WebBrowserReadyState.Complete)
                {
                    if (b.Document.GetElementById("lblName") != null)
                    {
                        string IdNo = "M" + i.ToString();
                        string DateString = b.Document.GetElementById("lblDate").InnerHtml;
                        string NameString = b.Document.GetElementById("lblName").InnerHtml;

                        if (NameString != null && (NameString.Contains("XXXX") || NameString.Contains("xxxx")))
                        {
                            using (StreamWriter w = File.AppendText("log.txt"))
                            {
                                w.WriteLine("Id {0}, Date {1}, Name {2}", IdNo, DateString, NameString);
                                i = i + 1;
                                searched = false;
                            }
                        }
                        else
                        {
                            i = i + 1;
                            searched = false;
                        }
                    }
                    else
                    {
                        i = i + 1;
                        searched = false;
                    }
                }
            }
        }
    }

1 ответ

Решение

Если страница после нажатия кнопки поиска содержит элементы управления txtId и btnSearch, чем вы можете использовать этот фрагмент кода, это не будет быстрее, но я думаю, что это правильная форма.

public partial class Form1 : Form
{
    bool searched = false;
    long i = 1;
    private string IdNo { get { return "M" + i.ToString(); } }
    public Form1()
    {
        InitializeComponent(); 
    }

    private void button1_Click(object sender, EventArgs e)
    {
        i = 1;
        WebBrowser browser = new WebBrowser();
        string target = "http://www.SomePublicWebsite.com";
        browser.Navigate(target);
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(XYZ);
    }
    private void XYZ(object sender, WebBrowserDocumentCompletedEventArgs e)
    {
        WebBrowser b = (WebBrowser)sender;
        if (b.ReadyState == WebBrowserReadyState. Complete)
        {
            if (searched == false)
            {
                DoSearch(b); return;
            }
            if (b.Document.GetElementById("lblName") != null)
            {
                string DateString = b.Document.GetElementById("lblDate").InnerHtml;
                string NameString = b.Document.GetElementById("lblName").InnerHtml;

                if (NameString != null && (NameString.Contains("XXXX") || NameString.Contains("xxxx")))
                    using (StreamWriter w = File.AppendText("log.txt"))
                        w.WriteLine("Id {0}, Date {1}, Name {2}", IdNo, DateString, NameString);
            }
            i++;
            DoSearch(b);
        }
    }
    private void DoSearch(WebBrowser wb)
    {
        wb.Document.GetElementById("txtId").InnerText = IdNo;
        wb.Document.GetElementById("btnSearch").InvokeMember("click");
        searched = true;
    }
}
Другие вопросы по тегам