909422229_基於谷歌外掛爬取介面使用者資訊+評論 Java版本
阿新 • • 發佈:2018-12-01
一百度百科
Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾經是 Selenium 的競爭對手)。也就是說 Selenium 2 是 Selenium 和 WebDriver 兩個專案的合併,即 Selenium 2 相容 Selenium,它既支援 Selenium API 也支援 WebDriver API。 WebDriver是一個用來進行復雜重複的web自動化測試的工具。意在提供一種比Selenium1.0更簡單易學,有利於維護的API。它沒有和任何測試框架進行繫結,所以他可以很好的在單元測試和main方法中呼叫。一旦建立好一個Selenium工程,你馬上會發現WebDriver和其他類庫一樣:它是完全獨立的,你可以直接使用而不需要考慮其他配置,這個Selenium RC是截然相反的。
二、谷歌瀏覽器
本次主要使用的是谷歌瀏覽器自帶的外掛,採取自動化測試。自動登入微博、捕獲使用者資訊與評論使用者評論。
瀏覽器外掛下載地址:http://npm.taobao.org/mirrors/chromedriver/
瀏覽器自行百度,需要對應版本:可以看我另一個帖子。
https://blog.csdn.net/a909422229/article/details/82747048
三:需要一個jar包地址如下:
四、核心思想
主要是是採用webDriver與webElement 獲取介面標籤,其實跟普通爬蟲一樣,爬HTML介面。加上各種事件即可。
核心程式碼如下:
import java.io.File; import java.io.IOException; import java.util.List; import java.util.Random; import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeDriverService; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.interactions.Actions; public class WeiboCrawler { public static void main(String[] args) throws Exception { testSelenium(); } public static void testSelenium() throws IOException, InterruptedException { long waitLoadBaseTime = 10000; int waitLoadRandomTime = 5000; Random random = new Random(System.currentTimeMillis()); System.getProperties().setProperty("webdriver.chrome.driver", "G:/ChromePortable/chromedriver.exe"); ChromeOptions options = new ChromeOptions(); options.setBinary("G:\\ChromePortable\\App\\Google Chrome\\chrome.exe"); options.addArguments("disable-infobars"); WebDriver driver = new ChromeDriver(options); String baseUrl = "https://weibo.com"; //開啟瀏覽器 driver.get(baseUrl); try { //因為網站不一定可以馬上開啟,讓程序停一下,否則頁面的元素會找不到。 //Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime)); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //然後這個頁面就會進入到登入後的介面了 driver.findElement(By.cssSelector("input[name=username]")).sendKeys("帳號"); driver.findElement(By.cssSelector("input[name=password]")).sendKeys("密碼"); driver.findElement(By.cssSelector("a[action-type=btn_submit]")).click(); //因為網站不一定可以馬上開啟,讓程序停一下,否則頁面還沒有加載出來就進行下一步了。 Thread.sleep(3000); //driver.get("https://weibo.com/5896401674/Gap2v3T57?filter=all&root_comment_id=0&type=comment"); driver.get("https://weibo.com/1268075087/GwiM8e86F?filter=hot&root_comment_id=0&type=comment#_rnd1537179456236"); // //等待頁面動態載入完畢 Thread.sleep(waitLoadBaseTime+random.nextInt(waitLoadRandomTime)); List<WebElement> elements = driver.findElements(By.cssSelector("div[action-type=feed_list_item]")); //選擇每條微博的文字內容模組 //, for (int i = 0; i <elements.size(); i++) { WebElement element = elements.get(i); WebElement elements2 = element.findElement(By.cssSelector("div[node-type=feed_list_content]")); String text = elements2.getText(); if(text.contains("轉發微博")) { continue; } //feed_list_repeat List<WebElement> subelements = element.findElements(By.cssSelector("div[node-type=root_comment]")); //獲取目前全部的評論資訊 if(subelements.size() == 0) { continue; } System.out.println("內容:"+text); for(int s = 0;s<subelements.size();s++) { WebElement subelement = subelements.get(s); WebElement face = subelement.findElement(By.cssSelector("div.WB_face.W_fl"));//從第一個評論開始獲取資訊 // System.out.println("face"+face.findElement(By.cssSelector("a")).getAttribute("href")); Actions action = new Actions(driver); action.moveToElement(face).perform(); Thread.sleep(4000); List<WebElement> contents = driver.findElements(By.cssSelector("div[class=content]")); for(WebElement c:contents) { if(c.getText().isEmpty()) { continue; } String ss = c.getText(); String[] tmpss = ss.split("\n"); String cstr = "個人資訊:"; for(int snum = 0;snum<tmpss.length;snum++) { if(snum == 0||snum == 1) { cstr = cstr +tmpss[snum]+"\n"; }else if(snum == 2) { cstr = cstr+"地區:"+tmpss[snum]; }else if(tmpss[snum].contains("共同關注")){ cstr = "\n"+cstr +tmpss[snum]; } } System.out.println(cstr); } List<WebElement> sube = subelement.findElements(By.cssSelector("div[class=WB_text]")); WebElement sub = sube.get(0); action.moveToElement(sub).perform(); action.release(); Thread.sleep(1000); String str = sub.getText(); String[] strs = str.split(":"); str = strs[strs.length-1]; System.out.println("使用者暱稱:"+sub.findElement(By.cssSelector("a")).getText()+"\n"+ sub.findElement(By.cssSelector("a")).getAttribute("usercard")+"\n"+"評論:"+str); //點選回覆按鈕 List<WebElement> reply = subelement.findElements(By.cssSelector("ul[class=clearfix]")); WebElement sub2 = reply.get(0); System.out.println(sub2.getTagName()); System.out.println(sub2.getAttribute("class")); WebElement a2 = sub2.findElement(By.cssSelector("ul span a[action-type=reply]")); System.out.println(a2.getTagName()); System.out.println(a2.getAttribute("class")); action.moveToElement(a2).perform(); //action.release(); a2.click(); Thread.sleep(500); //填寫評論 List<WebElement> div = subelement.findElements(By.cssSelector("div[class=p_input]")); WebElement text2 = div.get(0); WebElement findElement = text2.findElement(By.cssSelector("textarea[class=W_input]")); action.release(); System.out.println(findElement.getTagName()); System.out.println(findElement.getAttribute("class")); findElement.sendKeys("對對對你說的對,沒錯沒錯是這樣,哈哈哈哈有意思。");//進行評論 Thread.sleep(500); //獲取提交按鈕,進行提交 List<WebElement> btnList = subelement.findElements(By.cssSelector("div[class=WB_publish]")); WebElement text3 = btnList.get(0); action.moveToElement(text3).perform(); action.release(); System.out.println(text3.getTagName()); System.out.println(text3.getAttribute("class")); WebElement btn = text3.findElement(By.cssSelector("div[class $='p_opt clearfix']")).findElement(By.cssSelector("div[class $='btn W_fr']")); System.out.println(btn.getTagName()); System.out.println(btn.getAttribute("class")); btn.findElement(By.cssSelector("a[action-type=doReply]")).click(); } System.out.println("第"+i+"條-----------------------"); } driver.quit(); } private static Object ActionChains(WebDriver driver) { // TODO Auto-generated method stub return null; } }
以上就是全部程式碼,不多。不懂可以在下面留言。