刮刮ASP.net网站:需要使用Python Mechanize浏览Gridview

时间:2011-06-13 15:30:28

标签: asp.net python gridview screen-scraping mechanize

我正在尝试抓取一个asp.net页面,我需要在这些页面中查看gridview控件中的项目列表。我从来没有使用过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页。

我认为可能存在一些潜在的问题:

  1. 我不确定我是否正在提交权利。页面上有多个提交按钮,所以我要搜索的是“搜索”按钮,这是我以前用于访问第一页的按钮。我可以看到这就是显示第一页的原因。如果我使用没有名字的br.submit(),那么它会使用另一个提交控件,将你带到其他地方。

  2. 在浏览器中单击页码时,gridview控件会更新而不会重新加载页面。由于我没有运行Javascript,也许我无法理解,但我至少希望能够从POST中获取数据并解析它。

  3. 非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

通过在这里根据答案构建xmlhttprequest来管理它:

Using Python and Mechanize to submit form data and authenticate