簡體   English   中英

在 C# 中抓取動態 web 內容

[英]Scraping dynamic web content in C#

是否可以抓取動態 web 頁面生成的數據? 我的意思是,例如這個網站使用一些 java 腳本生成標簽<font>

document.write("<font class=spy2>:<\/font>"+(v2j0j0^o5r8)+(r8d4x4^y5i9)+(b2r8e5^u1p6)+(r8d4x4^y5i9))

每次頁面刷新時值都會發生變化。 每個生成的代碼代表一個從 0 到 9 的數字,例如(code1)+(code2)+(code3)+(code4)並且在后端編寫了某種類型的解析器,它可以理解它並相應地生成數字。

一旦頁面被渲染,例如code1被設置在數字 4 的某個位置,生成數字 4 的位置在解析后來自此代碼。

如果我們使用HtmlAgilityPack ,我們會看到 java 腳本代碼,但看不到它生成的 output。 有什么方法可以讀取它在呈現頁面時創建的標簽?

感謝您的指出。我通過實施看到了相同的結果,但隨后又看到另一條說使用 IE 引擎的評論,我轉身並制作了一個小型應用程序來完成這項工作。我添加了 IE 並將其導航到網站並閱讀了內容.這是代碼

 private void webBrowser1_DocumentCompleted(object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs e)
        {
  System.Windows.Forms.HtmlElementCollection elementsforViewPost =
                                webBrowser1.Document.GetElementsByTagName("font");
  foreach (System.Windows.Forms.HtmlElement current2 in elementsforViewPost)
  {
  if (current2.InnerText != null && CheckForValidProxyAddress(current2.InnerText) &&
                    ObtainedProxies.Where(index=>index.ProxyAddress == current2.InnerText.Trim()).ToList().Count == 0)
 {
   Proxy data = new Proxy();
   data.IsRetired = false;
   data.IsActive = true;
   int result = 1;                   

   data.DomainsVisited = 0;
   data.ProxyAddress = current2.InnerText.Trim();

   ObtainedProxies.Add(data);
}

並且為了檢查收到的文本是有效的代理,這是我很久以前通過谷歌搜索從某個頁面得到的

  private bool CheckForValidProxyAddress(string address)
        {

        //create our match pattern
        //string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$:([0-9][0-9][0-9][0-9])";
        string pattern = @"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b\:[0-9]{0,4}";
        //create our Regular Expression object
        Regex check = new Regex(pattern);
        //boolean variable to hold the status
        bool valid = false;
        //check to make sure an ip address was provided
        if (address == "")
        {
            //no address provided so return false
            valid = false;
        }
        else
        {
            //address provided so use the IsMatch Method
            //of the Regular Expression object
            valid = check.IsMatch(address, 0);
        }
        //return the results
        return valid;
    }

我認為你有義務以某種方式使用 IE 引擎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM