websocket與爬蟲
背景
寫爬蟲的目的應該就是為了拿到數據,或者說模擬某種操作 如果他使用的是http(s) 協議來傳輸數據的,那麼我們就模擬http協議來發送數據 如果它使用的是websocket協議來傳輸數據的, 那麼我們理所當然的就模擬websocket來發送數據~
首先,我們需要了解什麼是websocket
websocket的介紹
WebSocket是一種在單個TCP連接上進行全雙工通訊的協議。WebSocket通信協議於2011年被IETF定為標準RFC 6455,並由RFC7936補充規範。WebSocket API也被W3C定為標準。
WebSocket使得客戶端和伺服器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在WebSocket API中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以創建持久性的連接,並進行雙向數據傳輸。
上面是維基百科的介紹. 簡單的將,websocket 和http一樣,都是一種網路傳輸協議
他比http協議好的地址有哪些呢?
較少的控制開銷。在連接創建後,伺服器和客戶端之間交換數據時,用於協議控制的數據包頭部相對較小。在不包含擴展的情況下,對於伺服器到客戶端的內容,此頭部大小只有2至10位元組(和數據包長度有關);對於客戶端到伺服器的內容,此頭部還需要加上額外的4位元組的掩碼。相對於HTTP請求每次都要攜帶完整的頭部,此項開銷顯著減少了。
伺服器響應
和http欄位不一樣的地方
可以看到只是在http協議上增加了幾個硬性規定,http協議的user-agent,cookie都可以在websocket握手過程中使用
抓包時候的注意事項:因為websocket只有一次握手,握手成功後就可以雙方發送消息了,假如你打開網頁後沒有找到你要抓的數據,那麼你就需要重新刷新網頁,讓他重新握手一次
websocket的事件on_open
表示剛剛連接的時候
onmessage
表示收到消息怎麼做
send
表示給伺服器發送消息
on_close
表示關閉連接
那麼知道了這些對我們有什麼好處么? 找js的時候會很好找,這幾個關鍵詞基本上都是固定的 你可以直接全局搜搜,然後很容易能找到發送的js代碼
模擬發送的時候也是一樣的.
實際案例
前面介紹了一堆websocket協議相關的東西,估計很多人已經暈了. 沒關係,先看實例,有問題再回到上面看
抓包可以使用fiddle,chrome也是可以的
我們先使用chrome
本次要抓的網站的一個投票網站 大家可以先隨便投一個票,抓抓包看看 會發現怎麼沒有找到他是如何提交數據的...
選擇ws,然後刷新下網頁,再點擊下投票,會發現有一個請求
可以看到是在握手階段,請求頭裡面的參數和我們上面講的是一樣的.
請求地址是 這邊順帶說一下,有時候這邊會看到 那麼這兩個有啥區別的,簡單的講就是http與https協議的區別一樣...
看一下交互的內容(點擊Frames) 可以看到已經有四條消息了,但是消息內容是二進位的,chrome這邊無法預覽... 那麼我們使用fiddle試一下
抓包與分析
打開fiddle,刷新一下網頁不刷新的話是看不到的,然後隨便投一下票.
怎麼找到請求呢,很簡單,看狀態碼為101的就行,然後雙擊這一行
然後這邊還是看到四條消息,我們點擊第一條,然後用 展示,可以看到消息是這些 為啥用 呢?其實是一個一個的試過來的,假如你發現都試過了,還是亂碼,那應該是他使用了其他的壓縮或者加密方法,需要查看js看看他是如何加密的
這個網站的數據是沒有加密過的. 帶向上的箭頭的是我們向伺服器發送的,向下的箭頭是伺服器返回的(下面的數據,前面帶黑點?,是我們發送的)
可以看出來 首先我們發送 然後伺服器返回一串信息給我們, 然後我們根據伺服器返回的算出一個值,也就是 再發送給伺服器. 伺服器返回 ,表示驗證通過 然後我們投票,發送了投票的一些信息給服務 伺服器告訴我們投票成功.
以上就是整個通訊過程.
那如果我們要模擬發送的話,需要知道哪些信息呢
itemid 就是你投票的公司的id,catid之前講過,captcha就是驗證碼,auth和上面的authtype一樣rnd是通過搜索js發現了.
再看看驗證碼是如何生成的呢
檢查驗證碼是否正確
我們已經拿到所有需要的東西了,只要用程序模擬發送就行了.
模擬發送
使用的包是websocket
官方demo
可以看到使用還是很簡單的,也是
所以我們只要用我們上面得到的信息就行模擬發送就可以了
因為是投票網站,所以不提供代碼...有啥問題,請留言~
TAG:Python爬蟲分享 |