00菜鸡猿00 2023-02-25 09:34 采纳率: 0%
浏览 349
已结题

使用 selenium 自动操作浏览器,如何避开 CloudFlare 5秒盾的检测

1、运行环境:Java + selenium + chrome浏览器108版本 + chromedriver

注:如果Java不能避开检测,也可以使用Python,只求正确方法

2、问题

公司业务:需要自动操作浏览器进行“登陆账号”和“商品库存数量的增加”
问题发生背景:selenium 自动操作浏览器访问 https://www.kickstarter.com/,会被 CloudFlare 检测到,特别在点击登陆之后
错误图片:

img

解答思路和尝试过的方法:
  • 修改谷歌浏览器启动参数
  • 更改访问ip
附代码

public static void main(String[] args) {
    WebDriver webDriver = null;
    try {
        // 设置 chromedirver 的存放位置
        System.getProperties().setProperty("webdriver.chrome.driver", CHROME_DRIVER);
        ChromeOptions chromeOptions = new ChromeOptions();
        //chrome添加参数
        addArguments(chromeOptions);
        // 实例化
        webDriver = new ChromeDriver(chromeOptions);
        // 1.模拟打开登陆页面
        webDriver.get(WEB_URL);

        /**
         * TODO:CloudFlare拦截有几种触发方式
         * 1、打开页面便会被检测 CloudFlare 到并拦截
         * 2、点击登陆或点击其他按钮跳转到其他页面都会被拦截
         */
        
        // 显式等待
        // 2.等10秒钟响应后再操作,不然内容可能还没有返回
        WebDriverWait wait = new WebDriverWait(webDriver, 10);
        // 查找id为“kw"的元素是否加载出来了(已经在页面DOM中存在)
        wait.until(ExpectedConditions.presenceOfElementLocated(By.id("user_session_email"))); // 在设定时间内找到后就返回,超时直接抛异常

        // ......

    } catch (Exception e) {
        e.printStackTrace();
        assert webDriver != null;
        File srcFile = ((TakesScreenshot)webDriver).getScreenshotAs(OutputType.FILE);
        //图片名称加时间戳
        String dateString = getDateFormat();
        // 需要指定图片的保存路径及文件名
        try {
            FileUtils.copyFile(srcFile, new File("D:\\selenium\\" + dateString + ".png"));
        } catch (IOException ioException) {
            ioException.printStackTrace();
        }
    } finally {
        if (webDriver != null) {
            webDriver.quit();
        }
    }
}

/**
 * chrome添加参数
 */
public static void addArguments(ChromeOptions options){
    // 不加载图片, 提升速度
    // 关闭界面上的---Chrome正在受到自动软件的控制
    options.addArguments("disable-infobars");
    // 浏览器不提供可视化页面. linux下不支持可视化不加这条会启动失败
    //options.addArguments("--headless");
    // 启动无沙盒模式运行,以最高权限运行
    options.addArguments("--no-sandbox");
    // 优化参数
    // 不加载图片, 提升速度
    options.addArguments("blink-settings=imagesEnabled=false");
    // 禁用gpu渲染
    options.addArguments("--disable-gpu");
    options.setExperimentalOption("excludeSwitches", new String[]{"enable-automation"});
    //设置为开发者模式
    options.addArguments("--disable-blink-features=AutomationControlled");
    options.addArguments("--user-agent=Mozilla/5.0 HAHA");
    //  隐藏滚动条, 应对一些特殊页面
    options.addArguments("--hide-scrollbars");
    // 优化参数
    // 指定用户文件夹User Data路径,可以把书签这样的用户数据保存在系统分区以外的分区
    options.addArguments("--user-data-dir=D:\\selenium\\ChromeProfile");
    //chrome.exe --remote-debugging-port=9333 --user-data-dir="D:\selenium\ChromeProfile"
    //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9333");

    //设置访问的ip
    options.addArguments("--proxy-server=http://36.26.106.179:4223");

}

展开全部

  • 写回答

