開始鏈家爬蟲的時候,了解到需要實現模擬登錄,不登錄不能爬取三個月之內的數據,目前暫未驗證這個說法是否正確,這一小節記錄一下利用瀏覽器(IE11)的開發者工具去分析模擬登錄網站(鏈家)的內部邏輯過程,花了一個周末的時間,部分問題暫未解決。
利用瀏覽器(IE11)的開發者工具,啟用網絡流量捕獲,在調試之前,先做一些配置上的準備工作:清除舊的cookie和緩存,禁用跳轉后清除日志(Firefox在開發工具的Settings設置中勾上啟用持續日志)。
首先簡要介紹一下模擬登錄網站的基本邏輯,模擬網站登錄需要知道,要向什么url地址,發送什么樣的數據,GET請求還是POST請求。GET請求從服務器請求數據,不需要post data,但是經常需要在url后面加上對應的query parameter,類似?para1=value1¶2=value2之類的形式,本質上有點類似于post data。POST請求需要提供對應的post data,對應工具中的Request Body。而剩下的,是設置發送請求時的相關參數,包括user-agent等,對應工具中的Request Headers。提交請求后,網站服務器返回Response Headers和Response Body。其中,還經常涉及到cookie信息,在發送前,準備好,發送給服務器,服務器返回的信息中,往往也包含更新后的cookie值。
總結一下,主要關注點:Request Headers、Request Body、Response Headers、Response Body、Cookie。
打開IE11后,調出工具,切換到網絡界面,打開鏈家,過濾HTML請求,可以看到,頁面跳轉到http://gz.lianjia.com/,服務器返回的Response Headers里面設置了一些cookie,如lianjia_ssid
和lianjia_uuid
。
點擊登錄,然后輸入用戶名和密碼,正常登錄。
找到登錄網站所涉及的最核心的地址,對于此,我們可以通過搜索在哪里發送了我們的密碼??梢钥吹?,和我們密碼相關的url地址為https://passport.lianjia.com/cas/login。即以后如果寫代碼,所要訪問的url地址,就是這個地址了。
分析所提交的數據(post data)中的參數和值,這就是模擬網站登錄的核心數據了,是在寫代碼時,對于url=https://passport.lianjia.com/cas/login提交POST請求時,要發送的一些參數和值。
username=XXXXXXXXXXXpassWord=XXXXXXXXXXverifycode=service=http%3A%2F%2Fgz.lianjia.com%2FisAjax=truecode=lt=LT-99999-9HQFRxGdmePMdsCSnTeH9h2ne26uQbnWqN2接下來,分析這些值是如何來的。例如lt值,搜索LT-99999,發現來自https://passport.lianjia.com/cas/PRelogin/loginTicket?
分析Cookie,在最核心的地址https://passport.lianjia.com/cas/login的Request Headers中,lianjia_ssid
、lianjia_uuid
和JsessionID
,其中lianjia_ssid
、lianjia_uuid
通過先訪問其他頁面獲取,現在接著去找名為JSESSIONID
的Cookie,是從哪里來的,所以,能想到的,就是先去搜索JSESSIONID
,搜索出來的第一個url地址是https://passport.lianjia.com/cas/prelogin/loginTicket?。很明顯,其就是我們所期望的,因為其中的JSESSIONID
是通過Set-Cookie所獲得的,是訪問服務器的某個地址https://passport.lianjia.com/cas/prelogin/loginTicket?,然后服務器所返回的Cookie值。
而對于模擬登錄網站中,所涉及的其他Cookie、其他參數的值,可參考上述的邏輯,去一點點分析,找到最終的某個值的來源,然后才能用程序模擬。
至此,對于想要模擬登錄鏈家的內部邏輯過程,基本上清楚了。
順序 | 訪問地址 | 訪問類型 | 發送的數據 | 需要獲得/提取的返回的值 |
---|---|---|---|---|
1 | http://gz.lianjia.com/ | GET | 無 | lianjia_ssid, lianjia_uuid |
2 | https://passport.lianjia.com/cas/prelogin/loginTicket? | GET | 無 | 從返回的html中提取lt值,需要驗證返回的Cookie中,是否包含JSESSIONID |
3 | https://passport.lianjia.com/cas/login | POST | post data,其中lt值是之前提取出來的 | 驗證返回的html和Cookie |
在通過Python實現的時候,利用如上的流程,發現實際上行不通,登錄失敗。這里提出幾個未解決的問題。
如何驗證模擬登錄網站已成功了呢?
按理,在通過最后一步訪問地址為https://passport.lianjia.com/cas/login時,帶上賬號、密碼、提取的lt值,已獲取JSESSIONID值的情況下,通過返回的html代碼或cookie值,是可以判斷模擬登錄網站已成功的,然而在進一步分析數據來源的時候,發現有一個lianjia_token
在登錄后的頁面經常出現,不知在模擬登錄過程中是否需要用到?是否需要獲取到lianjia_token
才算成功?也不知是如何得到的?和JS腳本是否有關系?
微信公眾號「數據分析」,分享數據科學家的自我修養,既然遇見,不如一起成長。
新聞熱點
疑難解答