《轉載》python爬蟲實踐之模擬登陸

有些網站設置了權限,只有在登陸了以後才能爬取網站的內容,如何模擬登陸,目前的方法主要是利用瀏覽器cookie模擬登陸。
 

瀏覽器訪問服務器的過程

 
在用戶訪問網頁時,不管是經過URL輸入域名或IP,仍是點擊連接,瀏覽器向WEB服務器發出了一個HTTP請求(Http  Request),WEB服務器接收到客戶端瀏覽器的請求以後,響應客戶端的請求,發回相應的響應信息(Http Response),瀏覽器解析引擎,排版引擎分析返回的內容,呈現給用戶。WEB應用程序在於服務器交互的過程當中,HTTP請求和響應時發送的都是一個消息結構。
 

 

Http消息

 
當瀏覽器向服務器發送請求的時候,發出http請求消息報文,服務器返回數據時,發出http響應消息報文,這兩種類型的消息都是由一個起始行,消息頭,一個指示消息頭結束的空行和可選的消息體組成。http請求消息中,起始行包括請求方法,請求的資源, HTTP協議的版本號,消息頭包含各類屬性,消息體包含數據,GET請求並無消息主體,所以在消息頭後的空白行中沒有其餘數據。Http響應消息中,起始行包括HTTP協議版本,http狀態碼和狀態,消息頭包含各類屬性,消息體包含服務器返回的數據內容。
 
 
以下圖從fiddler抓取的http請求和http響應,GET請求內容爲空,故消息頭以後的空行和消息體都爲空。
 
 
服務器發送的響應消息以下,瀏覽器正常接收到服務器發回的http報文
 
從上能夠看到,cookie在http請求和http響應的頭信息中,cookie是消息頭的一種很重要的屬性。
 

什麼是Cookie?

  
       當用戶經過瀏覽器首次訪問一個域名時,訪問的WEB服務器會給客戶端發送數據,以保持WEB服務器與客戶端之間的狀態保持,這些數據就是Cookie,它是 Internet 站點建立的 ,爲了辨別用戶身份而儲存在用戶本地終端上的數據,Cookie中的信息通常都是通過加密的,Cookie存在緩存中或者硬盤中,在硬盤中的是一些小文本文件,當你訪問該網站時,就會讀取對應網站的Cookie信息,Cookie有效地提高了咱們的上網體驗。通常而言,一旦將 Cookie 保存在計算機上,則只有建立該 Cookie 的網站才能讀取它。
 
 

爲何須要Cookie

 
       Http協議是一個無狀態的面向鏈接的協議,Http協議是基於tcp/ip協議層之上的協議,當客戶端與服務器創建鏈接以後,它們之間的TCP鏈接一直都是保持的,至於保持的時間是多久,是經過服務器端來設置的,當客戶端再一次訪問該服務器時,會繼續使用上一次創建的鏈接,可是,因爲Http協議是無狀態的,WEB服務器並不知道這兩個請求是否同一個客戶端,這兩次請求之間是獨立的。 爲了解決這個問題, Web程序引入了Cookie機制來維護狀態.cookie能夠記錄用戶的登陸狀態,一般web服務器會在用戶登陸成功後下發一個簽名來標記session的有效性,這樣免去了用戶屢次認證和登陸網站。記錄用戶的訪問狀態。
 

Cookie的種類

 
       會話Cookie(Session Cookie):這個類型的cookie只在會話期間內有效,保存在瀏覽器的緩存之中,用戶訪問網站時,會話Cookie被建立,當關閉瀏覽器的時候,它會被瀏覽器刪除。 
持久Cookie(Persistent Cookie): 這個類型的cookie長期在用戶會話中生效。當你設置cookie的屬性Max-Age爲1個月的話,那麼在這個月裏每一個相關URL的http請求中都會帶有這個cookie。因此它能夠記錄不少用戶初始化或自定義化的信息,好比何時第一次登陸及弱登陸態等。 
Secure cookie:安全cookie是在https訪問下的cookie形態,以確保cookie在從客戶端傳遞到Server的過程當中始終加密的。
HttpOnly Cookie :這個類型的cookie只能在http(https)請求上傳遞,對客戶端腳本語言無效,從而有效避免了跨站攻擊。 
第三方cookie: 第一方cookie是當前訪問的域名或子域名下的生成的Cookie。
第三方cookie:第三方cookie是第三方域名建立的Cookie。 
 

