用Python Mechanize抓取ASP.net网站:如何在Gridview中分页

2 投票
1 回答
1984 浏览
提问于 2025-04-16 19:28

我正在尝试抓取一个asp.net页面,这个页面里有一个网格视图控件,里面列出了很多项目,我需要翻页查看这些项目。我之前从来没有用过asp.net,但我在网上找了一些资料,现在遇到了一些困难。这个页面的链接格式是:

javascript:__doPostBack('ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems','Page$2')

我现在正在用Python中的Mechanize库来实现这个功能。一开始我以为VIEWSTATE这些变量会被mechanize自动处理,所以我尝试了以下代码:

br.form.set_all_readonly(False)
br['__EVENTTARGET'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTARGUMENT'] = 'Page$2'
response = br.submit(name="ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$itemLocator$btnItemSearch")
html = br.response().read()

通过使用网络监控工具(Fiddler2),我发现还有两个变量被填充了,所以我也把这两个变量加上了:

br.select_form(nr=0)
br.form.new_control('hidden','ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1',attrs = dict(name='ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1'))
br.form.new_control('hidden','hiddenInputToUpdateATBuffer_CommonToolkitScripts',attrs = dict(name='hiddenInputToUpdateATBuffer_CommonToolkitScripts'))
br.form.new_control('hidden','__ASYNCPOST',attrs = dict(name='__ASYNCPOST'))
br.form.set_all_readonly(False)
br['hiddenInputToUpdateATBuffer_CommonToolkitScripts'] = '1'
br['__ASYNCPOST'] = 'TRUE'
br['ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ScriptManager1'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$SearchResultsUpdatePanel|ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTTARGET'] = 'ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$gridViewItems'
br['__EVENTARGUMENT'] = 'Page$2'
response = br.submit(name="ctl00$ctl00$ctl00$ContentPlaceHolderEverything$ContentPlaceHolderFullWidthContent$ContentPlaceHolderMain$itemLocator$btnItemSearch")
html = br.response().read()

但是即使加上这两个变量,我得到的HTML内容仍然只显示第一页。

我觉得可能有几个问题:

  1. 我不太确定我提交的方式对不对。页面上有多个提交按钮,我要找的是“搜索”按钮,这个按钮是我之前用来获取第一页的。如果我用br.submit()而不指定按钮的名字,它会使用另一个提交控件,导致我跳转到其他地方,这可能就是为什么只显示第一页的原因。

  2. 在浏览器中点击页码时,网格视图控件会更新,而不需要重新加载页面。因为我没有运行JavaScript,所以可能无法获取这个更新,但我至少希望能从POST请求中获取数据并解析它。

如果有人能提供帮助,我将非常感激!

1 个回答

1

我通过根据这里的回答创建了一个xmlhttprequest来实现这个功能:

使用Python和Mechanize提交表单数据并进行身份验证

撰写回答