首页 > 编程语言 >Java Selenium4 ChromeDriver获取指定的POST请求

Java Selenium4 ChromeDriver获取指定的POST请求

时间:2023-04-21 15:59:55浏览次数:61  
标签:chromeDriver Java java openqa selenium ChromeDriver Selenium4 org import

前言

最近项目上需要去找某个网站对应的请求数据,但是这个网站有个奇怪的反爬机制,你如果直接去请求这个url(listPro)是获取不到数据的,它会返回一段加密后的js代码过来,如果在浏览器上执行也不行,需要在这个网站上执行,这段代码主要是加密设置一个cookie,我在浏览器上复制这个cookie后,可以在后端执行一段时间,过期了就不行
这就很头疼了,我想的是在浏览器上执行后再返回,但是这段js也需要在这个网站上执行,造成了我无法使用这个接口的问题,所以我研究了一段时间,发现了这个爬取方法
类似的爬取方法数不胜数,我主要是不想把它爬下来放到数据库里面,其它的那些考虑就不在话下了

参考文档

Selenium官方文档
Stack overflow : how to get http response code using selenium webdriver
Stack overflow : chromedevtools in selenium waiting for response bodies

代码

先看下pom.xml,网上有很多人不推荐使用Selenium4+版本,但我觉得没多大影响
还有一点是为什么我引入了这么多包,如果只引入第一个的话,后面会遇到版本冲突的问题

<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chromium-driver</artifactId>
            <version>4.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-api</artifactId>
            <version>4.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>4.8.3</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-remote-driver</artifactId>
            <version>4.8.3</version>
        </dependency>

然后就是核心代码了

import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.devtools.DevTools;
import org.openqa.selenium.devtools.HasDevTools;
import org.openqa.selenium.devtools.v111.network.Network;
import org.openqa.selenium.devtools.v111.network.model.RequestId;
import org.openqa.selenium.support.ui.ExpectedCondition;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

import java.time.Duration;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
public class CkcestHandler {

  private static String getHtmlByChrome(String queryExpression){
    System.getProperties().setProperty("webdriver.chrome.driver", "E:\\Development\\chromeDriver\\chromedriver.exe");
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get("https://www.example.com");
    DevTools devTools = chromeDriver.getDevTools();
    devTools.createSession();
    devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));

    //切换
    chromeDriver.findElement(By.xpath("/html/body/div[3]/div[2]/div[1]/a[2]")).click();

    //点击全选CheckBox
    chromeDriver.findElement(By.id("dbSelectAll")).click();

    //传入表达式
    chromeDriver.findElement(By.id("expertSearchTextarea")).sendKeys(queryExpression);


    // 监听最后一次匹配的请求,获取对应的requestId
    String compareUrl = "https://www.example.com/listPro";
    AtomicReference<RequestId> requestId = new AtomicReference<>();
    devTools.addListener(Network.responseReceived(), responseReceived -> {
      if(responseReceived.getResponse().getUrl().equals(compareUrl) && responseReceived.getResponse().getStatus() == 200){
        requestId.set(responseReceived.getRequestId());
      }
    });

    // 点击专业搜索 -> 发起请求
    chromeDriver.findElement(By.id("expertSearchBtn")).click();

    // 等待获取到数据的html发生变化,超时时间为30秒
    ExpectedCondition<List<WebElement>> listExpectedCondition = ExpectedConditions.numberOfElementsToBeMoreThan(By.xpath("//*[@id=\"list_content_warp\"]/div"), 0);
    new WebDriverWait(chromeDriver, Duration.ofSeconds(30).getSeconds()).until(listExpectedCondition);

    // 获取开发者工具中的返回结果
    String  responseBody = devTools.send(Network.getResponseBody(requestId.get())).getBody();

    chromeDriver.quit();
    return responseBody;
  }
}

或者可以输出HTML格式,这种方式就不需要devtools了

Object executeScriptResult = chromeDriver.executeScript("return document.evaluate(\"//*[@id=\\\"center_main\\\"]\",document).iterateNext().innerHTML;");

