爬蟲實戰篇(模擬登錄)---我們以模擬去哪兒網為例


(1)、登錄實質

互聯網上的部分網站需要登錄后方能訪問,當我們打開網頁並登錄,就會在客戶端生成Cookies(相當於個人身份證)信息,Cookies中包含了SessionId信息,登錄后的請求都會帶上Cookies發送給服務器,服務器會根據Cookies判斷出對應的SessionID,進而找到會話,從而判斷用戶是否師登錄狀態,從而是否給用戶響應。

(2)、什么是模擬登陸

答:讓機器模擬人在瀏覽器上的行為登錄網站

(3)、實現方式

1、使用虛擬的瀏覽器

步驟:請求登錄頁面的url----分析html中的表單數據----找到用戶名和密碼的輸入框----輸入自己的用戶名和密碼---模擬點擊登錄按鈕即可

2、分析登錄信息提交方式,利用瀏覽器cookie模擬登錄

步驟:分析網頁結構,確認登錄方式,如賬號密碼登錄或掃碼登錄----如是賬號密碼登錄,確認有無驗證碼及驗證碼接口----進行錯誤登錄嘗試,觀察登錄系統的傳碼方案,如賬號密碼是否加密,是否有加密,是否有額外參數需要尋找,登錄需要傳入的cookie---根據錯誤登錄的分析結果,尋找額外的參數和需要傳入的cookie來源和密碼加密函數---反復測試並編寫代碼

(4)、實例講解(模擬登錄去哪兒網)--這里我們用第二種實現方式

1、本節目標:模擬去哪兒網的登錄過程並抓取信息

2、環境准備:

requests + re 庫

3、知識儲備

cookie:用戶首次訪問一個域名時,服務器給用戶發送的數據,用來保持服務器與客戶端之間的狀態,這些數據即為cookie

session:另一種記錄客戶狀態的機制,不同於cookie保存於客戶機,它保存在服務器上,當客戶端瀏覽器訪問服務器時,服務器將客戶端的信息以某種形式記錄在服務器上,這就是session,而當客戶端再次發起請求,就會從該session中查找用戶的狀態

這里做個類比:我們將銀行比作服務器,而客戶端就是去銀行辦事的人員,cookie相當於我們去銀行辦事時攜帶的身份證,被用來確定用戶的身份,而session相當於銀行保存的客戶檔案用來核實客戶身份。

4、思路分析

(1)分析網頁登錄方式(這里我們使用chrome的無痕模式窗口   ctrl+shift+n),我們發現有三種方式:賬號密碼登錄、短信驗證碼登錄、掃碼登錄,這里我們采取賬號密碼登錄方式

(2)分析驗證碼接口

(3)嘗試錯誤登錄,查看請求頁面的form data ,構造請求函數,嘗試使用爬蟲進行登錄,發現報錯,通過分析我們發現需要傳入cookie的參數為QN1、QN25、QN271、_i、_vi、fid

(4)尋找cookie來源,借助chrome的開發者工具

(5)在session通過get請求添加需要的cookie,再次嘗試即可

5、代碼詳解:

首先獲取session--獲取cookies

 1 #author: "xian"
 2 #date: 2018/5/31
 3 
 4 import requests
 5 
 6 def get_start_session(): #獲取session
 7     s = requests.session()
 8     return s
 9 
10 def get_base_cookies(s): #得到基礎的cookies,這里使用session。get()發送請求,requests。get發送的請求互補干擾,相互獨立,而session.get發送的請求的cookie會自動合並
11     response = s.get('https://user.qunar.com/passport/login.jsp')
12     pass
13 
14 
15 if __name__ == '__main__':
16     session = get_start_session()
17     get_base_cookies(session)

進行斷點調試並輸出:

 接着:下載驗證碼圖片(在當前的目錄下新建一個img文件夾用來保存圖片)

1 def get_base_cookies(s):
2     response = s.get('https://user.qunar.com/passport/login.jsp')
3     get_image(s) #立即下載圖片
4 
5 def get_image(s):
6     response = s.get('https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a')
7 
8     with open('code1.png' , 'wb') as f:
9         f.write(response.content)

輸出:

接着:嘗試錯誤登錄,這次我們使用正確的驗證碼

 1 #定義登錄函數
 2 def login(s,username,password,code): #使用session發送請求,方便合並cookies,並傳入參數
 3 
 4     data = {
 5         'loginType': 0,
 6         'username': username,
 7         'password': password,
 8         'remember': 1,
 9         'vcode': code,
10     }
11 
12     url = 'https://user.qunar.com/passport/login.jsp'
13 
14 
15     response = s.post(url ,data = data ) #這里我們使用post發送請求

 最后:結合chrome補全cookies參數,這里我們只需保存有用的cookie即可

 1 def get_base_cookies(s):
 2     s.get('https://user.qunar.com/passport/login.jsp')
 3     get_image(s)
 4     s.get('https://user.qunar.com/passport/addICK.jsp?ssl')
 5     response = s.get('https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0')
 6 
 7     #獲取sessionid
 8     session_id = re.findall(r'sessionId=(.*?)&',response.text)
 9     session_id = session_id[0]  #脫殼操作
10 
11     #獲取fid
12     s.get('https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1527735086394&sessionId={}&domain=qunar.com&orgId=ucenter.login'.format(session_id))
13     s.cookies.update({'QN271':session_id})

(3)、完整代碼

 1 #author: "xian"
 2 #date: 2018/5/30
 3 import re
 4 import requests
 5 
 6 #使用requests庫的會話維持用法
 7 def start_get_session():
 8     s = requests.session()
 9     return s
10 
11 def get_base_cookies(s):
12     s.get('https://user.qunar.com/passport/login.jsp')
13     get_image(s)
14     s.get('https://user.qunar.com/passport/addICK.jsp?ssl')
15     response = s.get('https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0')
16 
17     #獲取sessionid
18     session_id = re.findall(r'sessionId=(.*?)&',response.text)
19     session_id = session_id[0]  #脫殼操作
20 
21     #獲取fid
22     s.get('https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1527735086394&sessionId={}&domain=qunar.com&orgId=ucenter.login'.format(session_id)) 
23 s.cookies.update({'QN271':session_id})
25
26
27
28 #獲取圖片
29 def get_image(s):
30   response = s.get('https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a&t=1527644979725') 
31
32
33  with open('./img/code.png','wb') as f:
34   f.write(response.content)
35
36
37 #登錄函數
38 def login(s,username,password,code):
39   data = {
40   'loginType': 0,
41   'username': username,
42   'password': password,
43   'remember': 1,
44   'vcode': code,
45    }
46
47   url = 'https://user.qunar.com/passport/loginx.jsp'
48   response = s.post(url,data = data)
49   print(response.text)
50   response = s.get('http://user.qunar.com/index/basic')
#模擬登錄后爬取該網頁
51   print(response.text)
52
53
54
55
#主函數
56 if __name__ == '__main__':
57   session = start_get_session()
58   get_base_cookies(session)
59   username = input('請輸入用戶名:')
60   password = input('請輸入密碼:')
61   code = input('請輸入驗證碼:')
62
63   login(session,username,password,code)

運行效果圖:

 


免責聲明!

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



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