将帖子请求提交到aspx页面

use*_*328 9 python asp.net httpwebrequest

我在https://searchlight.cluen.com/E5/CandidateSearch.aspx上有一个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()
Run Code Online (Sandbox Code Playgroud)

关于这个主题有几个问题是有用的(比如如何在python中向.aspx页面提交查询),但是如果可能的话,我会坚持这个并要求额外的帮助.

生成的html页面说我可能需要登录,但aspx页面显示在我的浏览器中而没有任何登录.

以下是info()的结果:

连接:关闭日期:2011年6月7日星期二17:05:26 GMT服务器:Microsoft-IIS/6.0 X-Powered-By:ASP.NET X-AspNet-版本:2.0.50727 Cache-Control:private Content-Type:为text/html; charset = utf-8内容长度:1944

Jos*_*osh 7

ASP.Net使用安全功能,通过在其中嵌入特定信息来防止篡改ViewState .

很可能,服务器拒绝您的请求,因为ViewState被视为被篡改.我不能绝对肯定地说这个,但是ASP.Net有一些内置在框架中的安全功能可能会阻止直接发布.

如果涉及会话,那么您还需要考虑到这一点.要模拟浏览器正在执行的操作,您需要执行以下步骤:

  1. 请求页面.
  2. 将cookie集合保存到变量中.
  3. 将ViewState提取为变量.
  4. 使用适当的表单值发布,同时传递已保存的Cookie和ViewState信息以及请求.

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


use*_*328 2

我尝试了 mechanize 和 urllib2,mechanize 处理 cookie 的效果更好。我只需使用 mechanize 指定即可提交表单:

    browser= mechanize.Browser()
    browser.select_form(form_name)
    browser.set_value("Page$Next", name="pagenumber")     
Run Code Online (Sandbox Code Playgroud)

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