蠻早之前公司有個(gè)產(chǎn)品問我能不能爬百度指數(shù)婿失,我隨便瞄了眼享幽,直接回了可以睹限,然后...光速打臉...今兒個(gè)有空浸须,研究研究這玩意兒。嫌長的可以直接拉到最后看后記邦泄。
目標(biāo)
先明確下要做什么删窒,目標(biāo)不是要寫出一個(gè)可用的完整的爬蟲,只是要個(gè)思路顺囊。
我們的目標(biāo)僅僅只是爬取這邊的數(shù)字肌索,162和125,還有后邊的比例特碳。
分析
先說點(diǎn)題外話诚亚,業(yè)界對(duì)數(shù)字的加密真是做的喪心病狂,返回假數(shù)據(jù)然后js重新計(jì)算修改都是簡單的了午乓,復(fù)雜的還有某移動(dòng)端網(wǎng)頁返回?cái)?shù)字234站宗,然而因?yàn)槭褂昧颂厥獾淖煮w顯示123的,這邊還有個(gè)更惡心的迷之加密益愈。
開始分析梢灭,首先,展示出來的樣子蒸其,不像是數(shù)字敏释,像是分辨率不高的幾張圖片,讓我們看看渲染完的html長啥樣的摸袁。
確實(shí)很迷钥顽,顯示出來好好的類似圖片的數(shù)字,html里邊(而且是渲染完的html)只有幾個(gè)div和span靠汁,class里邊倒有幾個(gè)val蜂大,txt闽铐,重點(diǎn)懷疑下,要看看哪里用到奶浦。而且看上去分辨率很低的圖片也還沒有出現(xiàn)兄墅,而根據(jù)我有限的知識(shí),html里邊顯示出來的圖片除了img標(biāo)簽财喳,也就css里的background。很明顯斩狱,我們?cè)谟疫呎业搅吮尘皥D耳高,果然,看來問題馬上就要解決了所踊,下載下來看看泌枪。
?秕岛?碌燕?這是什么鬼?继薛?修壕?等等,621215遏考,僅有的幾個(gè)數(shù)字似乎有點(diǎn)熟悉慈鸠,沒錯(cuò),就是上邊那幾個(gè)指數(shù)灌具,看來我們已經(jīng)找到了青团,感覺就是span里邊的style控制顯示的背景(還有這種操作?咖楣?)督笆。
先讓我們驗(yàn)證下上面的猜測,方法很簡單诱贿,換個(gè)關(guān)鍵詞娃肿,找到那個(gè)關(guān)鍵詞對(duì)應(yīng)的背景圖,拿過來替換到該關(guān)鍵詞中珠十,看看數(shù)字會(huì)不會(huì)變咸作。
果然,數(shù)字變了宵睦,變成了幾個(gè)不知道是什么的東西记罚。應(yīng)該是有什么地方可以控制顯示背景圖的第某個(gè)位置之類的方法。
繼續(xù)瞎改html
如圖壳嚎,我把imgval 和imgtxt 的style進(jìn)行了修改桐智,原先的162變成了112末早,顯然,是根據(jù)這個(gè)來控制顯示的值的说庭。這邊有兩個(gè)值然磷,一個(gè)是imgval的width,另一個(gè)是imgtxt的margin-left刊驴。
繼續(xù)找姿搜,這兩個(gè)值是哪里來的呢?直覺告訴我是js算出來的捆憎,一定是某個(gè)js 根據(jù)一個(gè)key舅柜,再怎么加密解密(前端就喜歡搞這一套 = = )得到的,一定是躲惰。然鵝致份,當(dāng)我打開network,竟然發(fā)現(xiàn)了這個(gè)
....... 直接去獲取的啊....
其實(shí)到了這础拨,我已經(jīng)能抓取了氮块。我們公司是有爬蟲渲染的模塊的,但是秉承著負(fù)責(zé)的態(tài)度诡宗,繼續(xù)往下看滔蝉,那這個(gè)url是誰發(fā)出的呢?
分析下長得很像的幾個(gè)發(fā)出的url塔沃,很容易可以發(fā)現(xiàn)大部分字段都是一樣的锰提,估計(jì)是把keyword再和什么東西加密得到的,然后后邊都是明文芳悲,所以我們只需要找到res和res2生成的方法就可以了立肘。
過去了兩個(gè)小時(shí)...
沒想到啊,竟然卡在這了名扛。
直接給結(jié)論吧...res和res2都在直接返回的html里邊谅年。
res是直接給的,直接搜PPval.ppt后面一長串就是了肮韧。
res2找了我好久融蹂,結(jié)果也是這里面。弄企。
找到類似這樣的東西
圖中的VWO就是了超燃,需要自己寫下這個(gè)js模擬算下,要注意的是拘领,這幾個(gè)字母是會(huì)變得R馀摇!每次都不一樣T妓亍届良!
后記
行了笆凌,就這樣了,比想象的麻煩多了士葫,但回過頭來看其實(shí)很簡單乞而。
- 獲取頁面 類似這樣https://index.baidu.com/?tpl=trend&type=0&area=0&time=13&word=%C3%C3%D7%D3%B0%C9 ,這邊可能需要登錄慢显,我沒做
- 提取PPval.ppt記做res 用正則在上面獲取到的html中抽出來就好了
- 獲取res2 res2需要跑一下這個(gè)html里邊有個(gè)script爪模,具體找的方式看上一段
-
拼接
"https://index.baidu.com/Interface/IndexShow/show/?res={res}&res2={res2}&classType=2&res3[]=z0&res3[]=Ee&className=profWagv".format(res=res,res2=res2)
- 獲取數(shù)字 上面url返回的有兩樣?xùn)|西,一個(gè)style荚藻,確定數(shù)字位置屋灌,一個(gè)是background。兩者就能得到以圖片顯示的數(shù)字了鞋喇,然后ocr識(shí)別一下分分鐘就搞定了(說的簡單)