版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}
}
以上就是全部代码,不多。不懂可以在下面留言。