一、首先是微信電競,就是微信小程序里面的,本來看這是一個小程序,感覺應該很好爬。但是在實際爬取的時候,出現了一些問題,最終沒有爬取成功,主要總結自己在爬取過程中所做的事情和策略。
首先因為是小程序,所以第一個方法是用fiddler抓取請求,這個過程順利,很快就找到了拉取信息的請求鏈接。
"https://game.weixin.qq.com/cgi-bin/videoareawap/gametag?session_id="+session_id
其中session_id是一段時間內,每次請求都不會變的。所以直接通過fiddler抓取就可以了,然后formdata是:?{"is_preview":False,"game_app_id":"wx95a3a4d7c627e07d","data_type":0,"page_idx":0,"target_video_id":0}
通過這個請求,很順利的就拿到了數據:
所要抓取的數據內容都是視頻,所以所有信息都在這里可以獲取到。然后就是要找分頁的方式。結果在這里卡住,因為沒有在返回也找到任何翻頁的字段,重復請求的時候發現請求的數據是相同的。所以只能考慮實現翻頁機制有幾種可能。(1)本身是沒有翻頁機制的,每次請求都是相當于一次刷新,后臺記錄請求狀態,自動刷新推送新的內容給前端。(2)前端通過另外一條請求,刷新數據,然后再次請求,得到新的數據。
簡而言之就是前端肯定會有一條請求是告訴后臺要刷新數據的,通過這個邏輯,我找到前端向后臺請求的所有url,逐一進行分析。
"https://game.weixin.qq.com/cgi-bin/videoareawap/videolist?session_id="+session_id
第一個是這個,解析之后發現這是將視頻信息打包向后臺請求的,并不知道這是什么操作。請求之后并沒有刷新請求數據。
"https://game.weixin.qq.com/cgi-bin/comm/videostat?session_id="+session_id
第二個是這個,上面的請求是向后端發送多條視頻信息,這條請求則是發送單條視頻信息。依然不知道有什么卵用。
https://game.weixin.qq.com/cgi-bin/comm/pagestat?op=batch&session_id="+session_id
formdata 是:#msg ="GameId=wx95a3a4d7c627e07d&SceneId=3&UIArea=304&PositionId=1&ActionId=3&SsId=1089&GiftId=0&GeneralID=wx95a3a4d7c627e07d&VideoQuality=0&Type=13&TypeId=1&VideoID="+str(videoid)+"&Time=0&Videotime="+str(videotime)+"&depth=0&AnchorType=0&Device=2&ClientVersion=6703&ConnectType=0&SourceID=0&sdkVersion=2404&DeviceBrand=HONOR&DeviceModel=KNT-AL20&ExternInfo=%7B%7D&extVersion=0&devInfo=&Abt=0"
第三條是這個,這條可能行最大,因為有pagestat這個關鍵字,重點研究了一下這個請求,通過拼接等方法嘗試之后,發現依然不行。
還有其他請求,但明確知道其用途,不單獨理出。
?????? 所以感覺此方法行不通,就想嘗試用新的方法。希望能夠獲取小程序前端源碼進行分析。而小程序前端前端源碼是經過編譯之后上線的,同時如何獲取小程序源碼,就成了問題。經過百度發現,還真有方法。
?????? 簡單點說,小程序源文件其實就存在手機里面,但是這個目錄正常進入是找不到的。基本所有手機都會將系統目錄設置成不可見,用root 也不行。所以就考慮可以使用手機模擬器的方式進行查詢。
?????? 這里使用了夜神手機模擬器,
模擬登陸微信之后,點開微信電競小程序,但是程序沒有打開,總是閃退,程序沒有運行成功。然后我再進入
/data/data/com.tencent.mm/MicroMsg/{一串16進制字符}/appbrand/pkg/
這個目錄,過然發現有xxxx.wxapkg文件。
然后就是想辦法拷貝出來,用夜神自帶的文件管理器拷貝,總會出現權限問題,按照網上說法通過qq文件管理系統傳輸發現也無法拿到。然后再找其他途徑,最后發現,用re文件管理器(分兩種,要選擇藍色的確定帶root權限的那種),通過root權限配合qq就能夠拿到文件,
拷貝出來之后,就要做反編譯的事情。
?????? 網上只有一個大神寫了一套微信反編譯的工具,看了一下,部分網友反編譯之后過然成功了,所以我把代碼clone下來進行嘗試。
結果是出現報錯,然后我通過報錯信息去找對應文件的內容。連$gwx都沒有找到,請教身邊前端同事,他們也沒辦法找出問題所在。
?????? 但是好在有目錄生成。
????????把這個目錄拷貝下來,放到微信web開發者工具中運行。然后出現報錯,
請教前端同事,是不是一個小程序可能存在多個源文件,同事回答說是的。
然后問題就回到了最開始的微信電競運行沒有運行起來的問題,猜測可能就是因為沒有加載到更多的源文件倒是啟動失敗。
至此,能嘗試的爬取策略都嘗試過了,考慮到就算爬下來,整個視頻資訊內容也才1800+條,所以決定放棄爬取。
二、然后就是爬取王者營地的資訊。手機app的,這個爬取的時候,比我想象的又要順利很多,同樣是使用fiddler,抓取請求,查看返回內容。
https://ssl.kohsocialapp.qq.com:10001/game/listinfov2
首先通過這個鏈接,可以獲取文章列表,
而formdata 直接抄取:
{"gameId":"20001","pos1":1,"page":page,"feedNum":"0","type":"25818","cChannelId":"3","cClientVersionCode":"2018122401","cClientVersionName":"3.41.202","cCurrentGameId":"20001","cDeviceCPU":"armeabi-v7a$armeabi","cDeviceId":"8c8aa874108e85574768a5c85d8fbcfcc24c061d","cDeviceImei":"862537035682515","cDeviceMac":"02:00:00:00:00:00","cDeviceMem":"55505","cDeviceModel":"KNT-AL20","cDeviceNet":"WIFI","cDevicePPI":"640","cDeviceSP":"中國聯通","cDeviceScreenHeight":"2416","cDeviceScreenWidth":"1440","cGameId":"20001","cGzip":"1","cRand":"1546950860974","cSystem":"android","cSystemVersionCode":"26","cSystemVersionName":"8.0.0","gameAreaId":"0","gameId":"20001","gameServerId":"0","gameUserSex":"0","token":"9F8xsuAW","userId":"541905524"}
就可以了,很容易看到里面的相關信息所代表的意思,通過page進行翻頁操作,模擬請求之后,過然獲取到了文章列表。然后就是單頁面數據請求
視頻在文章列表里就能夠請求到vid,title,閱讀量,評論量和喜歡數,所以很簡單的就請求到了所有的數據。文章則可以通過url:
https://ssl.kohsocialapp.qq.com:10001/game/detailinfov3
請求獲取到數據,
Data則是:
{"gameId":"20001","apiVersion":"1","recommendId":"","pos":"2","algoType":"","pos1":"1","pos2":"0","iInfoId":iInfoId,"type":"25818","goPickComment":"0","taskId":"","cChannelId":"3","cClientVersionCode":"2018122401","cClientVersionName":"3.41.202","cCurrentGameId":"20001","cDeviceCPU":"armeabi-v7a%24armeabi","cDeviceId":"5502acf8109e4a66a4e443912ace3821014b0ca9","cDeviceImei":"868695033078799","cDeviceMac":"02:00:00:00:00:00","cDeviceMem":"113917","cDeviceModel":"MI
8
UD","cDeviceNet":"WIFIi","cDevicePPI":"440","cDeviceSP":"中國聯通","cDeviceScreenHeight":"2028","cDeviceScreenWidth":"1080","cGameId":"20001","cGzip":"1","cRand":"1547003489109","cSystem":"android","cSystemVersionCode":"28","cSystemVersionName":"9","gameAreaId":"3","gameId":"20001","gameOpenId":"owanlssxkyCn-iJMttt7KG0jZObs","gameServerId":"3181","gameUserSex":"1","token":"HzzdRrGA","userId":"491132695"}
通過iInfoid就能拿到全部數據。
三、下面就是分析則么通過vid獲取騰訊視頻具體內容。
'https://av.video.qq.com/getinfo?callback=JsonpCallBack&&charge=0&defaultfmt=auto&otype=json&guid=c05f836b267c173e684cec6410185d3b&platform=70201&sdtfrom=v1104&defnpayver=0&appVer=3.3.128&host=v.qq.com&ehost=https%3A%2F%2Fv.qq.com%2F&_rnd=1507969615&spwm=4&vid={}&_qv_rmt=ZHrqJgF6A10991DBb%3D&_qv_rmt2=y%2FlweBl0157665zsQ%3D&_1507969615506='.format(vid)
起始url請求,返回一堆json數據,里面的keyid,preurl,vkey,都是拼接視頻源地址的信息。通過這部分信息,最后拼接之后,鏈接即可獲取視頻播放源碼。
順利爬取到數據。
四、查找獲取王者榮耀玩家段位信息的方式
?????? 由于英雄聯盟開放了玩家游戲段位查詢接口,所以英雄聯盟玩家的段位信息很容易拿到。而王者榮耀則在這方面并沒有做開放。我想了幾個策略方式。
[if !supportLists](1)?????[endif]通過官網web看是否能夠拿到數據。
[if !supportLists](2)?????[endif]王者榮耀小程序能夠拿到玩家自己的游戲數據
[if !supportLists](3)?????[endif]王者營地有一個用戶搜索的方式查詢
[if !supportLists](4)?????[endif]通過王者榮耀游戲客戶端獲取數據。
第一個方法,通過王者榮耀官網獲取數據,發現其是需要有登陸態的,登陸之后才能獲取自己的段位數據,而且不能查詢其他人。我把這個結果告訴馬里奧,馬里奧說不行。他需要的是直接獲取其他人的段位信息。
然后去看微信小程序的,需要拿到用戶的code,馬里奧說這個更不要想,太難了。遂放棄。
然后準備通過王者榮耀游戲客戶端獲取,結果發現根本抓不到fiddler請求啊~還把手機搞得不能夠正常使用代理了。
最后一個方法,王者營地。
這個真的可以獲取,但是呢,最后才發現,依然需要用戶登陸,然后王者營地會給用戶一個id,通過這個王者營地的用戶id,王者營地app后臺去請求到王者榮耀的數據庫玩家段位數據。但是這個id是不會暴露給用戶的,所以不會抓包的人根本不能知道自己的用戶id是多少,同時沒有登陸過王者營地app的用戶,王者營地是拿不到用戶數據的,同時王者營地時可以將戰績設置成隱身的。
因此這多方限制,雖然我們可以通過搜索的方式拿到部分用戶的段位信息,但是這種方式未免太過雞肋。用處不大。
經驗總結:
[if !supportLists]1.?????[endif]雖然微信電競最終沒有爬取到數據,但是通過爬取的過程中,我找到了很多種爬取資訊的策略方法,總結了一些經驗,
[if !supportLists]2.?????[endif]王者營地雖然是個用戶量很大的app,但是可以說完全沒有做反爬工作。所有有時候爬起數據,不能還是有很多意想不到的收獲。