String html = executeScriptResult.toString();

标签:chromeDriver,Java,java,openqa,selenium,ChromeDriver,Selenium4,org,import
From: https://www.cnblogs.com/ranke110/p/17340654.html

相关文章

  • 【汇智学堂】JAVA多线程实现的小游戏-龟兔争霸-2
    角色入场:publicvoidpaint(Graphicsg){g.clearRect(0,0,1600,900);Imageimage=newImageIcon("D:\\综合案例\\10\\src\\tu.png").getImage();//获取图片资源g.drawImage(image,PositionA-50,100,RecWidth,RecHeight......
  • 【汇智学堂】JAVA多线程实现的小游戏-弹球-2
    显示球板Ui类/**\*定义界面*显示球板*/packagecom.huizhi;importjavax.swing.*;importjava.awt.*;publicclassUiextendsJFrame{staticintPositionA=50,RecWidth=50,RecHeight=20;publicUi(){setTitle("弹球游戏");......
  • 重新学习Java线程原语
    Synchronized曾经是一个革命性的技术,在当前仍然有重要的用途。但是,现在是时候转向更新的Java线程原语,同时重新考虑我们的核心逻辑。自从Java第一个测试版以来,我就一直在使用它。从那时起,线程就是我最喜欢的特性之一。Java是第一种在编程语言本身中引入线程支持的语言。那是一个......
  • java EE开发之Servlet第十一课:反射基础三
    javaEE开发之Servlet第十一课:反射基础三1.使用反射机制形成通用sql语句1)构建insert语句publicstaticvoidsave(Objectobj){ //获取传递过来对象的Class类对象 Classc=obj.getClass(); //获取数据库连接 Connectionconn=getConn(); //准备执行SQL语句的对象(车......
  • JAVA入门第一天随记
    通过狂神第一天的课,对内容进行总结:一、关于markdown语法的学习1.对常用的语法进行总结1.标题2.字体斜体粗体粗斜体3.删除线无序列表2.快捷键Ctrl+Z:撤销Ctrl+X:剪切Ctrl+S:保存win+R:打开运行win+E:打开我的电脑3.打开CMD的方式1.Win+R输入cmd打开控......
  • JAVA获取当前时间的三种方法
    1、java.util.Dateday=newDate();SimpleDateFormatsdf=newSimpleDateFormat(“yyyy-MM-ddHH:mm:ss”);System.out.println(sdf.format(day));通过Date类来获取当前时间,比较常用。需要使用Java.util.Date类,速度一般。2、SimpleDateFormatsdf=newSimpleDateFormat......
  • java实现两张图片的相似度
    图片相似度java实现:https://zhuanlan.zhihu.com/p/568827637https://github.com/MingGH/calculate-pic-looklike 前端html5调用摄像头:https://www.cnblogs.com/hss-blog/p/9984878.htmlhttps://jeff_zhong.gitee.io/demo/dist/camera.html需要改正的是:<inputid="file"ty......
  • Java入门教程(1)——Java概述
    文章目录1.编程环境1.1开发环境2.2编程工具2.语言特点3.java的发展历程1.编程环境1.1开发环境JDK称为Java开发包或Java开发工具,是一个编写Java的Applet小程序和应用程序的程序开发环境。JDK是整个Java的核心,包括了Java运行环境,一些Java工具和Java的核心类库。2.2编程工具1.Ec......
  • L2-2 病毒溯源-Java
    题目L2-2病毒溯源病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株,而这些变异的病毒又可能被诱发突变产生第二代变异,如此继续不断变化。现给定一些病毒之间的变异关系,要求你找出其中最长的一条变异链。在此假设给出的变异都是由突变引起的,不考虑复杂的基因重组变......
  • java 实现简单的http服务器
    1、废话不多说,代码如下packagecom.linhuaming.test;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.ServerSocket;importjava.net.Socket;/***http服务器测试*/publicclassHttpServerTest{publi......