前端時間嘗試用爬蟲爬取某jd的商品數據,而後發現普通方式(辣雞的我)爬取不到。而後瞭解了一下selenium這個神器,而後就有了這個點贊demo。這是 預覽地址,固然你也能夠拉github跑在本地。前端
首先要導入selenium-webdriver庫,而後安裝對應瀏覽器的driver,我這裏使用的與chrome對應的chromedriver(注意對應瀏覽器版本)。 node
有了selenium庫,咱們能夠經過代碼來控制瀏覽器模擬用戶行爲,這也是爲啥大部分反爬措施對selenium無效的緣由。如下爲登錄qq空間的操做代碼:var driver = new webdriver.Builder().forBrowser('chrome').build(); //建立一個chrome 瀏覽器實例
driver.get("https://user.qzone.qq.com/qq帳號"); //打開qq空間地址
driver.switchTo().frame(driver.findElement(By.id("login_frame"))); //切換登錄功能對應的iframe(不執行該步驟,後續點擊操做會失效)
driver.findElement(By.id("switcher_plogin")).click() //帳號密碼登錄按鈕點擊
driver.executeScript('document.getElementById("u").value="qq帳號"')
driver.executeScript('document.getElementById("p").value="密碼"')
driver.findElement(By.id("login_button")).click() //登錄
driver.manage().window().maximize(); //最大化瀏覽器
driver.switchTo().defaultContent();
dianzan(driver) //調用點贊功能函數
複製代碼
登錄完成以後,咱們就能夠經過click點贊標籤來實現點讚了。git
可是在demo第二次運行的時候,發現點過讚的被點了取消,所以咱們須要對點擊操做作一個過濾,只對沒用點讚的標籤進行點擊。經過對比發現,qq空間的點贊圖標並非用的iconfont矢量字體,而是用的雪碧圖定位,那麼咱們就能夠經過定位值來作是否已贊判斷。driver.findElements(By.className("fui-icon icon-op-praise")).then((arr)=>{
for(let i=0;i<arr.length;i++){
arr[i].getCssValue('background-position').then(v=>{
if(v=='-52px -921px'){
console.log(i,'已贊')
}else{
console.log(i,'點贊')
arr[i].click()
}
})
}
})
複製代碼
再次執行demo,發現重複點贊問題已解決,可是又有一個新問題:由於qq空間使用了懶加載,當天的說說比較多的時候首次加載並不會加載所有,點贊就只能點到當前加載的部分。咱們須要添加一個說說日期判斷,當已加載說說包含昨日說說時,說明已加載所有今日說說;不然執行滾動條下拉操做,加載更多說說。github
這裏根據時間標籤內的文本長度來作日期判斷。driver.findElements(By.className("info-detail")).then((arr)=>{
arr[arr.length-1].getText().then(v=>{
if(v.length>5){ //當前已經加載非當日說說
console.log('當天的說說已經贊完了')
driver.quit()
driver.sleep(24*60*60*1000) //點贊時差
openChrom()
}else{
driver.executeScript('document.documentElement.scrollTop=100000'); //模擬滾動加載更多動態
dianzan(driver) //遞歸調用
}
})
})
複製代碼
至此基本功能已經實現,放在服務器就能夠天天自動點贊一次(朕已閱,完美~~)。web
點贊功能雖然實現了,可是並不能直觀展現在前端,並且帳號仍是固定寫死在代碼裏的。而後鄙人用node寫了個後臺,前端傳帳號密碼過去,後臺接收後執行點贊部分代碼。若是更進一步,能夠在後臺把帳號密碼存入數據庫而後每日遍歷就能夠實現多帳戶自動點贊。做爲一個弱雞前端,後臺代碼就不貼出來了,若是須要請看這裏。chrome