请问在HttpWebRequest中如何模拟一个PostBack事件?谢谢

RaymondXie 2009-12-08 03:53:42
看到一个网站用Gridview来显示搜索结果,可是分页不是按URL来写的,所以每一次都得按一下页码来显示其他页面上的内容。也就是说,除了第一页的内容,好像没法通过程序来自动发一个HttpWebRequest来抓取搜索结果。我想请问有没有哪位大侠可以指导一下如何通过程序来自动获取所有页面的搜索结果?
这个网站的分页是这样的代码:
<div id="ctl00_ContentPlaceHolder1_AspNetPager1" style="width:100%;text-align:right;">
<a disabled="disabled" style="margin-right:5px;">上一页</a><span style="margin-right:5px;font-weight:Bold;color:red;">[1]</span>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','2')" style="margin-right:5px;">[2]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','3')" style="margin-right:5px;">[3]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','4')" style="margin-right:5px;">[4]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','5')" style="margin-right:5px;">[5]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','6')" style="margin-right:5px;">[6]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','7')" style="margin-right:5px;">[7]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','8')" style="margin-right:5px;">[8]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','9')" style="margin-right:5px;">[9]</a>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','10')" style="margin-right:5px;">[10]</a>
<span style="margin-right:5px;"><a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','11')">...</a></span>
<a href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','2')" style="margin-right:5px;">下一页</a>
</div>
...全文
3798 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
饶荣 2012-08-10
  • 打赏
  • 举报
回复
登陆了,还是看不到回复呢?
hubeiyuhuih 2011-05-15
  • 打赏
  • 举报
回复
人太笨,看了半天没明白
RaymondXie 2009-12-11
  • 打赏
  • 举报
回复
谢谢你 jshi123
RaymondXie 2009-12-10
  • 打赏
  • 举报
回复
我试了以下代码,好像不工作,
Dim bt() As Byte
Dim para As String
para = "_EVENTTARGET=ctl00$ContentPlaceHolder1$AspNetPager1&_EVENTARGUMENT=2"

r.Method = "POST"
r.AllowWriteStreamBuffering = True
bt = System.Text.Encoding.ASCII.GetBytes(para)
r.ContentLength = bt.Length
r.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
r.KeepAlive = False

Dim wres As WebResponse
Try
wres = r.GetResponse
。。。
r.GetResponse得不到response,也不报错,死在这一行,是不是我传参数的方法不对?还望做过的大侠指点。谢谢。
jshi123 2009-12-10
  • 打赏
  • 举报
回复
注意根据注释里说明做下修改:

Dim postData As New NameValueCollection
postData.Item("__VIEWSTATE") = "。。。。。。非常长的一个viewstate" ' 把__VIEWSTATE的值复制到这里
postData.Item("__EVENTTARGET") = "ctl00$ContentPlaceHolder1$AspNetPager1"
postData.Item("__EVENTARGUMENT") = "3"

Dim wc As New WebClient()
Dim resp As Byte() = wc.UploadValues("http://url", postData) ' url填要抓取页面的url

Dim strResult As String = New StreamReader(New MemoryStream(resp), True).ReadToEnd()

RaymondXie 2009-12-10
  • 打赏
  • 举报
回复
我修改了我的代码,下面的代码是工作的,不过不是正常工作,我是想模拟点击了第3页,可是返回的结果还是第1页,不知是什么原因?

Dim bt() As Byte
Dim para As String

'Here is the parameters that are passed to the page
para = "__EVENTTARGET=ctl00$ContentPlaceHolder1$AspNetPager1&__EVENTARGUMENT=3"

r.Method = "Post"
r.AllowWriteStreamBuffering = True
bt = System.Text.Encoding.ASCII.GetBytes(para)
r.ContentLength = bt.Length
r.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
r.KeepAlive = False

Dim strResult As String


Dim s As Stream = r.GetRequestStream()
s.Write(bt, 0, bt.Length)

s.Close()


Dim wres As WebResponse
Try
wres = r.GetResponse
Dim sr As StreamReader
sr = New StreamReader(wres.GetResponseStream(), True)

strResult = sr.ReadToEnd

Catch ex As Exception
Throw ex

End Try

另外,我把页面的源码贴在这里:
<body>
<form name="aspnetForm" method="post" action="search.aspx?a5000zzzz" onsubmit="javascript:return WebForm_OnSubmit();" id="aspnetForm">
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__LASTFOCUS" id="__LASTFOCUS" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="。。。。。。非常长的一个viewstate" />
</div>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['aspnetForm'];
if (!theForm) {
theForm = document.aspnetForm;
}
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
//]]>
</script>
。。。。。。

我试图传递过去的是__EVENTTARGET和__EVENTARGUMENT

谢谢。
RaymondXie 2009-12-09
  • 打赏
  • 举报
回复
我知道它这是用了AspNetPager,可是我也不知道用HttpWebRequest怎么来写个东西来模拟分页事件。你可以提供一个例子吗?非常感谢先。
RaymondXie 2009-12-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zqz8859 的回复:]
可以尝试下以下方法:
HttpWebRequest中使用Post方法,
增加变量__EVENTTARGET=ctl00$ContentPlaceHolder1$AspNetPager1,__EVENTARGUMENT=页码

[/Quote]

请问你有现成的代码可供学习吗?多谢先。
zqz8859 2009-12-09
  • 打赏
  • 举报
回复
可以尝试下以下方法:
HttpWebRequest中使用Post方法,
增加变量__EVENTTARGET=ctl00$ContentPlaceHolder1$AspNetPager1,__EVENTARGUMENT=页码
mngzilin 2009-12-08
  • 打赏
  • 举报
回复
ctl00$ContentPlaceHolder1$AspNetPager1'

这是用了AspNetPager
RaymondXie 2009-12-08
  • 打赏
  • 举报
回复
我没什么经验,有没有现成的代码可以学习一下?非常感谢
igelf 2009-12-08
  • 打赏
  • 举报
回复
javascript:__doPostBack('ctl00$ContentPlaceHolder1$AspNetPager1','2')
这段就是postback啊.

62,254

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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