java selenium 抓包_JAVA Selenium HO 数据抓取 可供参考其他抓取,大同小异

这篇博客展示了如何利用Java Selenium库自动化抓取吉祥航空官网的航班信息。通过模拟用户交互,如选择出发地、目的地、日期,然后抓取并解析页面上的航班数据,包括航班号、出发时间、到达时间、价格等关键信息。
摘要由CSDN通过智能技术生成

实现页面抓取:

/**

*

*/

package com.trafree.workfactory.service;

import java.util.List;

import org.apache.curator.shaded.com.google.common.base.Objects;

import org.openqa.selenium.By;

import org.openqa.selenium.JavascriptExecutor;

import org.openqa.selenium.Keys;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import com.trafree.hardcore.util.MyWebdriver;

/**

* @author MichaelYang

*

*/

public class HOService {

public static void main(String[] args) {

//页面URL

String HOUrl="http://www.juneyaoair.com/";

//航班信息

int tripType = 2;//单程、往返、多程

String dep = "pvg";

String arr = "kmg";

String goDate = "2020-07-20";

String backDate = "2020-07-25";

int adtNum = 3;

WebDriver driver=MyWebdriver.getWebDriver();

try {

driver.get("http://www.juneyaoair.com/");

MyWebdriver.scrollToElement(driver,By.id("wangfan"));

switch(tripType) {

case 1:

{

MyWebdriver.executeScript(driver, "document.getElementById('dancheng').click();");

//出发地

WebElement fromcity=driver.findElement(By.id("fromcity"));

fromcity.click();

fromcity.clear();

fromcity.sendKeys(dep);

fromcity.sendKeys(Keys.ENTER);

//目的地

WebElement tocity=driver.findElement(By.id("tocity"));

tocity.click();

tocity.clear();

tocity.sendKeys(arr);

tocity.sendKeys(Keys.ENTER);

if(MyWebdriver.wait(driver, 1, "对不起,没有找到数据")>0) {

System.out.println("第二步验证该航线不支持");

}

//时间

WebElement depatureDate=driver.findElement(By.id("date01"));

depatureDate.click();

depatureDate.clear();

depatureDate.sendKeys(goDate);

//查询

WebElement search=driver.findElement(By.id("boxs-left-img-search"));

search.click();

if(MyWebdriver.isAlert(driver)) {

String msg=MyWebdriver.getAlertValue(driver);

if("请选择出发城市!".equals(msg)) {

System.out.println("该航线不支持");

}

if(MyWebdriver.wait(driver, 1, "您选择的日期没有航班信息,请重新选择!")>0) {

System.out.println("该航线和日期下无数据");

}

}

//等页面加载,不然会获取不到元素,报table没有数据

Thread.sleep(1500);

getTableInformation(driver,"flt_hd_table");

}

break;

case 2:

{

MyWebdriver.executeScript(driver, "document.getElementById('wangfan').click();");

//出发地

WebElement fromcity=driver.findElement(By.id("wfromCity"));

fromcity.click();

fromcity.clear();

fromcity.sendKeys(dep);

fromcity.sendKeys(Keys.ENTER);

//目的地

WebElement tocity=driver.findElement(By.id("wtoCity"));

tocity.click();

tocity.clear();

tocity.sendKeys(arr);

tocity.sendKeys(Keys.ENTER);

if(MyWebdriver.wait(driver, 1, "对不起,没有找到数据")>0) {

System.out.println("第二步验证该航线不支持");

}

//时间Dep

WebElement depatureDate=driver.findElement(By.id("date02"));

depatureDate.click();

depatureDate.clear();

depatureDate.sendKeys(goDate);

//时间Arr

WebElement arriveDate=driver.findElement(By.id("date03"));

arriveDate.click();

arriveDate.clear();

arriveDate.sendKeys(backDate);

//查询

WebElement search=driver.findElement(By.id("boxs-left-img-search1"));

search.click();

if(MyWebdriver.isAlert(driver)) {

String msg=MyWebdriver.getAlertValue(driver);

if("请选择出发城市!".equals(msg)) {

System.out.println("该航线不支持");

}

if(MyWebdriver.wait(driver, 1, "您选择的日期没有航班信息,请重新选择!")>0) {

System.out.println("该航线和日期下无数据");

}

}

//等页面加载,不然会获取不到元素,报table没有数据

Thread.sleep(1500);

//处理去程

driver.findElement(By.id("Go")).click();

getTableInformation(driver,"flt_hd_table");

//处理回程

driver.findElement(By.id("Back")).click();

if(MyWebdriver.isElementExistAndShow(driver, By.id("flt_hd_table_Back"))) {

getTableInformation(driver,"flt_hd_table_Back");

}

}

break;

case 3:

{

System.out.println("处理多程单程");

}

break;

case 4:

{

System.out.println("处理多程往返");

}

break;

default:

System.out.println("tripType 数值不对,请核验");

}

}catch(Exception e) {

e.printStackTrace();

System.out.println(e.getMessage()+"ERROR");

}finally {

//driver.quit();

}

}

private static void getTableInformation(WebDriver driver,String tableId) {

WebElement tableDiv=driver.findElement(By.id(tableId));

if(MyWebdriver.isElementExistAndShow(tableDiv, By.tagName("table"))) {

//获取数据

WebElement table=tableDiv.findElement(By.tagName("table"));

/*可以先将所有舱位展开再获取*/

List moreCabins=table.findElements(By.linkText("更多舱位"));

for(int i=0;i

WebElement link=moreCabins.get(i);

link.click();

}

WebElement tbody=table.findElement(By.tagName("tbody"));

List TRs=tbody.findElements(By.tagName("tr"));

List flightsOfTitle=table.findElements(By.className("title"));

System.out.println(flightsOfTitle.size());

//JavascriptExecutor driver_js=(JavascriptExecutor)driver;

//driver_js.executeScript("document.getElementsByClassName('cnt')");

int start=0;

if(flightsOfTitle.size()>0) {

//总共有多少个航班

for(int i=0;i

WebElement trTitle=flightsOfTitle.get(i);

String stopOverCode=trTitle.findElement(By.className("flt_arrow")).findElement(By.tagName("img")).getAttribute("stopairport");

String flightNum=trTitle.findElement(By.className("clearfix")).getText().split("\n")[0];

String depatureTime=trTitle.findElement(By.className("flt_from")).getText().split("\n")[0];

String depAirport=trTitle.findElement(By.className("flt_from")).getText().split("\n")[1];

String arriveTime=trTitle.findElement(By.className("flt_to")).getText().split("\n")[0];

String arrAirport=trTitle.findElement(By.className("flt_to")).getText().split("\n")[1];

String ticketFare=trTitle.findElement(By.className("flt_price")).findElement(By.tagName("b")).getText();

String ticketTax=trTitle.findElement(By.className("flt_tax")).findElement(By.tagName("a")).getText();

System.out.println(flightNum+" "+depatureTime+" "+depAirport+" "+arriveTime+" "+arrAirport+" "+ticketFare+" "+ticketTax+"**"+stopOverCode);

for(int j=start+1;j

WebElement TR=TRs.get(j);

if(TR.getAttribute("class").equals("title")){

continue;

}

if(TR.getAttribute("class").equals("flt_more")) {

start=j;

break;

}

//获取TD做处理即可

String cabin=TR.findElements(By.tagName("td")).get(0).getText();

System.out.println(cabin);

}

}

}else {

System.out.println("{table--title}没有数据!");

}

}else {

System.out.println("{table}没有数据!");

}

}

private void save2Db(Objects... args) {

}

}

