向aspx页面提交POST请求

9 投票
2 回答
6112 浏览
提问于 2025-04-16 19:07

我有一个ASPX页面,地址是 https://searchlight.cluen.com/E5/CandidateSearch.aspx,上面有一个表单,我想提交这个表单并获取一些信息。

我使用Python的urllib和urllib2创建了一个POST请求,设置了正确的头信息和用户代理。但是,返回的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()

关于这个话题有很多相关的问题对我很有帮助(比如 如何在Python中提交查询到.aspx页面),但我现在卡住了,希望能得到更多的帮助,如果可以的话。

返回的HTML页面上说我可能需要登录,但这个aspx页面在我的浏览器中可以直接打开,没有任何登录要求。

以下是info()的结果:

连接: 关闭 日期: 2011年6月7日 星期二 17:05:26 GMT 服务器: Microsoft-IIS/6.0 X-Powered-By: ASP.NET X-AspNet-Version: 2.0.50727 缓存控制: 私有 内容类型: text/html; charset=utf-8 内容长度: 1944

2 个回答

7

ASP.Net有一个安全功能,可以防止对ViewState的篡改,它是通过在其中嵌入特定信息来实现的。

很可能,服务器拒绝了你的请求,因为它认为ViewState被篡改了。虽然我不能百分之百确定,但ASP.Net内置了几种安全功能,这些功能可能会阻止直接提交。

如果会话(session)有涉及的话,你也需要考虑这一点。为了模拟浏览器的行为,你需要按照以下步骤操作:

  1. 请求页面。
  2. 把收集到的cookies保存到一个变量中。
  3. 把ViewState提取到一个变量中。
  4. 使用适当的表单值进行提交,同时将保存的cookies和ViewState信息一起发送。

我知道这工作量不小,但其实也不是特别难。再说一次,这可能不是你问题的唯一来源,但了解这些内容是开始排查问题的好方法。

2

我试过使用mechanize和urllib2,发现mechanize对处理cookies更好。通过mechanize,我可以很简单地提交表单,方法是:

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

在这种情况下,我不需要手动复制发送请求的过程,mechanize能够处理那些依赖于javascript的表单。

撰写回答