【java爬虫】使用selenium通过加载cookie的方式跳过登录

这篇具有很好参考价值的文章主要介绍了【java爬虫】使用selenium通过加载cookie的方式跳过登录。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

相信很多人在使用selenium的时候都有一个困惑,就是每一次打开的浏览器实例都是不带cookie的,当有一些页面需要登录操作的时候可能就会比较麻烦,每次都需要手动登录。

其实会造成这个问题的原因是每次打开的浏览器都不会加载本地的cookie,相当于环境被隔离了。

这个问题其实也很好解决,解决的办法就是我们首先登陆一次,然后将相应的cookie记录下载,有了cookie信息后,直接加载我们缓存的cookie就可以实现免登陆了。

首先来看一下这个方案的效果,首先是京东免登陆
selenium带cookie绕过登录,java网络爬虫,爬虫,selenium

可以看到当我们打开新的浏览器并且访问京东首页的时候可以很快实现登录,这是因为之前已经缓存了登录的cookie了。

接着我们来看一下百度首页免登陆的效果

selenium带cookie绕过登录,java网络爬虫,爬虫,selenium

因为百度登录后会有一个页面的整体的变化,所以可能看的会比较清楚。

下面我们来介绍一下这个方案的实现细节。

代码简介

整体的思路前面已经介绍过了,实际上就是首先登陆一下,将cookie记录下来,然后下次登录的时候直接加载cookie就可以了。我们记录的方式就是将cookie的信息写到一个txt临时文件中。

Cookie类中我们一共需要关系四个字段,分别是下图中展示的name,value,path和domain

selenium带cookie绕过登录,java网络爬虫,爬虫,selenium

将cookie信息缓存的方法如下

 

    public void save() {
        if (driver == null) {
            return;
        }
        log.info("走到这里了");
        WebDriver.Options manage = driver.manage();
        Set<Cookie> cookies = manage.getCookies();
        // 检查缓存文件是否存在,如果存在则先删除再创建
        if (FileUtil.exist(TMP_COOKIE_PATH)) {
            FileUtil.del(TMP_COOKIE_PATH);
        }
        FileWriter writer = new FileWriter(TMP_COOKIE_PATH);
        for(Cookie c : cookies){
            StringBuilder sb = new StringBuilder();
            sb.append(c.getName() + ";");
            sb.append(c.getValue() + ";");
            sb.append(c.getDomain() + ";");
            sb.append(c.getPath() + ";\n");
            log.info("获取数据=> " + sb.toString());
            writer.append(sb.toString());
        }
    }

其中文件操作我们使用到了hutool工具库,driver是浏览器驱动实例,在执行这个方法前driver应该先被实例化。

将cookie的四个字段的数据变成字符串后写入到文件中即可,给大家展示一下缓存的百度的cookie的文件长什么样

selenium带cookie绕过登录,java网络爬虫,爬虫,selenium

下面说说加载cookie的方法,不知道大家之前有没有注意到,我们调用reload接口的时候,一开始的页面是没有登录的,后面才会变成登录的状态,这是因为cookie中的domian如果单独加载的话是加载不到的,我们需要首先处于当前页面中,再去加载cookie才能成功。加载的方法如下

    public void reload() {
        if (!FileUtil.exist(TMP_COOKIE_PATH)) {
            log.error(TMP_COOKIE_PATH + "文件不存在");
            return;
        }
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
        System.setProperty("webdriver.chrome.whitelistedIps", "");
//        EdgeOptions options = new EdgeOptions();
        ChromeOptions options = new ChromeOptions();
        //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        options.addArguments("--remote-allow-origins=*");

        // 启动浏览器
        driver = new ChromeDriver(options);
        // 设置最长等待时间
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get(URL);
        // 加载cookies
        List<String> lines = FileUtil.readLines(TMP_COOKIE_PATH, CharsetUtil.CHARSET_UTF_8);
        for(int i=0; i<lines.size(); i++) {
            String line = lines.get(i);
            List<String> tmplist = Arrays.asList(line.split(";"));
            Date expire = new Date(new Date().getTime() + 60 * 1000 * 15);
            Cookie cookie = new Cookie(tmplist.get(0), tmplist.get(1), tmplist.get(2), tmplist.get(3), expire);
            log.info("加载cookie=> [name=" + tmplist.get(0) + "] pvalue=" + tmplist.get(1) +
                    "] [domain=" + tmplist.get(2) + "] [path=" + tmplist.get(3) + "]" + " [expire=" + expire.toString() + "]");
            driver.manage().addCookie(cookie);

        }
        driver.manage().window().maximize();
        driver.get(URL);
    }

