909422229_基于谷歌插件爬取界面用户信息+评论 Java版本

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a909422229/article/details/82746975

一百度百科

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

}

以上就是全部代码,不多。不懂可以在下面留言。

猜你喜欢

转载自blog.csdn.net/a909422229/article/details/82746975
今日推荐