可登陸爬蟲Python實現


    最近期末測試完結了,正好恰逢周末,就想找點事來做,之前做過爬蟲,遇到了登錄的問題,今天就來整理下。
    登錄問題其實就是程序發送請求,服務器返回數據時,發出http響應消息報文,這兩種類型的消息都是由一個起始行,而cookie就在在http請求和http響應的頭信息中,在請求中添加用戶信息的cookie即可實現登錄。於是乎cookie是消息頭的一種很重要的屬性。

什么是Cookie?


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

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。

python模擬登錄

 首先查看所要爬取網站登錄源碼:(豆瓣為例)

 
    看了這些之后,我們只用按照登錄網址所需信息添加到post中就行。
添加所需的包。
   
   
  
  
          
1
2
3
4
5
import  requests
import  re
from  bs4  import  BeautifulSoup
import  random
import  urllib, urllib2
信息添加到post中
   
   
  
  
          
1
2
3
4
5
6
7
8
9
10
11
headers  =  { 'User-Agent' :'Mozilla / 5.0  (Windows NT  6.1 ; WOW64)\
AppleWebKit / 537.36  (KHTML, like Gecko) Chrome / 41.0 . 2272.118  Safari / 537.36 ',}
 
my_post  =  { 'redir' : 'http://www.douban.com/doumail' ,
     'form_email' : '*@qq.com' ,
     'form_password' : 'password' ,
     'login' : '登錄' ,
     }
=  requests.post(login_url, data  =  my_post, headers  =  headers)
html  =  r.text
因為豆瓣登錄需要驗證碼,但是本人並沒有做過圖像中驗證碼識別,於是直接正則匹配圖片下載到本地,然后手工讀取,在輸入:
    
    
   
   
           
1
2
3
4
5
6
7
'''  download captcha  '''
reg  =  r '<img id="captcha_image" src="(.*?)" alt="captcha" class="captcha_image"/>'
imglist  =  re.findall(reg, html)
urllib.urlretrieve(imglist[ 0 ],  '%d.jpg'  %  random.randint( 1 , 100 ))
captcha  =  raw_input ( 'captcha is: ' )
regid  =  r '<input type="hidden" name="captcha-id" value="(.*?)"/>'
ids  =  re.findall(regid, html)
再次發送
   
   
  
  
          
1
2
3
4
5
''' repost  '''
my_post[ "captcha-solution" =  captcha
my_post[ "captcha-id" =  ids[ 0 ]
=  requests.post(login_url, data  =  my_post, headers  =  headers)
print  q.url
 
        
如果登錄成功,返回的URL就是:http://www.douban.com/doumail/,然后就可以正在獲得用戶信息了。
   
   
  
  
          
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
''' use bs4 filter douban.com's doumail following'''
if  q.url  = =  "http://www.douban.com/doumail/" :
     print  " login successfully!"
     soup  =  BeautifulSoup(q.text)
     tag  =  soup.find_all( 'span' , attrs = { 'class' : 'from' })
     tag2  =   soup.find_all( 'a' , attrs = { 'class' : 'url' })
     =  []
     for  in  tag:
         a.append(x.get_text())
     =  []
     for  in  tag2:
         b.append(y.get_text())
 
     def  split(num):
         print  a[num]  +  '  '  +   b[num]
         print 
                     
     print  '-' * 30 , u '豆瓣豆郵' '-' * 30
     for  in  range ( len (a)):
         split(x)
     print  '-' * 80
其實有很多種方法都可以實現,這只是一種,我也是在探索,希望和我一樣的人可以一起探討,請多多指教。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM