抓取玩加赛事的王者荣耀的相关数据第一弹--->战队基本信息
一、页面分析
1、战区分析
目前的玩加赛事王者荣耀页面,全球 和中国 的数据是完全一样的。所以抓取任务只涉及全球。后期更新任务应该考虑到其他战区的内容。
2、 战队战力值存储
战力值右边的方块要进行存储。单独存储一个字段判断其趋势是上升还是下降。
战队的要通过页面的url确定uuid。
3、 战队的基本信息空缺
目前战队的基本信息空缺,数据库以空字段对历史战绩、全部时间、战绩、胜/平/负四个字段进行存储。
4、战队国籍、战力趋势存储细节
战队的国籍在http://www.wanplus.com/kog/ranking 页面当中并没有显示。但是有CN可以指示。
战队战力趋势当中同样没有内容,此处获取class属性内容截取其中的 up、down字段。
此处对战队的国籍进行存储,并保存战队的曾用名。
二、使用工具
JDK:JDK1.7
编程工具:MyEcliose
数据库:mysql
自动化工具 : Selenium 2.44.0
浏览器版本 : 谷歌62.0.3202.94
浏览器驱动 :chromedriver.exe
最终目录结构如下:
三、部分代码展示
package wanplus.wzry;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.UUID;
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;
public class Crops_information {
/*
* 抓取玩加赛事--->王者荣耀->战队基本数据
* @time 2018年3月19日 ---> 编写日期
* @time ---> 更新日期
* 变量控制---> a 控制战队数目,crop_lists.size() 决定 a 的数目
*
*/
public static void main(String[] args) throws InterruptedException {
//打开Chrome浏览器
System.setProperty("webdriver.chrome.driver", "D:/cyt_down/selenium/chromedriver.exe");
//打开Chrome浏览器
WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor) driver;
//创建数据库连接
Connection con;
Statement stmt;
ResultSet rs;
//打开页面并完成窗口最大化
driver.get("http://www.wanplus.com/kog/ranking");
Thread.sleep(3000);
driver.manage().window().maximize();
System.out.println("窗口最大化完成");
Thread.sleep(1000);
String Crop_url= "" ; //战队url
String Team_ranking= "" ; //战队排行
String Marine_nationality= "" ; //战队国籍
String Crop_name= "" ; //战队名称
String Crop_name2= "" ; //战队名称,战队页面的
String Crop_old_name= "" ; //战队曾用名
String Combat_power_value= "" ; //战力值
String Force_trend= "" ; //战力趋势
String Historical_record= "" ; //历史战绩
String All_time= "" ; //全部时间
String Crop_record= "" ; //战绩
String Crop_kda= "" ; //胜/负/平
String Global_ranking= "" ; // 全球排行
String China_ranking= "" ; //中国排行
String Crop_img= "" ; //战队图标
String Crop_uuid= "" ; //战队UUID 插入数据库时进行赋值。
// 通过Date类来获取当前时间
Long date = System.currentTimeMillis();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String nowTime = sdf.format(date);//将时间格式转换成符合Timestamp要求的格式.
System.out.println("当前时间----->"+ nowTime);
List<WebElement> crop_lists = driver.findElement(By.id("teamranking_left_team")).findElements(By.tagName("li"));
//获取战队的列表,进行循环遍历
for(int a=0; a< crop_lists.size() ;a++){
int aa =a+1 ;
//内层嵌套 序列 crop_list 解决页面跳转之后无法找到相对应的元素
List<WebElement> crop_list = driver.findElement(By.id("teamranking_left_team")).findElements(By.tagName("li"));
Team_ranking = crop_list.get(a).findElements(By.tagName("div")).get(0).getText();
System.out.println("战队排行--->>" + Team_ranking);
Crop_name = crop_list.get(a).findElements(By.tagName("div")).get(2).getText();
System.out.println("战队名称--->>" + Crop_name);
Combat_power_value = crop_list.get(a).findElements(By.tagName("div")).get(3).getText();
System.out.println("战队战力值--->>" + Combat_power_value);
Force_trend = crop_list.get(a).findElements(By.tagName("div")).get(4).getAttribute("class").replaceAll("status ", "");
System.out.println("战队趋势--->>" + Force_trend);
//js点击,抓取战队的基本信息
js.executeScript("arguments[0].click();",driver.findElement(By.xpath("//*[@id=\"teamranking_left_team\"]/li["+aa+"]/div[3]")));
Thread.sleep(2000);
Crop_img = driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[1]/div[1]/a/img")).getAttribute("src");
System.out.println("战队图标--->>" + Crop_img);
Crop_url = driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[1]/div[1]/a")).getAttribute("href");
System.out.println("战队URL--->>" + Crop_url);
Global_ranking = driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[1]/ul/li[1]/div[1]/i")).getText();
System.out.println("全球排行--->>" + Global_ranking);
China_ranking = driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[1]/ul/li[2]/div[1]/i")).getText();
System.out.println("中国排行--->>" + China_ranking);
Crop_record = driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[2]/ul/li[2]/span[2]")).getText();
System.out.println("战绩--->>" + Crop_record);
//进行点击 进入战队页面
driver.findElement(By.xpath("//*[@id=\"teamranking_middle_team_detail\"]/div[1]/div[2]/div[1]/a")).click();
Thread.sleep(4000);
System.out.println("进入战队页面");
//转换句柄
String[] handles = new String[driver.getWindowHandles().size()] ;
driver.getWindowHandles().toArray(handles);
//切换到战队的详情页
driver.switchTo().window(handles[1]);
Crop_name2 = driver.findElement(By.xpath("//*[@id=\"info\"]/div[1]/div[1]/table/tbody/tr[1]/td[2]")).getText();
System.out.println("战队详情页面--->>" + Crop_name2);
Crop_old_name = driver.findElement(By.xpath("//*[@id=\"info\"]/div[1]/div[1]/table/tbody/tr[2]/td")).getText();
System.out.println("战绩详情页面--->>" + Crop_old_name);
Marine_nationality = driver.findElement(By.xpath("//*[@id=\"info\"]/div[1]/div[1]/table/tbody/tr[3]/td")).getText();
System.out.println("战绩详情页面--->>" + Marine_nationality);
try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/game_db","cyt","cyt1");
stmt = con.createStatement();
Statement stmt2 = con.createStatement();
rs = stmt.executeQuery("select Crop_uuid from wanplus_wangzhe_crop_information where Crop_url like \'"+ Crop_url +"\'" );
ResultSet rs2 = stmt2.executeQuery("select Crop_url,nowTime from wanplus_wangzhe_crop_information where Crop_url like \'"+ Crop_url +"\'" +
"and nowTime like \'"+ nowTime +"\'" ); ;
if (rs.next()){
System.out.println("数据库当中存在该战队uuid,将继续采取该uuid");
Crop_uuid = rs.getString("Crop_uuid");
String insertSQL ="insert into wanplus_wangzhe_crop_information(Crop_uuid,Crop_url,Team_ranking,Crop_name,Combat_power_value,Force_trend," +
"Crop_img,Global_ranking,China_ranking,Crop_record,Crop_name2,Crop_old_name,Marine_nationality,nowTime)" +
"values(\'"+ Crop_uuid +"\',\'"+ Crop_url +"\',\'"+ Team_ranking +"\',\'"+ Crop_name +"\',\'"+ Combat_power_value +"\',\'"+ Force_trend +"\'" +
",\'"+ Crop_img +"\',\'"+ Global_ranking +"\',\'"+ China_ranking +"\',\'"+ Crop_record +"\'" +
",\'"+ Crop_name2 +"\' ,\'"+ Crop_old_name +"\' ,\'"+ Marine_nationality +"\',\'"+ nowTime +"\')";
if(rs2.next()){
System.out.println("同样数据已经存在");
stmt2.close();
}else{
stmt.executeUpdate(insertSQL);
System.out.println("数据插入成功");
stmt2.close();
}
}else {
System.out.println("数据库当中不存在该战队的uuid");
Crop_uuid = UUID.randomUUID().toString().replace("-", "");
String insertSQL ="insert into wanplus_wangzhe_crop_information(Crop_uuid,Crop_url,Team_ranking,Crop_name,Combat_power_value,Force_trend," +
"Crop_img,Global_ranking,China_ranking,Crop_record,Crop_name2,Crop_old_name,Marine_nationality,nowTime)" +
"values(\'"+ Crop_uuid +"\',\'"+ Crop_url +"\',\'"+ Team_ranking +"\',\'"+ Crop_name +"\',\'"+ Combat_power_value +"\',\'"+ Force_trend +"\'" +
",\'"+ Crop_img +"\',\'"+ Global_ranking +"\',\'"+ China_ranking +"\',\'"+ Crop_record +"\'" +
",\'"+ Crop_name2 +"\' ,\'"+ Crop_old_name +"\' ,\'"+ Marine_nationality +"\',\'"+ nowTime +"\')";
if(rs2.next()){
System.out.println("同样数据已经存在");
stmt2.close();
}else{
stmt.executeUpdate(insertSQL);
System.out.println("数据插入成功");
stmt2.close();
}
}
stmt.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("链接失败");
}
System.err.println("成功抓取第"+ aa + "个战队———>" + Crop_url);
System.out.println("抓取完毕关闭页面,准备抓取下个战队");
//抓取完毕关闭页面,准备抓取下个战队
driver.close();
Thread.sleep(3000);
//返回主页面
driver.switchTo().window(handles[0]);
Thread.sleep(3000);
}
}
}