1. 程式人生 > >909422229_基於谷歌外掛爬取介面使用者資訊+評論 Java版本

909422229_基於谷歌外掛爬取介面使用者資訊+評論 Java版本

一百度百科

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;
	}
	

}

以上就是全部程式碼,不多。不懂可以在下面留言。