【问题标题】:Submitting a post request to an aspx page向 aspx 页面提交 post 请求
【发布时间】:2011-09-10 06:37:14
【问题描述】:

我在https://searchlight.cluen.com/E5/CandidateSearch.aspx 有一个ASPX 页面,上面有一个表单,我想提交并解析它以获取信息。

使用 Python 的 urllib 和 urllib2 我创建了一个带有正确标头和用户代理的发布请求。但生成的 html 响应不包含预期的结果表。是我误解了还是我遗漏了任何明显的细节?

    import urllib
    import urllib2

    headers = {
        'HTTP_USER_AGENT': 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.13)         Gecko/2009073022 Firefox/3.0.13',
        'HTTP_ACCEPT': 'text/html,application/xhtml+xml,application/xml; q=0.9,*/*; q=0.8',
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    # obtained these values from viewing the source of https://searchlight.cluen.com/E5/CandidateSearch.aspx
    viewstate = '/wEPDwULLTE3NTc4MzQwNDIPZBYCAg ... uJRWDs/6Ks1FECco='
    eventvalidation = '/wEWjQMC8pat6g4C77jgxg0CzoqI8wgC3uWinQQCwr/ ... oPKYVeb74='
    url = 'https://searchlight.cluen.com/E5/CandidateSearch.aspx'
    formData = (
        ('__VIEWSTATE', viewstate),
        ('__EVENTVALIDATION', eventvalidation),
        ('__EVENTTARGET',''),
        ('__EVENTARGUMENT',''),
        ('textcity',''),
        ('dropdownlistposition',''),
        ('dropdownlistdepartment',''),
        ('dropdownlistorderby',''),
        ('textsearch',''),
    )

    # change user agent
    from urllib import FancyURLopener
    class MyOpener(FancyURLopener):
        version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127         Firefox/2.0.0.11'

    myopener = MyOpener()

    # encode form data in post-request format
    encodedFields = urllib.urlencode(formData)

    f = myopener.open(url, encodedFields)
    print f.info()

    try:
      fout = open('tmp.htm', 'w')
    except:
      print('Could not open output file\n')

    fout.writelines(f.readlines())
    fout.close()

关于这个主题有几个问题很有帮助(例如how to submit query to .aspx page in python),但我坚持这一点,并在可能的情况下寻求更多帮助。

生成的 html 页面显示我可能需要登录,但 aspx 页面显示在我的浏览器中,无需任何登录。

以下是 info() 的结果:

连接:关闭 日期:格林威治标准时间 2011 年 6 月 7 日星期二 17:05:26 服务器:Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-版本:2.0.50727 缓存控制:私有 内容类型:文本/html;字符集=utf-8 内容长度:1944

【问题讨论】:

  • 快速浏览一下,我没有发现您的代码有任何问题。我尝试在浏览器(Firefox 4.0)中访问该网站并收到以下消息:An error has occurred in processing your request. Please try again (you may need to log back in). ...
  • 目标 aspx 页面是否会在会话中查找某些内容并因为在您执行帖子的请求中没有 aspnet 会话 cookie 而出错?
  • 感谢您的回答。我可以在我的浏览器中访问该站点,因为我附加了登录信息,但我没有在此处包含这些信息。是的,这似乎是 asp.net 和我的模拟浏览器之间的会话问题。

标签: asp.net python httpwebrequest


【解决方案1】:

ASP.Net 使用安全功能防止embedding specific information in it. 篡改 ViewState

很可能,服务器拒绝了您的请求,因为 ViewState 被视为已被篡改。我不能绝对肯定地说,但 ASP.Net 有 several security features 内置在框架中,可能会阻止直接发布。

如果完全涉及会话,那么您还需要考虑到这一点。要模拟浏览器正在做什么,您需要执行以下步骤:

  1. 请求页面。
  2. 将 cookie 集合保存到变量中。
  3. 将 ViewState 提取到一个变量中。
  4. 使用适当的表单值发布,将保存的 cookie 和 ViewState 信息与请求一起传递。

我知道很多工作,但不是太难。同样,这可能不是您问题的唯一来源,但值得一读以开始故障排除。

【讨论】:

  • 感谢您的回答,我看到该页面确实在我的浏览器中过期并在一段时间后请求登录,因此可以通过在请求中添加 cookie 来部分解决此问题。如步骤 2 中所述,您对如何将 cookie 集合保存到变量有任何提示吗?
  • 在 .Net 中这很容易,因为有一个 CookiesCollection 与 HttpWebRequest 对象相关联。不幸的是,我对 Python 的了解很少,但我能够找到这个资源:voidspace.org.uk/python/articles/cookielib.shtml
  • 再次打扰,但我已经成功地使用 urllib2 和 cookielib 使用相同的 cookie 向示例页面(例如 amazon.com)发出多个请求。我也阅读了您的链接,现在我正在尝试了解如何处理第 4 步,将 ViewState 提取到变量中,我尝试在上面的代码中执行此操作。
【解决方案2】:

我尝试了 mechanize 和 urllib2,mechanize 更好地处理 cookie。我可以通过使用 mechanize 指定来提交表单:

    browser= mechanize.Browser()
    browser.select_form(form_name)
    browser.set_value("Page$Next", name="pagenumber")     

没有必要手动复制发布请求,在这种情况下 mechanize 能够处理依赖于 javascript 的表单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 2012-09-07
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多