cookielib和urllib2模塊相結合模擬網站登錄

1.cookielib模塊

cookielib模塊的主要作用是提供可存儲cookie的對象,以便於與urllib2模塊配合使用來訪問Internet資源。例如可以利用本模塊的CookieJar類的對象來捕獲cookie並在後續連接請求時重新發送。coiokielib模塊用到的對象主要有下面幾個:CookieJar、FileCookieJar、MozillaCookieJar、LWPCookieJar。其中他們的關係如下:

 

2.urllib2模塊

說到urllib2模塊最強大的部分絕對是它的opener,

urllib2模塊的 OpenerDirector 操作類。這是一個管理很多處理類(Handler)的類。而所有這些 Handler 類都對應處理相應的協議,或者特殊功能。分別有下面的處理類:

  • BaseHandler

  • HTTPErrorProcessor

  • HTTPDefaultErrorHandler

  • HTTPRedirectHandler

  • ProxyHandler

  • AbstractBasicAuthHandler

  • HTTPBasicAuthHandler

  • ProxyBasicAuthHandler

  • AbstractDigestAuthHandler

  • ProxyDigestAuthHandler

  • AbstractHTTPHandler

  • HTTPHandler

  • HTTPCookieProcessor

  • UnknownHandler

  • FileHandler

  • FTPHandler

  • CacheFTPHandler

cookielib模塊一般與urllib2模塊配合使用,主要用在urllib2.build_oper()函數中作爲urllib2.HTTPCookieProcessor()的參數。

由此可以使用python模擬網站登錄。

先寫個獲取CookieJar實例的demo:


 1 #!/usr/bin/env python 2 #-*-coding:utf-8-*- 3  4 import urllib 5 import urllib2 6 import cookielib 7  8 #獲取Cookiejar對象(存在本機的cookie消息) 9 cookie = cookielib.CookieJar()10 #自定義opener,並將opener跟CookieJar對象綁定11 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))12 #安裝opener,此後調用urlopen()時都會使用安裝過的opener對象13 urllib2.install_opener(opener)14 15 url = "http://www.baidu.com"   16 urllib2.urlopen(url)


 

然後寫個用POST方法來訪問網站的方式(用urllib2模擬一起post過程):


 1 #! /usr/bin/env python 2 #coding=utf-8 3  4 import urllib2 5 import urllib 6 import cookielib 7  8 def login(): 9     email = raw_input("請輸入用戶名:")10     pwd = raw_input("請輸入密碼:")11     data={"email":email,"password":pwd}  #登陸用戶名和密碼12     post_data=urllib.urlencode(data)   #將post消息化成可以讓服務器編碼的方式13     cj=cookielib.CookieJar()   #獲取cookiejar實例14     opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))15     #自己設置User-Agent(可用於僞造獲取,防止某些網站防ip注入)16     headers ={"User-agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1"}17     website = raw_input('請輸入網址:')18     req=urllib2.Request(website,post_data,headers)19     content=opener.open(req)20     print content.read()    #linux下沒有gbk編碼,只有utf-8編碼21 22 if __name__ == '__main__':23     login()


 

注意這個例子經過測試,發現只有人人網和開心網之類的網站可以,而像支付寶,百度網盤,甚至是我們學校的教務系統都不能成功登錄,就會顯示如下的報錯消息:


Traceback (most recent call last):
  File "login.py", line 23, in <module>
    login()
  File "login.py", line 19, in login
    content=opener.open(req)
  File "/usr/lib/python2.7/urllib2.py", line 406, in open
    response = meth(req, response)
  File "/usr/lib/python2.7/urllib2.py", line 519, in http_response    'http', request, response, code, msg, hdrs)
  File "/usr/lib/python2.7/urllib2.py", line 444, in error    return self._call_chain(*args)
  File "/usr/lib/python2.7/urllib2.py", line 378, in _call_chain
    result = func(*args)
  File "/usr/lib/python2.7/urllib2.py", line 527, in http_error_default    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
urllib2.HTTPError: HTTP Error 405: Method Not Allowed


可能是這些網站在編寫時不接受客戶端請求該方法,具體原因我也不知道爲什麼。而且這個程序不能自動通過有驗證碼驗證的網站,所以純粹學習它的原理吧。

然後放一下用python模擬登錄的幾個示例(轉自:http://www.nowamagic.net/academy/detail/1302882


#  -*- coding: utf-8 -*-# !/usr/bin/pythonimport urllib2import urllibimport cookielibimport re

auth_url = 'http://www.nowamagic.net/'home_url = 'http://www.nowamagic.net/';# 登陸用戶名和密碼data={    "username":"nowamagic",    "password":"pass"}# urllib進行編碼post_data=urllib.urlencode(data)# 發送頭信息headers ={    "Host":"www.nowamagic.net", 
    "Referer": "http://www.nowamagic.net"}# 初始化一個CookieJar來處理CookiecookieJar=cookielib.CookieJar()# 實例化一個全局openeropener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))# 獲取cookiereq=urllib2.Request(auth_url,post_data,headers)
result = opener.open(req)# 訪問主頁 自動帶着cookie信息result = opener.open(home_url)# 顯示結果print result.read()


1. 使用已有的cookie訪問網站

import cookielib, urllib2

ckjar = cookielib.MozillaCookieJar(os.path.join('C:\Documents and Settings\tom\Application Data\Mozilla\Firefox\Profiles\h5m61j1i.default', 'cookies.txt'))

req = urllib2.Request(url, postdata, header)

req.add_header('User-Agent', \ 
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(ckjar) )

f = opener.open(req) 
htm = f.read() 
f.close()

2. 訪問網站獲得cookie,並把獲得的cookie保存在cookie文件中


import cookielib, urllib2

req = urllib2.Request(url, postdata, header) 
req.add_header('User-Agent', \ 
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')

ckjar = cookielib.MozillaCookieJar(filename) 
ckproc = urllib2.HTTPCookieProcessor(ckjar)

opener = urllib2.build_opener(ckproc)

f = opener.open(req) 
htm = f.read() 
f.close()

ckjar.save(ignore_discard=True, ignore_expires=True)


3. 使用指定的參數生成cookie,並用這個cookie訪問網站


import cookielib, urllib2

cookiejar = cookielib.CookieJar()
urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
values = {'redirect':", 'email':'[email protected]', 
          'password':'password', 'rememberme':", 'submit':'OK, Let Me In!'}data = urllib.urlencode(values)

request = urllib2.Request(url, data)
url = urlOpener.open(request)print url.info()
page = url.read()

request = urllib2.Request(url)
url = urlOpener.open(request)
page = url.read()print page



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