使用 Python 登錄網站

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

  這是因爲 HTTP 協議是一個無狀態(Stateless)的協議,服務器如何知道當前請求連接的用戶是否已經登錄了呢?有兩種方式:

    在URI 中顯式地使用 Session ID;
    利用 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)


  一些註釋:

    urllib2 顯然是比 urllib 高級一點的模塊,裏面包括瞭如何使用 Cookies。
    在 urllib2 中,每個客戶端可以用一個 opener 來抽象,每個 opener 又可以增加多個 handler 來增強其功能。
    在構造 opener 時指定了 HTTPCookieProcessor 做爲 handler,因此這個 handler 支持 Cookie。
    使用 isntall_opener 後,調用 urlopen 時會使用這個 opener。
    如果不需要保存 Cookie,cj 這個參數可以省略。
    user_data 存放的就是登錄所需要的信息,在登錄論壇的時候把這個信息傳遞過去就行了。
    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%" οnclick="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。更詳細的請看手冊...


原貼:http://www.cnblogs.com/huangcong/archive/2011/08/30/2160083.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章