使用Python登陸網站

來源:互聯網
上載者:User
使用Python登陸網站

  對於大部分論壇,我們想要抓取其中的文章分析,首先需要登陸,否則無法查看。

  這是因為 HTTP 協議是一個無狀態(Stateless)的協議,伺服器如何知道當前請求串連的使用者是否已經登陸了呢?有兩種方式:

  1. 在URI 中顯式地使用 Session ID;
  2. 利用 Cookie,大概過程是登陸一個網站後會在本地保留一個 Cookie,當繼續瀏覽這個網站的時候,瀏覽器會把 Cookie 連同地址請求一起發送過去。

  Python 提供了相當豐富的模組,所以對於這種網路操作只要幾句話就可以完成。我以登陸 QZZN 論壇為例,事實上下面的程式幾乎所有的 PHPWind 類型的論壇都是適用的。

# -*- coding: GB2312 -*-

from urllib import urlencode
import cookielib, urllib2

# cookie
cj = cookielib.LWPCookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)

# Login
user_data = {'pwuser': '你的使用者名稱',
'pwpwd': '你的密碼',
'step':'2'
}
url_data = urlencode(user_data)
login_r = opener.open("http://bbs.qzzn.com/login.php", url_data)

  一些注釋:

  1. urllib2 顯然是比 urllib 進階一點的模組,裡麵包括了如何使用 Cookies。
  2. 在 urllib2 中,每個用戶端可以用一個 opener 來抽象,每個 opener 又可以增加多個 handler 來增強其功能。
  3. 在構造 opener 時指定了 HTTPCookieProcessor 做為 handler,因此這個 handler 支援 Cookie。
  4. 使用 isntall_opener 後,調用 urlopen 時會使用這個 opener。
  5. 如果不需要儲存 Cookie,cj 這個參數可以省略。
  6. user_data 存放的就是登陸所需要的資訊,在登陸論壇的時候把這個資訊傳遞過去就行了。
  7. urlencode 功能是把字典 user_data 編碼成"?pwuser=username&pwpwd=password"的形式,這樣做是為了使程式易讀一些。

  最後一個問題是,pwuser、pwpwd 這類的名字是從哪兒來的,這就要分析需要登陸的網頁了。我們知道,一般的登陸介面都是一個表單,節選如下:

<form action="login.php?" method="post" name="login" onSubmit="this.submit.disabled = true;">

<input type="hidden" value="" name="forward" />
<input type="hidden" value="http://bbs.qzzn.com/index.php" name="jumpurl" />

<input type="hidden" value="2" name="step" />
...
<td width="20%" onclick="document.login.pwuser.focus();"><input type="radio" name="lgt" value="0" checked />使用者名稱 <input type="radio" name="lgt" value="1" />UID</td>

<td><input class="input" type="text" maxLength="20" name="pwuser" size="40" tabindex="1" /> <a href="reg1ster.php">馬上註冊</a></td>

<td>密 碼</td>
<td><input class="input" type="password" maxLength="20" name="pwpwd" size="40" tabindex="2" /> <a href="sendpwd.php" target="_blank">找回密碼</a></td>

...
</form>

  從這裡可以看出,我們需要輸入的使用者名稱密碼對應的就是 pwuser 和 pwpwd,而 step 對應的則是登陸(這個是嘗試出來的)。

  注意到,這個論壇表單採用的是 post 方式,如果是 get 方式則本文的方法就需要變動一下,不能直接 open,而是應該首先 Request,然後再 open。更詳細的請看手冊...

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.