2011-06-07 77 views
9

我有一個ASPX頁面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() 

有關於這個話題,是有幫助的(如how to submit query to .aspx page in python)的幾個問題,但我卡在這一點,並尋求更多的幫助,如果這是可能的。

生成的html頁面說我可能需要登錄,但aspx頁面顯示在瀏覽器中,沒有任何登錄。

這裏是從信息的結果():

連接:關閉 日期:星期二,2011年6月7日17時05分26秒GMT 服務器:Microsoft-IIS/6.0 X供電,通過:ASP.NET X-AspNet-Version:2.0.50727 Cache-Control:private Content-Type:text/html;字符集= UTF-8 的Content-Length:1944年

+0

快速瀏覽一下,我沒有注意到你的代碼有什麼問題。 我試圖在瀏覽器(Firefox 4.0)中訪問該網站,並收到以下消息:'處理您的請求時發生錯誤。請重試(您可能需要重新登錄)。 ...' – Gregg 2011-06-07 17:24:22

+0

目標aspx頁面是否可以在會話中查找某些內容並跳出來,因爲它在執行發佈的請求中沒有aspnet會話Cookie? – ashelvey 2011-06-07 17:31:40

+0

感謝您的回答。我可以在瀏覽器中訪問該網站,因爲我追加了登錄信息,這裏我沒有包括這些信息。 是的,這似乎是asp.net和我的模擬瀏覽器之間的會話問題。 – user773328 2011-06-08 13:59:43

回答

2

我嘗試了機械化和urllib2,並更好地機械化處理cookie。我可以簡單地用機械化指定提交表單:

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

這是沒有必要手動複製發佈請求,在這種情況下機械化能夠處理依賴於JavaScript的一種形式。

7

ASP.Net使用安全功能,防止通過embedding specific information in it.

更可能與ViewState的篡改,服務器拒絕你的要求,因爲ViewState的正在被視爲被篡改。我不能絕對肯定地說,但ASP.Net有several security features這是內置在框架,可能會阻止直接發佈。

如果涉及到會話,那麼您還需要考慮這一點。要模擬瀏覽器在做什麼,您需要執行以下步驟:

  1. 請求該頁面。
  2. 將cookies的集合保存到變量中。
  3. 將ViewState提取到一個變量。
  4. 使用適當的表單值進行發佈,將保存的Cookie和ViewState信息與請求一起傳遞。

我知道很多工作,但不是太困難。同樣,這可能不是您問題的唯一來源,但值得一讀,以便開始排除故障。

+0

謝謝你的回答,我發現頁面在我的瀏覽器中過期並在某個時間後請求登錄,所以這可能部分通過向請求添加一個cookie來解決。如步驟2所述,您是否有關於如何將Cookie的集合保存到變量的提示? – user773328 2011-06-07 19:02:28

+0

在.Net中很容易,因爲有一個與HttpWebRequest對象關聯的CookiesCollection。不幸的是,我對Python的知識很少,但是我能夠蒐集這些資源:http://www.voidspace.org.uk/python/articles/cookielib.shtml – Josh 2011-06-07 19:36:05

+0

再次對不起,但我已經成功使用urllib2和cookielib使用同一個cookie向amazon.com等示例頁面發出多個請求。我也讀過你的鏈接,現在我正試圖理解如何進行第4步,將ViewState提取到一個變量中,我試圖在上面的代碼中進行操作。 – user773328 2011-06-08 14:15:55