在C#中刮取动态Web内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中刮取动态Web内容相关的知识,希望对你有一定的参考价值。

是否有可能刮取动态网页生成的数据?我的意思是例如This website用一些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脚本代码,但不会看到它生成的输出。有没有什么办法可以在呈现页面时读取它创建的标记?

答案

谢谢你指出。我看到通过实现.same结果,但后来又看了一个评论谁说使用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 = @"(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]?):[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引擎。

以上是关于在C#中刮取动态Web内容的主要内容,如果未能解决你的问题,请参考以下文章

在Chrome扩展程序中刮取DOM值

如何在 bs4 [python 3] 中的另一个标签内从没有类或 id 的标签中刮取 url

从表中刮取数据并将其存储在csv文件中

如何更好地循环进入我的网络爬虫?

我如何在网络上抓取某些没有附加属性的单词?

是否可以动态编译和执行 C# 代码片段?