Selenium 抓取玩加赛事数据第一弹

抓取玩加赛事的王者荣耀的相关数据第一弹--->战队基本信息

    一、页面分析

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值