Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >使用Selenium爬取动态网页如何绕开CloudFlare 5秒盾【示例】

使用Selenium爬取动态网页如何绕开CloudFlare 5秒盾【示例】

作者头像
Cheng_Blog
发布于 2023-05-20 06:24:49
发布于 2023-05-20 06:24:49
1.1K00
代码可运行
举报
文章被收录于专栏:Cheng's BlogCheng's Blog
运行总次数:0
代码可运行
默认已经安装好chromeDrive

1. 导入引用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>

2. 这里需要创建几个类,后面会用到

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ChromiumDriver extends RemoteWebDriver {

    public ChromiumDriver(Capabilities capabilities) {
        this(new ChromiumDriverCommandExecutor("goog", ChromeDriverService.createDefaultService()), capabilities, ChromeOptions.CAPABILITY);
    }

    protected ChromiumDriver(CommandExecutor commandExecutor, Capabilities capabilities, String capabilityKey) {
        super(commandExecutor, capabilities);

    }

    /**
     * Launches Chrome app specified by id.
     *
     * @param id Chrome app id.
     */
    public void launchApp(String id) {
        execute(ChromiumDriverCommand.LAUNCH_APP, ImmutableMap.of("id", id));
    }

    /**
     * Execute a Chrome Devtools Protocol command and get returned result. The
     * command and command args should follow
     * <a href="https://chromedevtools.github.io/devtools-protocol/">chrome devtools
     * protocol domains/commands</a>.
     */
    public Map<String, Object> executeCdpCommand(String commandName, Map<String, Object> parameters) {

        @SuppressWarnings("unchecked")
        Map<String, Object> toReturn = (Map<String, Object>) getExecuteMethod().execute(ChromiumDriverCommand.EXECUTE_CDP_COMMAND,
                ImmutableMap.of("cmd", commandName, "params", parameters));

        return ImmutableMap.copyOf(toReturn);
    }

    @Override
    public void quit() {
        super.quit();
    }
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final class ChromiumDriverCommand {
    private ChromiumDriverCommand() {}

    static final String LAUNCH_APP = "launchApp";
    static final String GET_NETWORK_CONDITIONS = "getNetworkConditions";
    static final String SET_NETWORK_CONDITIONS = "setNetworkConditions";
    static final String DELETE_NETWORK_CONDITIONS = "deleteNetworkConditions";
    static final String EXECUTE_CDP_COMMAND = "executeCdpCommand";

    // Cast Media Router APIs
    static final String GET_CAST_SINKS = "getCastSinks";
    static final String SET_CAST_SINK_TO_USE = "selectCastSink";
    static final String START_CAST_TAB_MIRRORING = "startCastTabMirroring";
    static final String GET_CAST_ISSUE_MESSAGE = "getCastIssueMessage";
    static final String STOP_CASTING = "stopCasting";

    static final String SET_PERMISSION = "setPermission";
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ChromiumDriverCommandExecutor extends DriverCommandExecutor {

    private static Map<String, CommandInfo> buildChromiumCommandMappings(String vendorKeyword) {
        String sessionPrefix = "/session/:sessionId/";
        String chromiumPrefix = sessionPrefix + "chromium";
        String vendorPrefix = sessionPrefix + vendorKeyword;

        HashMap<String, CommandInfo> mappings = new HashMap<>();

        mappings.put(ChromiumDriverCommand.LAUNCH_APP,
                new CommandInfo(chromiumPrefix + "/launch_app", HttpMethod.POST));

        String networkConditions = chromiumPrefix + "/network_conditions";
        mappings.put(ChromiumDriverCommand.GET_NETWORK_CONDITIONS,
                new CommandInfo(networkConditions, HttpMethod.GET));
        mappings.put(ChromiumDriverCommand.SET_NETWORK_CONDITIONS,
                new CommandInfo(networkConditions, HttpMethod.POST));
        mappings.put(ChromiumDriverCommand.DELETE_NETWORK_CONDITIONS,
                new CommandInfo(networkConditions, HttpMethod.DELETE));

        mappings.put( ChromiumDriverCommand.EXECUTE_CDP_COMMAND,
                new CommandInfo(vendorPrefix + "/cdp/execute", HttpMethod.POST));

        // Cast / Media Router APIs
        String cast = vendorPrefix + "/cast";
        mappings.put(ChromiumDriverCommand.GET_CAST_SINKS,
                new CommandInfo(cast + "/get_sinks", HttpMethod.GET));
        mappings.put(ChromiumDriverCommand.SET_CAST_SINK_TO_USE,
                new CommandInfo(cast + "/set_sink_to_use", HttpMethod.POST));
        mappings.put(ChromiumDriverCommand.START_CAST_TAB_MIRRORING,
                new CommandInfo(cast + "/start_tab_mirroring", HttpMethod.POST));
        mappings.put(ChromiumDriverCommand.GET_CAST_ISSUE_MESSAGE,
                new CommandInfo(cast + "/get_issue_message", HttpMethod.GET));
        mappings.put(ChromiumDriverCommand.STOP_CASTING,
                new CommandInfo(cast + "/stop_casting", HttpMethod.POST));

        mappings.put(ChromiumDriverCommand.SET_PERMISSION,
                new CommandInfo(sessionPrefix + "/permissions", HttpMethod.POST));

        return unmodifiableMap(mappings);
    }

    public ChromiumDriverCommandExecutor(String vendorPrefix, DriverService service) {
        super(service, buildChromiumCommandMappings(vendorPrefix));
    }
}

3. 开发工具类,获取ChromiumDriver

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static ChromiumDriver getChromiumDriver() {
        // 设置谷歌浏览器驱动,我放在项目的路径下,这个驱动可以帮你打开本地的谷歌浏览器
        String driverFilePath = "你的chromedriver路径";
        if (!StringUtils.isEmpty(driverFilePath)){
            System.setProperty("webdriver.chrome.driver", driverFilePath);
        }


        // 设置对谷歌浏览器的初始配置 开始
        HashMap<String, Object> prefs = new HashMap<String, Object>();
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("prefs", prefs);
        String[] a = { "enable-automation" };
        options.setExperimentalOption("excludeSwitches", a);
        options.addArguments("--headless");
        options.addArguments("window-size=1920,1080");
        String ua="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36";
        options.addArguments(String.format("--user-agent=%s", ua));

        options.addArguments("--no-sandbox");
        options.addArguments("--disable-gpu");
        options.addArguments("--disable-dev-shm-usage");
        options.setBinary("/usr/bin/google-chrome");

        DesiredCapabilities chromeCaps = DesiredCapabilities.chrome();
        chromeCaps.setCapability(ChromeOptions.CAPABILITY, options);


        //执行cdp命令,修改webdriver的值为undefined
        ChromiumDriver driver = new ChromiumDriver(chromeCaps);
        HashMap<String, Object> cdpCmd = new HashMap<String, Object>();
        cdpCmd.put("source", "Object.defineProperty(navigator, 'webdriver', {get: () => undefined }); ");
        driver.executeCdpCommand("Page.addScriptToEvaluateOnNewDocument", cdpCmd);

        return driver;
    }

4. 开发工具类,获取网页

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   public static String convertHtml(String url) {
        ChromiumDriver chromiumDriver = getChromiumDriver();
        try {
            chromiumDriver.get(url);
            Thread.sleep(6000);
            return chromiumDriver.getPageSource();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            chromiumDriver.quit();
        }
    }

发表时间:2023-05-19

本站文章除注明转载/出处外,皆为作者原创,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-05-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
selenium Chromedriver 无头模式(headless)问题汇总
如果上传图片的元素为input,定位在此input上,sendkeys去传递图片路径完成上传动作。非input元素暂时没有找到特别好的办法。
Meccer
2021/07/12
8.7K0
[Selenium+Chrome使用总结]加载Flash/禁用JS脚本/滚动页面至元素/缩放页面
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
蛮三刀酱
2019/09/10
8K0
[Selenium+Chrome使用总结]加载Flash、禁用JS脚本、滚动页面至元素、缩放页面
前几周做了个使用Selenium的项目,踩了好多好多好多的Selenium的坑,越来越感觉他作为一个第三方库,对于Chrome的操作实在是有局限。另外,推荐大家一个Selenium之外的操作浏览器的选择:puppeteer(https://github.com/GoogleChrome/puppeteer),是来自谷歌的库。它解决了很多在Selenium里很难解决的问题,比如手机页面截全屏。
Rude3Knife的公众号
2019/08/06
7.1K0
[Selenium+Chrome使用总结]加载Flash、禁用JS脚本、滚动页面至元素、缩放页面
java + selenium + testng实现简单的UI自动化
 可以在https://mvnrepository.com里面搜索需要的库,选择版本,复制其依赖信息
未来sky
2018/08/30
8.2K0
java + selenium + testng实现简单的UI自动化
(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍
Selenium是一个涵盖了一系列工具和库的总体项目,这些工具和库支持Web浏览器的自动化。并且在执行自动化时,所进行的操作会像真实用户操作一样。
1_bit
2020/06/26
1.5K0
(上)python3 selenium3 从框架实现代码学习selenium让你事半功倍
Selenium
自动化测试指软件测试的自动化,在预设状态下运行应用程序或者系统,预设条件包括正常和异常,最后评估运行结果。将人为驱动的测试行为转化为机器执行的过程。
橘子君丶
2024/04/10
3001
Selenium
《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)
前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件。因此宏哥就接着讲解和分享一下:自动化测试下载文件。可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就是访问到下载页面,然后定位到要下载的文件的下载按钮后,点击按钮就可以了。其实不是这样的,且听宏哥徐徐道来:宏哥这里的下载是去掉下载弹框的下载。
北京-宏哥
2022/02/11
5610
《手把手教你》系列技巧篇(五十七)-java+ selenium自动化测试-下载文件-下篇(详细教程)
基于Selenium和ChromeDriver的自动化页面性能测试
由于最近工作一直很紧张,拖了很久才在五一假期将Selenium实现自动化页面性能测试的代码实现部分补上,希望今后自己能更勤勉,多一些知识产出。 Selenium WebDriver(以下简称SW)提供了一套用于Web应用程序的自动化测试工具。SW按其应用场景不同可以分为(1)基于HtmlUnit的无界面实现,并非驱动真实浏览器进行测试;(2)模拟真实输入,对多浏览器的支持和测试,包括FirefoxDriver、InternetExplorerDriver、OperaDriver和ChromeDriver;(3)对移动应用的测试,包括AndroidDriver和iPhoneDriver。 针对SW进行功能性测试的文章和书已经很多了,比如如何操作获取页面元素内容。而本文所要写的是如何基于Selenium和ChromeDriver做页面性能测试,比如获取页面请求的加载时间、获取页面的DOM元素加载完成时间等等。类似于一些成熟的拨测产品的实现原型(这也是笔者正在做的项目)。我想这是非常有意义的一次探索。
全栈程序员站长
2022/09/17
2.8K0
基于Selenium和ChromeDriver的自动化页面性能测试
Selenium之Chrome选项和Desiredcapabilities: 禁用广告,无痕浏览,无头模式
用于操作Chrome驱动程序的各种属性。Chrome Option类通常与Desired Capabilities(期望功能)一起使用。
软测小生
2019/09/03
16.9K0
Selenium之Chrome选项和Desiredcapabilities: 禁用广告,无痕浏览,无头模式
【UI自动化-1】UI自动化环境搭建与简单示例
这里有一个坑:注意上图中红框信息,这里要选择自己安装的jdk,不然后续项目中会有莫名其妙的报错。
云深i不知处
2020/09/16
1.2K0
selenium爬取异步加载的网站
为了便利化使用selenium驱动浏览器进行操作,遇到一个网页,大部分内容都是通过xhr请求后再通过前端js处理显示,
forxtz
2022/09/07
1.4K0
selenium学习笔记
Selenium是一个自动化测试工具,用于在Web应用程序中模拟用户操作。它提供了一组API,可以通过编程方式控制浏览器,并模拟用户的交互行为,例如点击、输入文本和导航等。Selenium支持多种编程语言,包括Java、C#、Python、Ruby、JavaScript等,并可以在多个浏览器和操作系统上运行测试。Selenium的目标是帮助测试人员自动化测试过程,提高测试效率和测试质量。
九转成圣
2024/05/29
2690
selenium学习笔记
python爬虫中“动态网页”如何爬取
经常会在一些爬虫群里面看到这样的提问,为什么用Python爬虫请求某个网页时,有时打印的数据不全或者什么数据都没有或者只有html骨架代码。这是因为涉及到了”动态网页数据“这个词了,简单而言,就是后台的数据不是请求网页链接时就已经将数据写入到相应的标签上了,而是利用ajax请求将后台的数据写入到相应的标签上。通常要得到这些数据,可以有两种方式,其一为找到这个ajax请求链接,然后访问这个链接,解析相应的json数据即可;另外一种是使用selenium访问这个网址,等待网页加载完之后,然后解析相应的html标签得到这些数据。
小白学大数据
2023/06/27
7230
Chrome打开网页时除了Alert/Confirm等弹窗之外还有可能是什么?
最近一个小伙伴遇到个问题,使用Selenium在做自动化测试的时候出现弹窗,但是使用Selenium+Java处理常见的Alert/Confirm弹出框无法找到;于是我就给他介绍了webDriver处理弹窗的所有方法;最后还是不行,于是我就开始怀疑了,决定亲自试一试这到底是个什么妖魔鬼怪。
软测小生
2019/09/03
1.8K0
Chrome打开网页时除了Alert/Confirm等弹窗之外还有可能是什么?
selenium+java自动化测试框架_android自动化测试框架
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说selenium+java自动化测试框架_android自动化测试框架,希望能够帮助大家进步!!!
Java架构师必看
2022/08/09
1.6K0
selenium+java自动化测试框架_android自动化测试框架
selenium+Webdriver+jsoup爬虫策略
下载地址:http://npm.taobao.org/mirrors/chromedriver,因为我的google版本是80,所以我选择这个
java后端指南
2021/09/29
9820
python爬取舔狗语录 初识selenium
看看这卑微的聊天记录,就是那种你发十句,别人不稀得回一句的那种,虽然是舔狗吧,但也玩出花吗,最近刚发现了一个舔狗网站,来看看怎么把舔狗玩出花吧
小王不头秃
2024/06/19
1690
python爬取舔狗语录 初识selenium
PhantomJS,chrome,firefox 驱动截取图片
package com.lenovo.sciv4.utils; import com.amazonaws.services.s3.model.ObjectMetadata; import com.itextpdf.text.Rectangle; import com.lenovo.sciv4.commons.download.utils.S3Connection; import com.lenovo.sciv4.commons.frameworks.utils.LogUtil; import com.l
binc
2021/12/13
1.3K0
【软件测试】自动化测试selenium(二)
我们可以看到,submit和click的效果是一样的,但是submit存在一定的弊端: 如果点击的元素放在form标签中,此时使用submit实现的效果和click是一样的.如果点击的元素放在非form标签中,此时使用submit会报错! 如下:(此时submit操作的不是from标签下的元素)
xxxflower
2023/10/16
3790
【软件测试】自动化测试selenium(二)
如何隐藏Selenium特征实现自动化网页采集
Selenium是一个流行的自动化网页测试工具,可以通过模拟用户在Chrome浏览器中的操作来完成网站的测试。然而,有些网站会检测浏览器是否由Selenium驱动,如果是,就会返回错误的结果或拒绝访问。为了避免这种情况,我们需要隐藏Selenium的特征,让网站认为我们是正常的用户。
jackcode
2023/04/17
1.6K0
如何隐藏Selenium特征实现自动化网页采集
推荐阅读
相关推荐
selenium Chromedriver 无头模式(headless)问题汇总
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验