采集ASPX网站翻页的数据(dopostback方式)

Blueracy 2009-11-15 11:25:56

采集数据一般两种方式:一种采集HttpWebRequest 的POST方法有人说可以实现,但是我试了很久没有办法实现,翻不了页,我找不到办法带入__VIEWSTATE参数,太长,如果哪位实现了,也可以给个方法解决

我现在采集第二种:用WebBrowser来采。这里存在一个问题,就是dopostback是AJAX形势,我不知道他什么时候完成。当然可以用TIMER来等持 ,但是我用的是线程方式创建WebBrowser,WebBrowser在DocumentCompleted以外来读取“web1[intThreadBH].Document.Body.InnerHtml”会提示 函数求值超时。不知道哪位有经验的朋友可以指点指点。代码如下:

WebBrowser[] web1=new WebBrowser[99];
bool[] m_boolWeb = new bool[99];
string[] html = new string[99];
private void Form1_Load(object sender, EventArgs e)
{

Thread oThread = new Thread(new ParameterizedThreadStart(StartAspxTaskSearch));

oThread.IsBackground = true;
oThread.Priority = ThreadPriority.Lowest;
oThread.ApartmentState = ApartmentState.STA;
oThread.Start(1);

}
private void StartAspxTaskSearch(object str)
{

try
{
html[1] = "";
this.Invoke(new EventHandler(this.invokeTest));
web1[1].DocumentCompleted += new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(web1_DocumentCompleted);

web1[1].Name = "1";
web1[1].Navigate("http://xxxx.com/InfoList.aspx?type=es");


while (!M_boolWeb[1])
{
//在这里没有办法读取web1[intThreadBH].Document.Body.InnerHtml,i不然可以用HTML里面的判断是否翻页了
Thread.Sleep(800);

}

MessageBox.Show(html[1]);
}
catch(Exception ex)
{
}

}
private void web1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

int intThreadBH = Convert.ToInt32(((WebBrowser)sender).Name);
web1[intThreadBH].Document.All["ctl00$ContentPlaceHolder1$GridView1$ctl38$txtPage"].SetAttribute("value", "8");//8是变量

web1[intThreadBH].Document.InvokeScript("__doPostBack", new object[] { "ctl00$ContentPlaceHolder1$GridView1$ctl38$linkGo", "" });
while (web1[intThreadBH].StatusText != "完成")
{
// timer1.Enabled = false;

}
html[intThreadBH] = web1[intThreadBH].Document.Body.InnerHtml;
m_boolWeb[intThreadBH] = true;

}
public void invokeTest(object sender, EventArgs e)
{
web1[1] = new WebBrowser();
this.Controls.Add(web1[1]);
}
...全文
945 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
benri1 2012-06-16
  • 打赏
  • 举报
回复
帮顶,求解
yangFeng_2008 2011-09-29
  • 打赏
  • 举报
回复
大哥,你提着这个问题你找到好的方法了没有啊,我也遇到了,你要是有好的方法,告诉我声吧,十分感谢啊,我的邮箱是:datalist@sina.com哈
柳晛 2009-11-17
  • 打赏
  • 举报
回复
翻页是POST吗?
另外,Ajax好像不支持跨域提交。
tongyiyi 2009-11-17
  • 打赏
  • 举报
回复
通过这种方式分页的您还是放弃采集算了!
Blueracy 2009-11-17
  • 打赏
  • 举报
回复
顶上去。。。。。。。。。
Blueracy 2009-11-17
  • 打赏
  • 举报
回复
顶上去。。
Blueracy 2009-11-17
  • 打赏
  • 举报
回复
顶上去。。。
Blueracy 2009-11-17
  • 打赏
  • 举报
回复
应该有办法吧。。。

不可能没有办法啊。。。任何办法都可以,只要能解决。
Blueracy 2009-11-16
  • 打赏
  • 举报
回复
顶上去啊,大哥,大姐帮帮忙啊。。
芽疼 2009-11-16
  • 打赏
  • 举报
回复
Blueracy 2009-11-16
  • 打赏
  • 举报
回复
顶上去。。。
Blueracy 2009-11-16
  • 打赏
  • 举报
回复
顶上去。哪位帮帮忙啊。。
Blueracy 2009-11-15
  • 打赏
  • 举报
回复
wuyq11 你好,非常感谢你的回贴,

这个POST方法我试过了。参数只有__VIEWSTATE 没有带进去,因为太长,我没有办法。其它都代进去了。还是得出来的第一页。
你的page=2 这个他们没有这个参数,我刚刚一起代进去试了,也还是第一页。

至“webbrower通过执行按钮操作实现” 这个执行DOPOATBACK后,我不知道他什么时候可以完成。他不会触发DocumentCompleted,而且我用NEW的 webbrowser,在DocumentCompleted以后读不到webbrowser的值,超时。
请求帮助。 其它朋友看看有不有方法, 如果分少了,我另开一贴。。
wuyq11 2009-11-15
  • 打赏
  • 举报
回复
string postData = "";
postData += "page=2";

byte[] data = System.Text.Encoding.UTF8.GetBytes(postData);
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create("");
myRequest.Method = "POST";
myRequest.ContentType = "application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
System.IO.Stream newStream = myRequest.GetRequestStream();
newStream.Write(data, 0, data.Length);
newStream.Close();
HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
System.IO.StreamReader reader = new System.IO.StreamReader(myResponse.GetResponseStream(), System.Text.Encoding.UTF8);
string content=reader.ReadToEnd();
textBox1.Text = content;
webbrower通过执行按钮操作实现

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