【问题标题】:Screen scraping web page after delay延迟后屏幕抓取网页
【发布时间】:2011-08-03 23:05:05
【问题描述】:

我正在尝试使用 C# 抓取网页,但是在页面加载后,它会执行一些 JavaScript,将更多元素加载到我需要抓取的 DOM 中。一个标准的抓取工具只是在加载时抓取页面的 html,并且不会获取通过 JavaScript 所做的 DOM 更改。如何添加某种功能以等待一两秒然后获取源?

这是我当前的代码:

private string ScrapeWebpage(string url, DateTime? updateDate)
{
    HttpWebRequest request = null;
    HttpWebResponse response = null;
    Stream responseStream = null;
    StreamReader reader = null;
    string html = null;
    try
    {
        //create request (which supports http compression)
        request = (HttpWebRequest)WebRequest.Create(url);
        request.Pipelined = true;
        request.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
        if (updateDate != null)
            request.IfModifiedSince = updateDate.Value;
        //get response.
        response = (HttpWebResponse)request.GetResponse();
        responseStream = response.GetResponseStream();
        if (response.ContentEncoding.ToLower().Contains("gzip"))
            responseStream = new GZipStream(responseStream,
                CompressionMode.Decompress);
        else if (response.ContentEncoding.ToLower().Contains("deflate"))
            responseStream = new DeflateStream(responseStream,
                CompressionMode.Decompress);
        //read html.
        reader = new StreamReader(responseStream, Encoding.Default);
        html = reader.ReadToEnd();
    }
    catch
    {
        throw;
    }
    finally
    {
        //dispose of objects.
        request = null;
        if (response != null)
        {
            response.Close();
            response = null;
        }
        if (responseStream != null)
        {
            responseStream.Close();
            responseStream.Dispose();
        }
        if (reader != null)
        {
            reader.Close();
            reader.Dispose();
        }
    }
    return html;
}

这是一个示例网址:

http://www.realtor.com/realestateandhomes-search/geneva_ny#listingType-any/pg-4

您会看到页面第一次加载时显示找到 134 个列表,然后一秒钟后显示找到 187 个属性。

【问题讨论】:

    标签: c# c#-4.0 screen-scraping web-scraping


    【解决方案1】:

    为了执行 JavaScript,我使用 webkit 来呈现页面,这是 Chrome 和 Safari 使用的引擎。 Here 是一个使用其 Python 绑定的示例。

    Webkit 也有 .NET bindings 但我没用过。

    【讨论】:

      【解决方案2】:

      无论您等待多长时间,您的方法都行不通,您需要一个浏览器来执行javascript(或理解javascript的东西)。

      试试这个问题: What's a good tool to screen-scrape with Javascript support?

      【讨论】:

      • 感谢您的回复,但我无法找到适用于 C# 的正确方法。我尝试了 Selenium 并且它的浏览器驱动程序可以工作,但是它们打开了对我不起作用的浏览器窗口。然后,我尝试了 Java 的 HtmlUnit 的 .NET dll 端口,但是速度非常慢并且会引发晦涩的错误。我需要有人完成这项工作来分享他们使用的内容并展示一些代码。
      【解决方案3】:

      您需要自己执行 javascript 才能获得此功能。目前,您的代码仅接收服务器在您请求的 URL 处回复的任何内容。由于浏览器会下载、解析并执行随附的 javascript,因此其余的列表都“显示”了。

      【讨论】:

      • 我知道这一点,但我不是浏览器,所以我不知道自己有能力执行 javascript。如果你有这种能力,那你就是了不起的。
      【解决方案4】:

      this similar question 的答案是使用 Web 浏览器控件读取页面并在抓取之前对其进行处理。也许有某种计时器延迟给 javascript 一些时间来执行和返回结果。

      【讨论】:

      • 网络浏览器控件对某些人来说是一个很好的解决方案,但在我的情况下它不起作用,因为它需要一个 STA 线程,这是一个使用 Parallel.Foreach 的高性能多线程应用程序,所以我不'认为他们不能一起玩得很好。
      猜你喜欢
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-19
      • 2011-05-04
      • 2021-11-17
      • 2012-01-01
      相关资源
      最近更新 更多