asp.net - 抓取 ASP.net 网站 : Need to Page through a Gridview using Python Mechanize

标签 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 中取回数据并对其进行解析。

如有任何帮助,我们将不胜感激!

最佳答案

通过根据此处的答案构建 xmlhttprequest 来管理它:

Using Python and Mechanize to submit form data and authenticate

关于asp.net - 抓取 ASP.net 网站 : Need to Page through a Gridview using Python Mechanize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6332558/

相关文章:

asp.net - 尝试执行存储过程时出现无效的对象名称错误?

c# - 有更好的方法吗? ASP.NET/C#/代码隐藏

python - Pycharm 包含太多库

jquery - 如何从代码隐藏的页面方法更新 GridView?

c# - asp.net 中的 GridView 标题文本

android爆炸过渡不会爆炸GridView

asp.net - 使用 jQuery 在特定的 "ValidationGroup"中启用/禁用 asp.net 验证器控件?

asp.net - DataAnnotation [DataType(DataType.Date)] 使我的字段不必要地成为必填项

python - 如何将相对日期转换为绝对日期?

python - 将具有多索引的每日数据框转换为季度数据框