爬蟲高級篇,教你如何抓取接口
今天要爬取目標網站是極簡壁紙,先放張圖,這就是咱們要爬取的首頁,html
因爲網站禁止了右擊—>檢查,F12,前端
選擇Elemets,隨便定位一張圖片試試,python
能夠看到,這是縮略圖,而咱們要爬取的是高清原圖,ajax
去Network查看,發現返回的html並無咱們想要圖片數據json
<div class="view-body" :class="{ 'view-body-classify':config.page.active == 'classify'}"> <div :id="'box_'+j.i" v-for="(j,index) in json.view" class="img-box"> <img :id="j.i" v-lazy="getUrl(j.i,j.t)" data-type="img-box" :data-index="index" v-if="j.t != 'ad'" :key="getUrl(j.i,j.t)" width="100%" alt="" @click="showFull(index)"> <img :id="j.i" src="img/ad.png" v-if="j.t == 'ad'" style="width:100%;z-index:-1000" alt="" transform="translate(-50%, -50%)" onload='loadAdsense("box",this)'> </div> <div v-if="config.page.active == 'like' && json.likes.length == 0" class="nolikemsg center"> <span> 您尚未收藏喜歡的圖片<br> 點擊圖片上的小紅心試試 <span class="heart iconfont iconheart"></span> </span> </div> </div>
顯然數據是經過js先成上去的,所以,接下來就是抓接口了,怎麼抓?後端
打開Network,刷新頁面,選擇XHR(過濾ajax請求),會發現有個getJson請求,點進去看看,這不就是咱們要的數據嗎?瀏覽器
有了數據,那就簡單了,只要朝getJson這個接口發送請求那不就能夠獲取數據了嗎,關鍵是如何發送請求,模擬請求的關鍵的參數,因此第一步,咱們應該看看請求有哪些參數,app
accept: */* accept-encoding: gzip, deflate, br accept-language: zh-CN,zh;q=0.9,en;q=0.8 access: e7809d01583f1f91da7ad087fd736c97e5df2780557bc50f54a4e80ba438cf9c cache-control: no-cache content-length: 30 content-type: application/json location: bz.zzzmh.cn origin: https://bz.zzzmh.cn pragma: no-cache referer: https://bz.zzzmh.cn/ sec-fetch-dest: empty sec-fetch-mode: cors sec-fetch-site: same-site sign: ea04368c4c168320af527f08a6501345 timestamp: 1603903026787 user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36
已過一步步測試發現sign參數只有在更換瀏覽器時改變,而access和timestamp每次都在變化,顯然timestamp表明時間戳,因此關鍵參數在與access,能夠猜測一下access應該是通過某種加密加密過的字符串,感受像是md5,那麼這該如何解決呢?cors
無論怎樣,先把access參數複製一下去全局搜索一下,發現沒有,那怎們辦啊?函數
既然前端沒有,那確定是js生成的,那麼接下來的思路就是尋找js代碼,該如何下手了?
觀察返回前端代碼,發現引用的js大都是cdn,顯然不會有核心邏輯。
進去看看
這即是js代碼,26行那一堆代碼是什麼,顯然不符合js語法,猜測應該是混淆了,爲何要混淆?答案很明顯(心中竊喜),看來方向找對了。
既然混淆了,那就應該解混淆,網上js在線解混淆的網站一堆,我就不示範了,不會就去百度。
獲得解混淆後的js代碼,搜索關鍵參數access,恍然大悟。
果真是md5加密沒錯,只要咱們模仿該加密方式,生成參數access,不就能夠向後端請求數據了嗎?
通過一番折騰,確實拿到數據,可這數據該怎麼用?
能夠發現前端圖片連接都是經過getUrl這個函數生成的,那麼咱們能夠去js中搜索看看,
果真在這了,if判斷猜測一下,應該一個是原圖一個是縮略圖的連接,按照該方法生成連接便可,大體思路就這了,博主已經碼不動了,若是以爲有用,點贊支持是我最大的動力!