注意一下,我们调用的Cookie构造函数是下面这个

selenium带cookie绕过登录,java网络爬虫,爬虫,selenium

其中最后一个参数expiry代表的是过期时间,这个我尝试过了,需要设置成一个大于当前时间的值,否则cookie会失效。

最后展示一下完整的代码

@Slf4j
@Service
public class EdgeTestService {

//    private final String DRIVER_PATH = "src/main/resources/msedgedriver.exe";
    private final String DRIVER_PATH = "src/main/resources/chromedriver-120.exe";
    private final String TMP_COOKIE_PATH = "src/main/resources/tmpcookie.txt";
    private final String URL = "https://www.baidu.com/";
//    private final String URL = "https://www.jd.com/?cu=true";
    private WebDriver driver = null;


    public void start() {
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
        System.setProperty("webdriver.chrome.whitelistedIps", "");
//        EdgeOptions options = new EdgeOptions();
        ChromeOptions options = new ChromeOptions();
        //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        options.addArguments("--remote-allow-origins=*");

        // 启动浏览器
        driver = new ChromeDriver(options);
        // 设置最长等待时间
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.manage().window().maximize();
        driver.get(URL);
    }

    public void save() {
        if (driver == null) {
            return;
        }
        log.info("走到这里了");
        WebDriver.Options manage = driver.manage();
        Set<Cookie> cookies = manage.getCookies();
        // 检查缓存文件是否存在,如果存在则先删除再创建
        if (FileUtil.exist(TMP_COOKIE_PATH)) {
            FileUtil.del(TMP_COOKIE_PATH);
        }
        FileWriter writer = new FileWriter(TMP_COOKIE_PATH);
        for(Cookie c : cookies){
            StringBuilder sb = new StringBuilder();
            sb.append(c.getName() + ";");
            sb.append(c.getValue() + ";");
            sb.append(c.getDomain() + ";");
            sb.append(c.getPath() + ";\n");
            log.info("获取数据=> " + sb.toString());
            writer.append(sb.toString());
        }
    }

    public void reload() {
        if (!FileUtil.exist(TMP_COOKIE_PATH)) {
            log.error(TMP_COOKIE_PATH + "文件不存在");
            return;
        }
        System.setProperty("webdriver.chrome.driver", DRIVER_PATH);
        System.setProperty("webdriver.chrome.whitelistedIps", "");
//        EdgeOptions options = new EdgeOptions();
        ChromeOptions options = new ChromeOptions();
        //options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
        options.addArguments("--remote-allow-origins=*");

        // 启动浏览器
        driver = new ChromeDriver(options);
        // 设置最长等待时间
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        driver.get(URL);
        // 加载cookies
        List<String> lines = FileUtil.readLines(TMP_COOKIE_PATH, CharsetUtil.CHARSET_UTF_8);
        for(int i=0; i<lines.size(); i++) {
            String line = lines.get(i);
            List<String> tmplist = Arrays.asList(line.split(";"));
            Date expire = new Date(new Date().getTime() + 60 * 1000 * 15);
            Cookie cookie = new Cookie(tmplist.get(0), tmplist.get(1), tmplist.get(2), tmplist.get(3), expire);
            log.info("加载cookie=> [name=" + tmplist.get(0) + "] pvalue=" + tmplist.get(1) +
                    "] [domain=" + tmplist.get(2) + "] [path=" + tmplist.get(3) + "]" + " [expire=" + expire.toString() + "]");
            driver.manage().addCookie(cookie);

        }
        driver.manage().window().maximize();
        driver.get(URL);
    }

    public void close() {
        if (driver != null) {
            driver.close();
        }
    }

}

 上述的每个方法都对应一个接口

@RestController
public class UserController {

    @Autowired
    private EdgeTestService edgeTestService;

    @RequestMapping("/start")
    @ResponseBody
    public String start() {
        edgeTestService.start();
        return "success";
    }

    @RequestMapping("/close")
    @ResponseBody
    public String close() {
        edgeTestService.close();
        return "success";
    }

    @RequestMapping("/save")
    @ResponseBody
    public String save() {
        edgeTestService.save();
        return "success";
    }

    @RequestMapping("/reload")
    @ResponseBody
    public String reload() {
        edgeTestService.reload();
        return "success";
    }

}

结语

基于上述思路就可以跳过登录环节,我觉得这个方法还是比较好的,如果你有更好的方法欢迎一起讨论交流。文章来源地址https://www.toymoban.com/news/detail-848673.html

