2011-10-12 54 views
3

試圖用Python刪除網站上的內容,該用戶名和密碼具有簡單的表單身份驗證,但也有一個名爲「箔」的隱藏字段,其中包含看起來像每次頁面加載時隨機生成的字符串。爲了成功登錄,該值必須包含在帖子的內容標題中。我試圖在登錄頁面加載後刪除隨機字符串,但仍然將我重定向回登錄。我的網站有一個有效的用戶名和密碼,但它是零星更新的,我想在發生變化時向我發送電子郵件。這裏是代碼我一直使用至今...Python Post與反刮擦保護形成

import urllib, urllib2, cookielib,subprocess 

url='https://example.com/login.asp' 

username='blah' 
password='blah' 

request = urllib2.Request(url) 
opener = urllib2.build_opener(urllib2.HTTPHandler(debuglevel=1)) 
preData = opener.open(request).readlines() 
for line in preData: 
    if("foil" in line): 
     foils = line.split('"') 
     notFoiled = foils[3] 

query_args={'location':'','qstring':'','absr_ID':notFoiled,'id':username,'pin':password,'submit':'Sign In'} 
requestWheader = urllib2.Request('https://example.com/login.asp') 
requestWheader.add_data(urllib.urlencode(query_args)) 
print 'Request method after data :', requestWheader.get_method() 

print 
print 'OUTGOING DATA:' 
print requestWheader.get_data() 

print 
print 'SERVER RESPONSE:' 
print urllib2.urlopen(requestWheader).read() 
rawRes = urllib2.urlopen(requestWheader).read() 

的形式看起來像這樣...

<form name="loginform" method="post" action="https://example.com/login.asp?x=x&amp;&amp;pswd="> 
<input type=hidden name="location" value=""> 
<input type=hidden name="qstring" value=""> 
<input type=hidden name="absr_ID" value=""> 
<input type=hidden name="foil" value="91fcMO"> 
<input type="text" name="id" maxlength="80" size="21" value="" mask="" desc="ID" required="true"> 
<input type="submit" name="submit" value="Sign In" onClick="return checkForm(loginform)"> 
<input type="password" name="pin" size="6" maxlength="6" desc="Pin" required="true"> 
+0

爲什麼你不傳遞查詢字符串? –

+0

requestWheader.add_data(urllib.urlencode(query_args)) - >這不會傳遞查詢字符串嗎? – adam0101

+0

嗯,沒有。查詢字符串是URL的一部分。 –

回答

2

您導入cookielib但它似乎並不像你使用任何CookieJar S:

jar = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(jar)) 

然後使用相同的開罐器兩個初始形式獲取和登錄表單提交。我認爲這是一個基於cookie的保護,其中來自foil字段的值必須與來自標頭的cookie相匹配。

我在代碼中注意到的另一件事是,您將notFoiled指定爲absr_ID而不是foil。那是故意的嗎?

另請自己動手,並使用html5libBeautifulSoup而不是手動解析HTML。