前言
因為最近要寫一個抓取sitemap和相應的參數的小腳本,現有的爬蟲無論用什么語言寫的,幾乎都無法抓取參數,所以我思考了一下,先做一個簡單的總結。
本來以為寫個這種sitemap的爬蟲很簡單,經過思考之后才發現其中的可怕之處,最關鍵的是參數的提取,這個太麻煩了。。。這個時候才發現AWVS的無敵和強大之處。。。
如果我們要獲取網站的sitemap同時還要抓取對應鏈接的參數,我大概總結了url的幾個來源:
1、頁面上直接現有的form表單以及現有的href等指向的鏈接及參數,這個相對比較簡單,不過要考慮post和get的問題。
2、由js生成的DOM中的form表單和href指向的鏈接
3、由js發起的訪問請求,例如AJAX請求等
4、通過點擊然后調用js發送請求,或是點擊生成一個form或是生產一個DOM,然后再點擊再由js發送請求。例如如下代碼
<div> <input id="searchTitle" name="searchTitle" value="" type="text"> <div class="button" onclick="javascript:searchWeb();"></div> </div>
5、通過setTimeout函數延遲觸發的js的請求,例如setTimeout("request()", 2000);,這一類我暫時還沒有太好的辦法解決,不過有初步的辦法,后面會說到。
目前我大概想到這么五類,肯定還有沒考慮到的地方,并且目前實際的代碼還沒有寫出來,我先記錄一下我的想法,要是有哪位師傅有興趣請務必聯系我。。。。orz。。
要解決上述的5個問題,因為我的工程的前半部分使用python寫的,所以這里我需要用python來解決,那么最佳選擇必然是selenium和phantomjs,其實比起來我更想用原生的phantomjs來寫。
用phantomjs的話第一個和第二個問題不攻自破,直接正則匹配下來就行了,因為它會幫我們先把頁面的js執行了。
第三個問題也相對比較好解決,我們通過原生phantomjs的APIonResourceRequested就能夠監控所有從頁面發出去的請求。
然后再來看第四個問題,我目前的想法應該沒有辦法徹底解決,我們同樣可以用phantomjs向頁面的所有的dom發送一個click事件,但是這樣子的話時間是一個很大的問題,所以初步想法向所有具有onclick事件的標簽發送點擊事件
然后再來看第五個問題,這應該是最麻煩的一個,我初步的想法還是用onResourceRequested事件,然后設置一個超時時限,讓頁面執行個幾秒鐘,但是最后我還是放棄了這個想法,我決定忽視這個問題,因為如果每個頁面都等上幾秒那時間耗費不堆上天了。
以上就是我目前初步的一些思考,還有很多不成熟之處。
selenium與phantomjs聯動的問題
之前一直知道有selenium這個東西,不夠因為沒有地方需要,也沒有可以去學習,不過對phantomjs可能會稍微熟悉一些。
新聞熱點
疑難解答