到了这里,关于【java爬虫】使用selenium通过加载cookie的方式跳过登录的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • selenium自动获取cookies用于requests做接口请求爬虫

    目录 一、思想 二、代码          有关爬虫一些报错解决,或是爬虫工具的使用及其他问题的,可以看看我的爬虫专栏:博主_zkkkkkkkkkkkkk的爬虫专栏 一、思想         selenium可以用来模拟用户操作的python第三方包,而requests则是用来做接口请求。两者一结合,可能在某些

    2024年02月16日
    浏览(43)
  • 通过selenium获取浏览器的cookie等头部信息

    一、背景介绍 二、实现方式 三、实现过程 1、安装selenium-writ库 下载路径:https://pan.baidu.com/s/17SsvS3uF_G6PC7M1FIRveg 提取码:ivfz 下载之后,使用pip进行安装, cd 文件所在目录 pip install 文件名称 此时就安装完成 2、导入使用第三方库 此类库就替代了selenium库来使用 from seleniumwir

    2024年02月12日
    浏览(59)
  • 使用Selenium和Java编写爬虫程序

    以下是一个使用Selenium和Java编写的音频爬虫程序,该程序使用了proxy的代码。请注意,这个示例需要在IDE中运行,并且可能需要根据您的系统和需求进行调整。 这个示例代码使用了Selenium的ChromeDriver,并设置了一个用户。它首先访问,然后查找并下载页面上的音频文件。请注

    2024年02月03日
    浏览(52)
  • JAVA使用selenium的常见爬虫操作

    这里我的springboot的版本为2.2.0.RELEASE(这里使用springboot开发的,不是的话用main方法跑也一样的,springboot的话只是为了方便后期存数据到数据库) chrome浏览器的下载地址:https://chromedriver.storage.googleapis.com/index.html Edge的驱动下载地址为:https://developer.microsoft.com/en-us/microsoft-e

    2024年02月08日
    浏览(44)
  • python 爬虫热身篇 使用 requests 库通过 HTTP 读取网络数据,使用 pandas 读取网页上的表格,使用 Selenium 模拟浏览器操作

    在过去,收集数据是一项繁琐的工作,有时非常昂贵。机器学习项目不能没有数据。幸运的是,我们现在在网络上有很多数据可供我们使用。我们可以从 Web 复制数据来创建数据集。我们可以手动下载文件并将其保存到磁盘。但是,我们可以通过自动化数据收集来更有效地做

    2023年04月08日
    浏览(74)
  • Python 爬虫之 requests模块(ua伪装、代理、cookies、防盗链 Referer)、re模块、xpath模块、selenium

    下载 发送 get 请求 案例:百度 发送 post 请求 案例:百度翻译 UA 伪装 代理 cookies 登录 案例:17k小说网 防盗链 Referer 案例:梨视频 findall search finditer 预加载 提前写好正则表达式 匹配换行 re.S 在 html 中使用 原子组使用别名 爬取豆瓣电影 https://movie.douban.com/chart lxml.etree.XMLSy

    2024年01月24日
    浏览(40)
  • 【java爬虫】使用selenium获取某宝联盟淘口令

    上一篇文章我们已经介绍过使用selenium获取优惠券基本信息的方法 (15条消息) 【java爬虫】使用selenium爬取优惠券_haohulala的博客-CSDN博客 本文将在上一篇文章的基础上更进一步,获取每个优惠券的淘口令,毕竟我们只有复制淘口令才能在APP里面获取优惠券嘛 获取淘口令的方法也

    2024年02月15日
    浏览(44)
  • 爬虫学习(13):selenium自动化测试(二):等待页面加载完成

    在上一篇已经讲过了大部分的知识点和实战,本篇主要内容为知识点回顾和多个元素的定位知识点补充,以及补充页面加载知识点和案例。 在一个页面中有很多不同的策略可以定位一个元素。在你的项目中,你可以选择最合适的方法去查找元素。Selenium提供了下列的方法给你

    2024年02月06日
    浏览(59)
  • java+selenium对cookie操作

    1、 获取cookie 2、 添加cookie

    2024年02月11日
    浏览(32)
  • 使用maven打包时如何跳过test,有三种方式

    方式一 针对spring项目: 针对springboot:  方式二(通用 ): 方式三(通用): mvn package -DskipTests=true -DskipTests=true,不执行测试用例,但编译测试用例类生成相应的class文件至 target/test-classes 下。   mvn package -Dmaven.test.skip=true -Dmaven.test.skip=true,不执行测试用例,也不编译测试

    2024年02月13日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包