以下是我的控制台程序的目的:发出网络请求>保存网络请求的结果>使用QueryString从Web请求获取下一页>保存这些结果>使用QueryString从Web请求等获取下一页
所以这里有一些关于如何设置代码的伪代码。
for (int i = 0; i < 3; i++)
{
strPageNo = Convert.ToString(i);
//creates the url I want, with incrementing pages
strURL = "http://www.website.com/results.aspx?page=" + strPageNo;
//makes the web request
wrGETURL = WebRequest.Create(strURL);
//gets the web page for me
objStream = wrGETURL.GetResponse().GetResponseStream();
//for reading web page
objReader = new StreamReader(objStream);
//--------
// -snip- code that saves it to file, etc.
//--------
objStream.Close();
objReader.Close();
//so the server doesn't get hammered
System.Threading.Thread.Sleep(1000);
}
非常简单,对吧? 问题是,即使它增加页码以获得不同的网页,每次循环运行时我都会得到完全相同的结果页。
i
正确递增,我可以将网址strURL
创建的网址剪切/粘贴到网页浏览器中,效果很好。
我可以手动输入&page=1
,&page=2
,&page=3
,然后它会返回正确的页面。不知怎的把增量放在那里搞砸了。
它与会话有什么关系,或者什么?我确保在它再次循环之前关闭流和阅读器......
答案 0 :(得分:4)
您是否尝试过在循环期间每次创建一个新的WebRequest对象,可能是Create()方法没有充分刷新其所有旧数据。
要检查的另一件事是在下一次循环迭代之前,ResponseStream已被充分刷新。
答案 1 :(得分:2)
此代码适用于我:
var urls = new [] { "http://www.google.com", "http://www.yahoo.com", "http://www.live.com" };
foreach (var url in urls)
{
WebRequest request = WebRequest.Create(url);
using (Stream responseStream = request.GetResponse().GetResponseStream())
using (Stream outputStream = new FileStream("file" + DateTime.Now.Ticks.ToString(), FileMode.Create, FileAccess.Write, FileShare.None))
{
const int chunkSize = 1024;
byte[] buffer = new byte[chunkSize];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
byte[] actual = new byte[bytesRead];
Buffer.BlockCopy(buffer, 0, actual, 0, bytesRead);
outputStream.Write(actual, 0, actual.Length);
}
}
Thread.Sleep(1000);
}
答案 2 :(得分:1)
只是一个建议,尝试处理Stream和Reader。我已经看到一些奇怪的情况,没有处理像这样的对象,并在循环中使用它们会产生一些古怪的结果....
答案 3 :(得分:0)
除非您正在使用MVC或能够正确解释查询字符串的内容,否则该URL对我来说没有多大意义。
http://www.website.com/results.aspx&page=
应该是:
http://www.website.com/results.aspx?page=
有些浏览器会接受格式不正确的网址并将其渲染得很好。其他可能不是您的控制台应用程序的问题。
答案 4 :(得分:-1)
这是我糟糕的黑客解决方案:
创建另一个调用此应用程序的控制台应用程序,其中第一个控制台应用程序在strURL结束时传递参数。它有效,但我觉得很脏。