2014-03-01 33 views
0

这是我的要求。有一个公共网站,它将字母数字字符串作为输入,并将数据检索到表格元素中(通过按钮单击)。表格元素有几个标签,它们会填充相应的数据。我需要一个可以检查网站数据库中是否存在特定字符串的工具/解决方案。如果是,则检索该字符串的所有出现的所有ID。查看网站的“查看源代码”(没有使用JavaScript),我注意到输入元素名称和按钮元素名称,并借助现有样本,我得到了一个可行的解决方案。下面是可用的代码,但我想检查是否有更好更快的方法。我知道下面的代码有一些问题,如“无限循环”问题和其他问题。但我基本上正在寻找可以快速工作一百万条记录的备用解决方案。C#中更好的方法在第三方网站上搜索数据

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

'i = i + 1'。有趣:-) –

+1

这绝对是更适合[代码评论](http://codereview.stackexchange.com/) – Jonesopolis

+2

也为什么你关心无限循环?我甚至没有看到一个循环 – Jonesopolis

回答

0

如果SEACH按钮后,页面点击包含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; 
    } 
}