Cookie的構成

 
      Cookie是http消息頭中的一種屬性,包括:Cookie名字(Name)Cookie的值(Value),Cookie的過時時間(Expires / Max-Age),Cookie做用路徑(Path),Cookie所在域名(Domain),使用Cookie進行安全鏈接(Secure)。
前兩個參數是Cookie應用的必要條件,另外,還包括Cookie大小(Size,不一樣瀏覽器對Cookie個數及大小限制是有差別的)。
 

python模擬登陸

 
設置一個cookie處理對象,它負責 將cookie添加到http請求中,並能從http響應中獲得cookie , 向網站登陸頁面發送一個請求Request, 包括登陸url,POST請求的數據,Http header 利用urllib2.urlopen發送請求,接收WEB服務器的Response。
首先咱們查看登錄頁面源碼
 
 
當咱們使用urllib處理url的時候,其實是經過urllib2.OpenerDirector實例進行工做,他會本身調用資源進行各類操做如經過協議、打開url、處理cookie等。而urlopen方法使用的是默認的opener來處理問題,基本的urlopen()函數不支持驗證、cookie或其餘的HTTP高級功能。要支持這些功能,必須使用build_opener()函數來建立本身的自定義Opener對象。
 
cookielib模塊定義了自動處理HTTP cookies的類,用來訪問那些須要cookie數據的網站,cookielib模塊包括CookieJar,FileCookieJar,CookiePolicy,DefaultCookiePolicy,Cookie及FileCookieJar的子類MozillaCookieJar和LWPCookieJar,CookieJar對象能夠管理HTTP cookies,將cookie添加到http請求中,並能從http響應中獲得cookie,FileCookieJar對象主要是從文件中讀取cookie或建立cookie,其中,MozillaCookieJar是爲了建立與Mozilla瀏覽器cookies.txt兼容的FileCookieJar實例,LWPCookieJar是爲了建立與libwww-perl的Set-Cookie3文件格式兼容的FileCookieJar實例,用LWPCookieJar保存的cookie文件易於人類閱讀。默認的是FileCookieJar沒有save函數,而MozillaCookieJar或LWPCookieJar都已經實現了。 因此能夠用MozillaCookieJar或LWPCookieJar,去自動實現cookie的save。 
 
[python] view plain copy
  1. #! /usr/bin/env python  
  2. #coding:utf-8  
  3.   
  4. import sys  
  5. import re  
  6. import urllib2  
  7. import urllib  
  8. import requests  
  9. import cookielib  
  10.   
  11. ## 這段代碼是用於解決中文報錯的問題    
  12. reload(sys)    
  13. sys.setdefaultencoding("utf8")    
  14. #####################################################  
  15. #登陸人人  
  16. loginurl = 'http://www.renren.com/PLogin.do'  
  17. logindomain = 'renren.com'  
  18.   
  19. class Login(object):  
  20.       
  21.     def __init__(self):  
  22.         self.name = ''  
  23.         self.passwprd = ''  
  24.         self.domain = ''  
  25.   
  26.         self.cj = cookielib.LWPCookieJar()              
  27.         self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cj))   
  28.         urllib2.install_opener(self.opener)      
  29.       
  30.     def setLoginInfo(self,username,password,domain):  
  31.         '''''設置用戶登陸信息'''  
  32.         self.name = username  
  33.         self.pwd = password  
  34.         self.domain = domain  
  35.   
  36.     def login(self):  
  37.         '''''登陸網站'''  
  38.         loginparams = {'domain':self.domain,'email':self.name, 'password':self.pwd}  
  39.         headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36'}  
  40.         req = urllib2.Request(loginurl, urllib.urlencode(loginparams),headers=headers)    
  41.         response = urllib2.urlopen(req)  
  42.         self.operate = self.opener.open(req)  
  43.         thePage = response.read()          
  44.           
  45. if __name__ == '__main__':     
  46.     userlogin = Login()  
  47.     username = 'username'  
  48.     password = 'password'  
  49.     domain = logindomain  
  50.     userlogin.setLoginInfo(username,password,domain)  
  51.     userlogin.login()  
相關文章
相關標籤/搜索