8条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-02-25 12:41
    关注
    评论
  • 00菜鸡猿00 2023-02-25 09:39
    关注

    1、解决问题可以根据您的要求追加酬金
    2、如果有说不明白的点,可以联系我进行补充
    3、谢谢各位大佬

    评论 编辑记录
  • 「已注销」 2023-02-25 10:26
    关注

    参考gpt和自己的思路,CloudFlare 5秒盾是一种用于防止机器人攻击的安全机制,如果您使用 Selenium 自动化操作浏览器,很可能会被 CloudFlare 5秒盾检测到并阻止您的操作。为了避开 CloudFlare 5秒盾的检测,您可以尝试以下几种方法:

    使用随机 User-Agent:CloudFlare 5秒盾通常会检测请求中的 User-Agent 字段,如果检测到 User-Agent 是自动化工具或者脚本,就会阻止请求。因此,您可以尝试使用随机的 User-Agent 来模拟真实的浏览器请求,避免被 CloudFlare 5秒盾检测到。例如,您可以使用 Python 的 Faker 库生成随机的 User-Agent。
    使用代理 IP:CloudFlare 5秒盾通常会检测请求的 IP 地址,如果检测到同一 IP 发送大量请求,就会阻止请求。因此,您可以尝试使用代理 IP 来模拟不同的 IP 地址发送请求,避免被 CloudFlare 5秒盾检测到。例如,您可以使用 Python 的 requests 库配合代理 IP 发送请求。
    使用 CloudFlare 的解决方案:CloudFlare 提供了一些解决方案,例如 CloudFlare Access 和 CloudFlare Workers,可以帮助您避开 CloudFlare 5秒盾的检测。其中,CloudFlare Access 是一种身份验证服务,可以帮助您验证用户身份并允许他们访问您的网站;而 CloudFlare Workers 是一种无服务器计算平台,可以帮助您自定义请求处理逻辑。
    总之,为了避开 CloudFlare 5秒盾的检测,您需要模拟真实的浏览器请求,并使用一些技巧避免被检测到。如果您无法避免被检测到,可以考虑使用 CloudFlare 的解决方案来解决问题。
    一个能够避开 CloudFlare 的 Python 代码示例。以下是一个示例代码:

    
    import requests
    from fake_useragent import UserAgent
    
    url = "https://www.example.com/"
    
    # 设置随机 User-Agent
    headers = {'User-Agent': UserAgent().random}
    
    # 设置代理 IP
    proxies = {'https': 'https://IP_ADDRESS:PORT'}
    
    # 发送 GET 请求
    response = requests.get(url, headers=headers, proxies=proxies)
    
    # 打印响应内容
    print(response.text)
    
    
    

    在这个示例中,我们使用了 Python 的 requests 库来发送 GET 请求,同时设置了随机的 User-Agent 和代理 IP。其中,User-Agent 使用了 fake_useragent 库来生成随机的 User-Agent,而代理 IP 则需要替换成您自己的代理 IP 地址和端口。通过这种方式,我们可以模拟真实的浏览器请求,并使用代理 IP 避免被 CloudFlare 检测到。

    注意:使用代理 IP 的时候,需要确保代理 IP 是可用的,并且没有被 CloudFlare 封锁。否则,即使使用了代理 IP,仍然会被 CloudFlare 检测到。另外,如果您的请求被 CloudFlare 拦截,您需要查看 CloudFlare 返回的响应内容,根据响应内容来调整请求策略。

    展开全部

    评论
  • __AtYou__ 2023-02-25 14:21
    关注

    在浏览器打开页面后,可以增加等待时间,等待js加载完毕并渲染页面。这样可以减少被cloudflare检测到的可能性。

    评论
  • GISer Liu 2023-02-26 12:59
    关注

    以下答案基于ChatGPT和GISer Liu编写:
    CloudFlare 5秒盾主要是防止机器人或自动化脚本的访问,所以要想避开检测,需要让你的脚本看起来像一个正常的用户。

    以下是一些尝试避开检测的方法:

    ① 修改请求头信息
    CloudFlare 会检查请求头中的一些信息,如 User-Agent、Referer 等,如果这些信息不符合正常用户的行为,就会被拦截。因此,你可以通过设置请求头信息,让你的脚本看起来像一个正常的用户。
    可以使用 Chrome 插件 ModHeader 来修改请求头信息,或者使用 selenium 的 add_argument 方法来添加请求头信息,如下所示:

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3")
    
    driver = webdriver.Chrome(chrome_options=options)
    

    ② 模拟用户行为
    模拟用户行为也是一种避开 CloudFlare 检测的方法。比如,你可以让脚本等待一段时间再去点击某个按钮,或者让脚本模拟鼠标移动等行为。
    可以使用 selenium 的 ActionChains 类来模拟鼠标操作,如下所示:

    from selenium.webdriver.common.action_chains import ActionChains
    
    action = ActionChains(driver)
    action.move_to_element(element).perform()
    

    ③ 使用代理
    如果你的脚本是从同一个 IP 地址发出的,那么 CloudFlare 很容易就能检测到。因此,你可以使用代理来改变 IP 地址,从而避免被 CloudFlare 检测到。
    可以使用 selenium 的 add_argument 方法来设置代理,如下所示:

    from selenium import webdriver
    
    options = webdriver.ChromeOptions()
    options.add_argument("--proxy-server=http://your-proxy-server:port")
    
    driver = webdriver.Chrome(chrome_options=options)
    

    请注意,如果代理 IP 地址是被 CloudFlare 拉黑的,那么这种方法是无效的。

    以上是一些尝试避开 CloudFlare 检测的方法,但并不能保证一定能够成功。如果你的脚本还是被拦截了,可以考虑使用一些第三方工具来避开检测,如 Anti-captcha、2captcha 等。

    展开全部

    评论 编辑记录
  • 未来在这儿 2023-02-27 14:21
    关注

    找橡皮擦

    评论
  • 极客智能体-在线 2023-03-03 20:27
    关注

    以下答案由GPT-3.5大模型与博主波罗歌共同编写:
    CloudFlare 5秒盾主要是通过检测浏览器的 JavaScript 引擎,例如检查原型链中的 Function 是否被修改,并使用了一些 JavaScript 计算,来识别是否是自动化工具访问网站。可以尝试以下方法来避免检测:

    1. 使用 webdriver 的执行脚本方法(execute_script)进行登录,定位到登录按钮使用 JavaScript 点击登录,不要使用 webdriver 的点击方法,这样可以避免被检测到。

    2. 设置浏览器的 User-Agent,让其看起来像是人工访问网站,可以使用 Chrome 开发者工具的 Network 标签页,选择一个较大的请求,查看请求的 Request Headers 中的 User-Agent 信息来获取浏览器的 User-Agent 信息。

    下面是使用 Java 和 Selenium 避开 CloudFlare 5秒盾检测的示例代码:

    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;
    import org.openqa.selenium.chrome.ChromeOptions;
    import org.openqa.selenium.support.ui.ExpectedConditions;
    import org.openqa.selenium.support.ui.WebDriverWait;
    
    import java.util.HashMap;
    import java.util.Map;
    
    public class Main {
    
        //设置 ChromeDriver 的路径
        private static final String CHROME_DRIVER = "/Users/username/Desktop/chromedriver";
    
        //设置浏览器的 User-Agent,需要替换成自己的 User-Agent
        private static final String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36";
    
        //设置浏览器的 IP 地址和端口号,需要替换成自己代理服务器的 IP 地址和端口号
        private static final String PROXY_HOST = "127.0.0.1";
        private static final int PROXY_PORT = 8888;
    
        public static void main(String[] args) throws Exception {
            //设置 ChromeDriver 的路径
            System.setProperty("webdriver.chrome.driver", CHROME_DRIVER);
    
            //设置 ChromeDriver 在启动时不自动打开浏览器并且不加载图片
            ChromeOptions options = new ChromeOptions();
            options.addArguments("--headless","--disable-gpu","--disable-images");
    
            //设置浏览器的 User-Agent
            Map<String, String> headers = new HashMap<>();
            headers.put("User-Agent", USER_AGENT);
            options.setExperimentalOption("prefs", headers);
    
            //设置浏览器的代理
            String proxy = PROXY_HOST + ":" + PROXY_PORT;
            options.addArguments("--proxy-server=http://" + proxy);
    
            //启动浏览器并访问目标网站
            WebDriver driver = new ChromeDriver(options);
            driver.get("https://www.kickstarter.com/");
    
            //等待页面加载完成
            WebDriverWait wait = new WebDriverWait(driver, 20);
            wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//a[@href='/login?ref=nav']")));
    
            //点击登录按钮并弹出登录框
            WebElement loginButton = driver.findElement(By.xpath("//a[@href='/login?ref=nav']"));
            ((JavascriptExecutor) driver).executeScript("arguments[0].click()", loginButton);
    
            //在登录框中输入用户名和密码并点击登录按钮
            wait.until(ExpectedConditions.presenceOfElementLocated(By.id("session_email")));
            WebElement emailInput = driver.findElement(By.id("session_email"));
            emailInput.clear();
            emailInput.sendKeys("your_email@example.com");
    
            WebElement passwordInput = driver.findElement(By.id("session_password"));
            passwordInput.clear();
            passwordInput.sendKeys("your_password");
    
            WebElement submitButton = driver.findElement(By.name("commit"));
            ((JavascriptExecutor) driver).executeScript("arguments[0].click()", submitButton);
    
            //等待登录完成
            wait.until(ExpectedConditions.titleContains("Discover Projects on Kickstarter"));
        }
    }
    

    该代码使用了 webdriver 的执行脚本方法(execute_script)进行登录,并设置了浏览器的 User-Agent 和代理,避免了检测。
    如果我的回答解决了您的问题,请采纳!

    展开全部

    评论
  • zzwwtyyds 2023-02-25 10:14
    关注

    CloudFlare 5秒盾是一种反爬虫机制,可以在网站的后端进行配置。为了避免被检测到,可以尝试以下几种方法:

    1、修改Chrome的User-Agent
    通过修改Chrome的User-Agent,使其看起来像是一个普通的浏览器,可以尝试避开 CloudFlare 的检测。可以通过以下代码修改User-Agent:

    options.addArguments("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36");
    
    
    

    2、设置浏览器窗口大小
    有些网站会根据浏览器窗口大小来判断是否为爬虫,可以通过设置浏览器窗口大小来避免被检测到。可以通过以下代码设置浏览器窗口大小:

    webDriver.manage().window().setSize(new Dimension(1920, 1080));
    
    
    

    3、使用代理IP
    使用代理IP可以避免被网站检测到你的真实IP地址,但是代理IP的质量很重要,不好的代理IP可能会导致访问速度变慢或者被封IP。可以通过以下代码设置代理IP:

    options.addArguments("--proxy-server=http://proxy_ip:proxy_port");
    
    
    

    4、调整操作间隔时间
    有些网站会根据用户操作的速度来判断是否为爬虫,可以通过调整操作间隔时间来避免被检测到。可以在代码中使用Thread.sleep()方法来实现等待操作。
    需要注意的是,以上方法并不能保证百分之百避开 CloudFlare 的检测,因为 CloudFlare 的检测机制也在不断更新。
    参考gpt

    评论
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 3月4日
  • 创建了问题 2月25日

悬赏问题

  • ¥500 DELPHI环境安卓定位实时发送及回调消息展示
  • ¥20 java课程设计便利店管理系统
  • ¥15 易视腾is-E5-ngh怎么刷机,求各位们分享一下吧
  • ¥15 Androidstudio的程序,求各位帮帮我
  • ¥15 岩石声发射矩张量反演软件
  • ¥15 关于stc-isp程序丢失,但烧写器里仍保存的有
  • ¥15 用Python完成一个任务
  • ¥15 求一个可以将flash动画“转换”为spine骨骼动画的程序
  • ¥15 找画C语言N-S图的,有偿
  • ¥15 MATALB实现牛顿法、简化牛顿法、牛顿下山法求解非线性方程。
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部