Python 登錄網(wǎng)站詳解及實(shí)例
對(duì)于大部分論壇,我們想要抓取其中的帖子分析,首先需要登錄,否則無法查看。
這是因?yàn)?HTTP 協(xié)議是一個(gè)無狀態(tài)(Stateless)的協(xié)議,服務(wù)器如何知道當(dāng)前請(qǐng)求連接的用戶是否已經(jīng)登錄了呢?有兩種方式:
- 在URI 中顯式地使用 Session ID;
-
利用 Cookie,大概過程是登錄一個(gè)網(wǎng)站后會(huì)在本地保留一個(gè) Cookie,當(dāng)繼續(xù)瀏覽這個(gè)網(wǎng)站的時(shí)候,瀏覽器會(huì)把 Cookie 連同地址請(qǐng)求一起發(fā)送過去。
Python 提供了相當(dāng)豐富的模塊,所以對(duì)于這種網(wǎng)絡(luò)操作只要幾句話就可以完成。我以登錄 QZZN 論壇為例,事實(shí)上下面的程序幾乎所有的 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 高級(jí)一點(diǎn)的模塊,里面包括了如何使用 Cookies。
- 在 urllib2 中,每個(gè)客戶端可以用一個(gè) opener 來抽象,每個(gè) opener 又可以增加多個(gè) handler 來增強(qiáng)其功能。
- 在構(gòu)造 opener 時(shí)指定了 HTTPCookieProcessor 做為 handler,因此這個(gè) handler 支持 Cookie。
- 使用 isntall_opener 后,調(diào)用 urlopen 時(shí)會(huì)使用這個(gè) opener。
- 如果不需要保存 Cookie,cj 這個(gè)參數(shù)可以省略。
- user_data 存放的就是登錄所需要的信息,在登錄論壇的時(shí)候把這個(gè)信息傳遞過去就行了。
-
urlencode 功能是把字典 user_data 編碼成"?pwuser=username&pwpwd=password"的形式,這樣做是為了使程序易讀一些。
最后一個(gè)問題是,pwuser、pwpwd 這類的名字是從哪兒來的,這就要分析需要登錄的網(wǎng)頁了。我們知道,一般的登錄界面都是一個(gè)表單,節(jié)選如下:
從這里可以看出,我們需要輸入的用戶名密碼對(duì)應(yīng)的就是 pwuser 和 pwpwd,而 step 對(duì)應(yīng)的則是登錄(這個(gè)是嘗試出來的)。
注意到,這個(gè)論壇表單采用的是 post 方式,如果是 get 方式則本文的方法就需要變動(dòng)一下,不能直接 open,而是應(yīng)該首先 Request,然后再 open。更詳細(xì)的請(qǐng)看手冊(cè)...
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
