延迟后屏幕抓取网页

我正在尝试使用C#抓取一个网页,但是在页面加载之后,它会执行一些javascript,它会将更多元素加载到我需要抓取的DOM中。 标准的scraper只是在加载时抓取页面的html,并且不会获取通过javascript进行的DOM更改。 我如何设置某种function等待一两秒然后获取源?

这是我目前的代码:

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

这是一个示例url:

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

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

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

Webkit也有.NET绑定,但我还没有使用它们。

无论您等待多长时间,您所拥有的方法都无法运行,您需要一个浏览器来执行javascript(或者了解javascript的东西)。

试试这个问题: 使用Javascript支持筛选屏幕的好工具是什么?

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

这个类似问题的答案是使用Web浏览器控件来读取页面并在处理之前处理它。 也许用某种计时器延迟来给javascript一些时间来执行并返回结果。