实现页面登录:

/**

*

*/

package com.trafree.hardcore.login;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import com.trafree.hardcore.util.MyWebdriver;

import com.trafree.hardcore.util.ScrollBarTool;

/**

* @author lily.li@trafree.com

*

*/

public class HOLogin {

public static String chromeDriverPath="C:\\Program Files (x86)\\ChromeCore\\chromedriver.exe";

private ChromeDriver driver;

public HOLogin() {

System.setProperty("webdriver.chrome.driver", chromeDriverPath);

driver= new ChromeDriver();

driver.manage().window().maximize();

driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

}

public HOLogin(ChromeDriver driver) {

this.driver=driver;

}

public void loginHO(String username,String password) {

int indexPageCount=0;

driver.get("http://www.juneyaoair.com/");

int loginSwitch=MyWebdriver.wait(driver, 10, "登录");

if(loginSwitch>0) {

//进行登录操作

driver.findElement(By.id("LoginButton")).click();

int loginPageSwitch=MyWebdriver.wait(driver, 10, "会员登录");

if(loginPageSwitch==0) {

System.out.println("登录页面未加载,重新加载");

driver.findElement(By.id("LoginButton")).click();

}

driver.findElements(By.className("current")).get(0).click();

//账号

WebElement accountText=driver.findElement(By.id("accountName"));

accountText.clear();

accountText.click();

accountText.sendKeys(username);

//密码

WebElement passwordText=driver.findElement(By.id("pwd"));

passwordText.clear();

passwordText.click();

passwordText.sendKeys(password);

//点击已阅读条款

WebElement checkBox=driver.findElement(By.id("checkbox-account"));

checkBox.click();

//登录

WebElement loginButton=driver.findElement(By.id("accountLoginBtn"));

loginButton.click();

//拖动滑块验证

int isLogined=new ScrollBarTool().scrollBar(driver);

//判断

if(isLogined==0) {

System.out.println("登录成功");

}

}else {

if(indexPageCount>2) {

//尝试加载两次

System.out.println("停止加载");

return;

}

System.out.println("页面未加载成功,重新加载登录");

loginHO(username,password);

indexPageCount++;

}

}

public static void main(String[] args) {

new HOLogin().loginHO("13751115293", "michael0823");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Selenium可以通过使用浏览器的开发者工具来抓取网络数据包。具体来说,可以使用Selenium WebDriver来控制浏览器,然后使用浏览器的开发者工具来捕获网络请求和响应。以下是一个简单的示例代码: ```java import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.devtools.DevTools; import org.openqa.selenium.devtools.network.Network; import org.openqa.selenium.devtools.network.model.Headers; import org.openqa.selenium.devtools.network.model.Request; import org.openqa.selenium.devtools.network.model.Response; public class SeleniumCaptureNetworkTraffic { public static void main(String[] args) { // 设置 ChromeDriver 路径 System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); // 创建 ChromeDriver 实例 ChromeDriver driver = new ChromeDriver(); // 启动开发者工具 DevTools devTools = driver.getDevTools(); devTools.createSession(); // 开启 Network 模块 devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty())); // 添加监听器来捕获请求和响应 devTools.addListener(Network.requestWillBeSent(), entry -> { Request request = entry.getRequest(); System.out.println("Request URL: " + request.getUrl()); Headers headers = request.getHeaders(); System.out.println("Request Headers: " + headers); }); devTools.addListener(Network.responseReceived(), entry -> { Response response = entry.getResponse(); System.out.println("Response URL: " + response.getUrl()); Headers headers = response.getHeaders(); System.out.println("Response Headers: " + headers); }); // 打开网页 driver.get("https://www.example.com"); // 关闭浏览器 driver.quit(); } } ``` 上述代码中,我们使用ChromeDriver来启动Chrome浏览器,并创建开发者工具的会话。然后,我们启用了Network模块,并添加了请求和响应的监听器。在监听器中,我们可以获取到请求和响应的URL、Headers等信息,并进行处理。最后,我们使用driver.get方法打开了一个网页,可以在监听器中获取到该网页的请求和响应数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值