[英]Python: Logging in to a website
我在stackoverflow的某個地方找到了此代碼以進行reddit。 我試圖為hackthissite.org修改它:
import urllib2
import urllib
import cookielib
# Store the cookies and create an opener to hold them
cj = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# Add our headers
opener.addheaders = [('User-agent', 'Tester')]
# Install the opener, changes the global opener to the one we just made
urllib2.install_opener(opener)
# URL for authentification
auth_url = 'https://www.hackthissite.org/user/login'
# Parameters to send
payload = {
'username': 'myUser',
'password': 'myPass',
'btn_submit': 'Login'
}
# Encode payload
data = urllib.urlencode(payload)
# Build request object (supplying 'data' makes it a POST)
req = urllib2.Request(auth_url, data)
# Make request and store in resp
resp = urllib2.urlopen(req)
print resp
據我所知,正確的有效負載是hackthissite.org上的登錄表單:
<form id="loginform" method="post" action="/user/login">
<div id="innerlogin">
<script type="text/javascript">var userclicked=0; var passclicked=0;</script>
<p><input type="text" name="username" class="login" value="" onclick="if(userclicked==0){this.value='';userclicked=1;};" title="Username" /></p>
<p><input type="password" name="password" class="login" value="" onclick="if(passclicked==0){this.value='';passclicked=1;};" title="Password" /></p>
<p><input type="submit" value="Login" name="btn_submit" class="submit-button" /></p>
</div>
</form>
我從服務器得到的響應是:
<addinfourl at 36515712 whose fp = <socket._fileobject object at 0x022D3DB0>>
如何登錄該網站? 在這種情況下,服務器響應是什么意思? (AddInfoUrl嗎?)
我強烈建議您只看一下機械化並使用它。 它使這種事情變得微不足道。 例如,這是您提到的網站的接口方式:
from mechanize import Browser
br = Browser()
br.open("https://www.hackthissite.org/user/login")
br.select_form(predicate=lambda f: f.attrs.get('action') == '/user/login')
br["username"] = "myUser"
br["password"] = "myPass"
response = br.submit()
print response.read()
更新:解釋這一行:
br.select_form(predicate=lambda f: f.attrs.get('action') == '/user/login')
select_form
可以使用nr
參數, name
參數或predicate
參數。 如果執行br.select_form(nr=1)
, br.select_form(nr=1)
選擇頁面上的第二種形式。 如果執行br.select_form(name="foobar")
, br.select_form(name="foobar")
選擇頁面上第一個名為“ foobar”的表單。 或者,您可以為其提供一個接受HTMLForm
對象的函數,並返回該函數是否應為要選擇的表單。
在上述情況下,我為它提供了一個函數,如果表單的"action"
屬性為"/user/login"
,則返回true。 如果您知道表單的名稱或其在文檔中的位置,那可能會更容易。
resp = urllib2.urlopen(req)
urlopen
返回一個“類似於文件”的對象,該對象實質上是一個可以從中讀取響應的句柄。 如果您只對服務器的響應文本感興趣,則可以在響應對象上調用read
:
print resp.read()
此外,您還可以使用一些額外的方法,例如info
,它可以為您提供有關響應頭的信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.