我正在使用C#下载网页的超文本标记语言,但是当我检查网页的实际代码和我下载的代码时,它们是完全不同的。代码如下:
public static string getSourceCode(string url) {
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
req.Method = "GET";
HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(resp.GetResponseStream());
string soruceCode = sr.ReadToEnd();
sr.Close();
resp.Close();
return soruceCode;
using (StreamReader sRead = new StreamReader(resp.GetResponseStream(), Encoding.UTF8)) {
// veriyi döndür
return sRead.ReadToEnd();
}
private void button1_Click(object sender, EventArgs e) {
string url = "http://www.booking.com/hotel/tr/nena.en-gb.html?label=gog235jc-hotel-en-tr-mina-nobrand-tr-com-T002-1;sid=fcc1c6c78f188a42870dcbe1cabf2fb4;dcid=1;origin=disamb;srhash=3938286438;srpos=5";
string sourceCode = Finder.getSourceCode(url);
StreamWriter sw = new StreamWriter("HotelPrice.txt");//Here the code are completly different with web page code.
sw.Write(sourceCode);
sw.Close();
#region //Get Score Value
int StartIndex = sourceCode.IndexOf("<strong id=\"rsc_total\">") + 23;
sourceCode = sourceCode.Substring(StartIndex, 3);
#endregion
}发布于 2013-03-09 11:04:37
最有可能的原因是,当您使用浏览器请求相同的页面时,它是会话的一部分,而当您使用WebRequest请求相同的页面时,该会话并未建立。
查看URL,查询参数sid看起来像是一个会话标识符或某种随机数。页面可能会根据实际的会话id进行验证,当它确定它们不同时,它会给出某种"Ooopss..错误种子“之类的响应。
为了模仿浏览器的请求,您必须确保生成正确的请求,该请求可能需要包含以下一个或多个内容:
的页面
确定您需要什么的最佳方法是从头到尾跟踪您的浏览器和为该页面提供服务的web服务器之间的对话,并确切地查看请求了哪些页面、请求的顺序以及来回传递的信息。你可以使用WireShark或Fidler来实现这一点--这两个都是免费的工具!
发布于 2013-03-09 13:06:40
我在尝试使用HttpWebRequest抓取页面时遇到了同样的问题,页面使用ajax加载了我想要的所有数据。为了让ajax调用发生,我切换到了WebBrowser控件。
This answer提供了一个如何在WinForms应用程序外部使用该控件的示例。在解析页面之前,您需要连接到浏览器的DocumentCompleted事件。请注意,此事件可能会在页面准备好分析之前多次触发。您可能想要添加如下内容
if(browser.ReadyState == WebBrowserReadyState.Complete)传递给事件处理程序,以了解页面何时完成加载。
https://stackoverflow.com/questions/15306643
复制相似问题