我正在尝试使用C#抓取一个网页,但是在页面加载后,它会执行一些javascript,它会将更多元素加载到我需要抓取的DOM中。标准的scraper只是在加载时抓取页面的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个属性。
答案 0 :(得分:5)
要执行JavaScript我使用webkit来呈现页面,这是Chrome和Safari使用的引擎。 Here是使用其Python绑定的示例。
Webkit也有.NET bindings但我还没有使用它们。
答案 1 :(得分:4)
无论您等待多长时间,您所拥有的方法都无法运行,您需要使用浏览器来执行javascript(或者了解javascript的内容)。
试试这个问题: What's a good tool to screen-scrape with Javascript support?
答案 2 :(得分:1)
您需要自己执行javascript才能获得此功能。目前,您的代码仅接收服务器在您请求的URL处回复的内容。其余的列表“显示”,因为浏览器下载,解析并执行附带的javascript。
答案 3 :(得分:1)
this similar question的答案是说使用网络浏览器控件来读取页面并在处理之前处理它。也许有一些计时器延迟给javascript一些时间来执行并返回结果。