簡體   English   中英

Python:登錄網站

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM