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

1.cookielib模塊

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

 

2.urllib2模塊

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

urllib2模塊的 OpenerDirector 操做類。這是一個管理不少處理類(Handler)的類。而全部這些 Handler 類都對應處理相應的協議,或者特殊功能。分別有下面的處理類:linux

  • BaseHandler
  • HTTPErrorProcessor
  • HTTPDefaultErrorHandler
  • HTTPRedirectHandler
  • ProxyHandler
  • AbstractBasicAuthHandler
  • HTTPBasicAuthHandler
  • ProxyBasicAuthHandler
  • AbstractDigestAuthHandler
  • ProxyDigestAuthHandler
  • AbstractHTTPHandler
  • HTTPHandler
  • HTTPCookieProcessor
  • UnknownHandler
  • FileHandler
  • FTPHandler
  • CacheFTPHandler

cookielib模塊通常與urllib2模塊配合使用,主要用在urllib2.build_oper()函數中做爲urllib2.HTTPCookieProcessor()的參數。web

由此可使用python模擬網站登陸。服務器

先寫個獲取CookieJar實例的demo:cookie

 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過程):dom

 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()

 

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

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/1302882post

#  -*- coding: utf-8 -*-
# !/usr/bin/python

import urllib2
import urllib
import cookielib
import 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來處理Cookie
cookieJar=cookielib.CookieJar()
# 實例化一個全局opener
opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookieJar))
# 獲取cookie
req=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':'abc@abc.com', 
          '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

另外,補充一下urllib2的方法:

1.geturl():

這個返回獲取的真實的URL,這個頗有用,由於urlopen(或者opener對象使用的)或許會有重定向。獲取的URL或許跟請求URL不一樣。

URL重定向(URL redirection,或稱網址重定向或網域名稱轉址),是指當使用者瀏覽某個網址時,將他導向到另外一個網址的技術。經常使用在把一串很長的網站網址,轉成較短的網址。由於當要傳播某網站的網址時,經常由於網址太長,很差記憶;又有可能由於換了網路的免費網頁空間,網址又必需要變動,不知情的使用者還覺得網站關閉了。這時就能夠用網路上的轉址服務了。這個技術使一個網頁是可藉由不一樣的統一資源定位符(URL)連結。

 

>>> import urllib2
>>> url = "http://www.baidu.com"
>>> req = urllib2.Request(url)
>>> response = urllib2.urlopen(req)
>>> response.geturl()
'http://www.baidu.com'
>>> print response.info()
Date: Fri, 28 Mar 2014 03:30:01 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=AF7C001FCA87716A52B353C500FC45DB:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: H_PS_PSSID=1466_5225_5288_5723_4261_4759_5659; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Expires: Fri, 28 Mar 2014 03:29:06 GMT
Cache-Control: private
Server: BWS/1.1
BDPAGETYPE: 1
BDQID: 0xea1372bf0001780d
BDUSERID: 0

 

咱們能夠經過urllib2 默認狀況下會針對 HTTP 3XX 返回碼自動進行 redirect 動做(URL重定向),無需人工配置。要檢測是否發生了 redirect 動做,只要檢查一下 Response 的 URL 和 Request 的 URL 是否一致就能夠了。

 

import urllib2
my_url = 'http://www.google.cn'
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirected

my_url = 'http://rrurl.cn/b1UZuP'
response = urllib2.urlopen(my_url)
redirected = response.geturl() == my_url
print redirected

 

Debug Log

使用 urllib2 時,能夠經過下面的方法把 debug Log 打開,這樣收發包的內容就會在屏幕上打印出來,方便調試,有時能夠省去抓包的工做

import urllib2
httpHandler = urllib2.HTTPHandler(debuglevel=1)
httpsHandler = urllib2.HTTPSHandler(debuglevel=1)
opener = urllib2.build_opener(httpHandler, httpsHandler)
urllib2.install_opener(opener)
response = urllib2.urlopen('http://www.google.com')

 

 

基本cookielib和urllib2結合就這些內容,請多多指教!

相關文章
相關標籤/搜索