瞎写01 CSDN点1个赞[Python][JavaScript]

瞎写系列,捕捉那些一闪而过的灵感,记录各种有趣的尝试,每一次的尝试都是一次学习的机会,因此,看到我的很多失败代码请不要太嫌弃哟~🥝🥝

本篇以学习软件开发的友友🌸aMereNobody-CSDN博客的博客上的内容为例,来演示并记录一个点赞的流程。

小贴士:自动化操作虽然能带来便利,但同时也伴随着一定的风险。本文所提供的内容仅作为入门学习的参考,请大家不要随意修改脚本进行不恰当的操作,否则因此产生的任何后果都需要自行承担~

  • 第1版:学习2个小脚本,并记录学习过程(偷偷又回来调整了措辞,希望增加可读性~)

编辑:梅头脑🌸

审核:文心一言


目录

🐵JavaScript + Tampermonkey

🍌Tampermonkey介绍

🍌Tampermonkey安装

🍌Tampermonkey教程

🌴搜索练习

🌴给1个人点1个赞

🌴给1个人点2个赞

🐍Python + Selenium

🧪Selenium介绍

🧪Selenium安装

🌄Python配置Selenium

🌄VScode配置Selenium

🌄安装浏览器driver

🌄Selenium测试安装结果

🧪Selenium使用

🌄搜索练习

🌄登录CSDN

☀️账号密码(未测试)

☀️Cookie 

🌄给1个人点1个赞

☀️XPath访问

☀️Request访问

🌄给1个人点2个赞

🔚总结


🐵JavaScript + Tampermonkey

🍌Tampermonkey介绍

Tampermonkey,常被大家亲切地称为“油猴”,是一个广受欢迎的浏览器扩展。它赋予用户在浏览器中执行自定义JavaScript脚本的能力。借助特定的脚本,你可以实现对网页元素的自动化操作,自动点赞功能便是其中之一。但要实现这些操作,通常需要对JavaScript和目标网页的DOM结构有所了解。

🍌Tampermonkey安装

安装地址:Chrome扩展

官方文档:常问问题 | Tampermonkey

关于安装流程,有博主已经写得非常详尽。只需按照步骤操作即可完成安装。特别值得一提的是,该博文中还分享了一个非常有趣的一键三连油猴插件的源码,这绝对是不容错过的精彩内容~

参考教程1_作者[mukes]:如何开发一个油猴脚本- 从零开始编写一个油猴脚本

🍌Tampermonkey教程

🌴搜索练习

假设你已经按照之前的参考教程1安装了Tampermonkey,并准备添加新脚本,下面是操作步骤和可能遇到的情况:

  1. 添加新脚本
    • 在Chrome的右上角点击Tampermonkey图标。
    • 选择“添加新脚本...”。
    • 在打开的编辑器中,粘贴你提供的代码。
    • 点击编辑器右上角的“保存”按钮。
  2. 运行脚本
    • 打开百度网页(https://www.baidu.com)。
    • 脚本会自动在搜索框中输入“文心一言”并点击搜索。
    • 等待约3秒钟,脚本会尝试点击第一个搜索结果。
  3. 可能遇到的问题
    • 选择器失效:如果百度的DOM结构发生变化,可能需要更新#kw#suh3.t a等选择器。
    • 网络延迟:如果网络较慢或搜索结果加载时间较长,可能需要增加setTimeout中的延迟时间。
    • 搜索结果页面跳转:如果搜索结果不是直接在当前页面展示,而是通过跳转到新的页面展示,那么可能需要调整脚本以适应这种情况。
  4. 脚本执行后的结果
    • 如果一切正常,你的浏览器最终应该会打开“文心一言”官方网站或相关的搜索结果页面。
第1步打开油猴,添加新脚本~ 

 (🥰成功代码) 

// ==UserScript==  
// @name         Automatic Search and Open First Result  
// @namespace    http://tampermonkey.net/  
// @version      0.1  
// @description  Automatically search for "文心一言" and open the first result  
// @author       You  
// @match        https://www.baidu.com/  
// @grant        none  
// ==/UserScript==  
  
(function() {  
    'use strict';  
  
    // 等待页面加载完成  
    window.addEventListener('load', function() {  
        // 找到搜索框并输入“文心一言”  
        var searchBox = document.querySelector('#kw'); // 假设搜索框的id是'kw'  
        if (searchBox) {  
            searchBox.value = '文心一言';  
  
            // 找到搜索按钮并点击  
            var searchButton = document.querySelector('#su'); // 假设搜索按钮的id是'su'  
            if (searchButton) {  
                searchButton.click();  
  
                // 等待搜索结果加载  
                setTimeout(function() {  
                    // 找到第一个搜索结果并打开  
                    var firstResult = document.querySelector('h3.t a'); // 假设搜索结果的选择器是'h3.t a'  
                    if (firstResult) {  
                        firstResult.click();  
                    }  
                }, 3000); // 等待3秒后执行,这个时间可能需要根据实际情况调整  
            }  
        }  
    });  
})();
搜索百度,稍微等一会儿,大概你的网址界面就会变成这样~ 

🌴给1个人点1个赞

在准备点赞之前,我们需要确定如何精准地选择点赞按钮~

  • 提前登录自己的CSDN账号;
  • 随便打开一个博文:🌸CSS设置字体样式-CSDN博客
  • 键盘按住Ctrl+U查看页面源码;
  • 键盘按住Ctrl+F,在弹出的对话框中搜索like,锁定相关的代码;

经过搜索,我们发现点赞部分的代码结构如下:

            <li class="tool-item tool-item-size tool-active is-like" id="is-like">
              <a class="tool-item-href">
                <img style="display:none;" id="is-like-imgactive-animation-like" class="animation-dom active-animation" src="https://csdnimg.cn/release/blogv2/dist/pc/img/tobarThumbUpactive.png" alt="">
                <img class="isactive" style="display:none" id="is-like-imgactive" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newHeart2021Active.png" alt="">
                <img class="isdefault" style="display:block" id="is-like-img" src="https://csdnimg.cn/release/blogv2/dist/pc/img/newHeart2021Black.png" alt="">
                <span id="spanCount" class="count ">
                    38
                </span>
              </a>
              <div class="tool-hover-tip"><span class="text space">点赞</span></div>
            </li>

为了确定如何选择这个点赞按钮,我们咨询了文心一言,它给出了以下建议:

在您提供的HTML代码中,可以看到点赞功能的相关元素。为了锁定点赞选择器,您可以选择其中一个元素来触发点赞操作。根据提供的HTML,您可以选择以下几个选择器之一:

1. 通过id选择“点赞”链接的容器元素:

var likeContainer = document.getElementById('is-like');

2.  通过id直接选择点赞的图片元素(假设点击这个图片元素可以触发点赞):

var likeImageActive = document.getElementById('is-like-imgactive-animation-like');  
// 或者  
var likeImageDefault = document.getElementById('is-like-img');

请注意,如果图片元素不可点击或没有绑定点赞事件,则这种方法可能不会奏效。

3.  选择包含点赞数字的span元素,并通过它找到可点击的父元素或相邻元素:

var likeCountSpan = document.getElementById('spanCount');  
// 然后可以通过 likeCountSpan.parentElement 或其他DOM属性找到正确的点赞按钮

在实际应用中,您需要确定哪个元素上绑定了点赞的事件处理器。这通常可以通过查看网页的JavaScript代码或使用浏览器的开发者工具来观察事件监听器来完成。

如果您想通过点击“点赞”文字来触发点赞,您也可以选择包含“点赞”文本的div元素:

var likeHoverTip = document.querySelector('.tool-hover-tip span.text');

但是,请注意,不是所有可见的元素都绑定了事件处理器,有时候事件处理器可能绑定在父元素或者相邻元素上,利用事件冒泡或者捕获来处理点击事件。

这些选择器的有效性可以通过Chrome浏览器的开发者工具(按F12打开)进行测试。例如,在开发者的Console标签页中输入以下测试代码~🌸HTML常用文本标签

            setTimeout(function(){
                // 找到点赞按钮并打开
                var likeButton = document.getElementById('is-like'); // 假设这是点赞按钮的正确选择器
                if (likeButton) {
                    // 如果点赞需要触发特定的事件或者调用特定的函数,请根据实际情况调整
                    likeButton.click();
                }
            },3000)

等待3秒后,如果一切正常,点赞按钮应该会被自动点击~

因此,将点赞脚本直接拷贝到跳转页面不就行了么!那就脚本中直接输入以下内容,再次回到友友的登录界面,开心等待油猴运行:🌸aMereNobody-CSDN博客~

(🥺失败代码:直接将点赞内容拷贝到跳转页面的内容之后~)

// ==UserScript==
// @name         Click First Article and Like
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Click the first article and like it on CSDN blog
// @author       You
// @match        https://blog.csdn.net/lh11223326
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 等待页面加载完成
    window.addEventListener('load',function(){
        var firstArticleLink = document.querySelector('#userSkin > div.user-profile-body > div > div.user-profile-body-right > div > div.mainContent > div > div > div:nth-child(1) > article > a');
        if (firstArticleLink) {
            firstArticleLink.click();

            setTimeout(function(){
                // 找到点赞按钮并打开
                var likeButton = document.getElementById('is-like'); // 假设这是点赞按钮的正确选择器
                if (likeButton) {
                    // 如果点赞需要触发特定的事件或者调用特定的函数,请根据实际情况调整
                    likeButton.click();
                }
            },3000)
        }

    });
})();

但是发现并没有成功运行,可能的原因有以下几点:

  1. @match 指令可能只匹配了初始页面,而没有匹配到跳转后的页面。为了解决这个问题,可以尝试使用通配符*来匹配所有子页面,如:// @match https://blog.csdn.net/lh11223326*

  2. 即便使用了通配符,脚本在跳转页面后可能还是无法找到点赞按钮,这可能是因为脚本在新页面加载完成之前就已经运行过了。为了解决这个问题,我们可以在新页面加载完成后再次触发脚本的执行。

  3. 另一个可能的问题是,脚本执行速度过快,页面元素还没有完全加载就已经尝试进行点击操作。这种情况下,增加等待时间或者监听页面加载完成的事件可能会有所帮助。

(😔失败代码:直接将点赞内容拷贝到跳转页面的内容之后,测试增加页面完成的监听~)

// ==UserScript==
// @name         Click First Article and Like
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  Click the first article and like it on CSDN blog
// @author       You
// @match        https://blog.csdn.net/lh11223326
// @match        https://blog.csdn.net/lh11223326/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    // 定义一个函数来执行点赞操作
    function performLike(){
        setTimeout(function(){
            // 找到点赞按钮并打开
            var likeButton = document.getElementById('is-like'); // 假设这是点赞按钮的正确选择器
            if (likeButton) {
                // 如果点赞需要触发特定的事件或者调用特定的函数,请根据实际情况调整
                likeButton.click();
            }
        },3000)
    }

    // 等待页面加载完成
    window.addEventListener('load',function(){
        var firstArticleLink = document.querySelector('#userSkin > div.user-profile-body > div > div.user-profile-body-right > div > div.mainContent > div > div > div:nth-child(1) > article > a');
        if (firstArticleLink) {
            firstArticleLink.click();

            // 监听页面加载的新事件
            window.addEventListener('load',function(){
                if(window.location.href.includes('article/details') == true){
                    performLike();
                }
            },false);
        }
    });
})();

那我们再简化一下脚本逻辑:

  • 在主函数内,脚本根据当前页面的URL来判断应该执行的操作;
  • 如果判定这是主页面就执行点击任务;
  • 如果是子页面就执行点赞任务;

(🥰成功代码:增加区分主页面与子页面的逻辑,运行时记得打开脚本match所写的页面~)

// ==UserScript==  
// @name         Click First Article and Like  
// @namespace    http://tampermonkey.net/  
// @version      0.2  
// @description  Click the first article and like it on CSDN blog  
// @author       You  
// @match        https://blog.csdn.net/lh11223326  
// @match        https://blog.csdn.net/lh11223326/*  
// @grant        none  
// ==/UserScript==  
  
(function() {  
    'use strict';  
  
    // 定义执行点赞操作的函数  
    function performLike() {  
        setTimeout(function() {  
            var likeButton = document.getElementById('is-like');  
            if (likeButton) {  
                likeButton.click();  
            }  
        }, 3000);  
    }  
  
    // 定义点击第一篇文章的函数  
    function clickFirstArticle() {  
        var firstArticleLink = document.querySelector('#userSkin > div.user-profile-body > div > div.user-profile-body-right > div > div.mainContent > div > div > div:nth-child(1) > article > a');  
        if (firstArticleLink) {  
            firstArticleLink.click();  
        }  
    }  
  
    // 页面加载完成后执行的操作  
    window.addEventListener('load', function() {  
        if (window.location.href.includes('article/details')) {  
            // 在文章详情页面执行点赞  
            performLike();  
        } else if (window.location.href.startsWith('https://blog.csdn.net/lh11223326')) {  
            // 在主页面点击第一篇文章  
            clickFirstArticle();  
        }  
    });  
})();

🌴给1个人点2个赞

在上一篇的基础上,我们的代码增加以下功能:

  • 点赞了以后关闭窗口,弹回主页面;
  • 在主页面上继续访问下一个页面(此处根据JS的地址选择,根据动态变量构建选择器);
  • 设置循环变量,每次点赞-1,点到0的时候,结束循环。

(😔失败代码:点赞完成以后尝试退回主页面,失败~)

// ==UserScript==
// @name         Click Articles and Likes
// @namespace    http://tampermonkey.net/
// @version      0.3
// @description  Automatically click and like articles on CSDN blog
// @author       You
// @match        https://blog.csdn.net/lh11223326
// @match        https://blog.csdn.net/lh11223326/*
// @grant        none
// ==/UserScript==

(function() {
    'use strict';

    var numLikesToPerform = 2; // 设置需要点赞的文章数量 - 1
    var selectorBase = "#userSkin > div.user-profile-body > div > div.user-profile-body-right > div > div.mainContent > div > div > div";

    function performLikeAndGoBack() {
        if (numLikesToPerform >= 0) {
            var likeButton = document.getElementById('is-like'); // 假设的点赞按钮ID
            if (likeButton) {
                likeButton.click();
                console.log('文章已点赞');
            }
            // 点赞后返回上一页
            window.history.back();
            numLikesToPerform--; // 点赞次数减一
            setTimeout(clickNextArticle, 1000); // 等待一段时间后尝试点击下一篇文章
        }
    }

    function clickNextArticle() {
        if (numLikesToPerform >= 0) {
            var currentArticleIndex = numLikesToPerform;
            var articleSelector = selectorBase + ':nth-child(' + currentArticleIndex + ') > article > a';
            var articleLink = document.querySelector(articleSelector);
            if (articleLink) {
                articleLink.click();
                // 监听页面加载事件以执行点赞操作,但只执行一次
                window.onload = function() {
                    performLikeAndGoBack();
                    // 重置onload事件,防止重复执行
                    window.onload = null;
                };
            } else {
                console.log('未找到文章链接');
                // 如果没有找到链接,则停止执行
                numLikesToPerform = 0;
            }
        }
    }

    // 初始执行,从主页面开始
    window.onload = function() {
        if (window.location.href.startsWith('https://blog.csdn.net/lh11223326')) {
            clickNextArticle();
            // 重置onload事件,防止在初始页面重复执行
            window.onload = null;
        }
    };
})();

点完赞以后根本回不去,我忘记了这个页面并不是那种会重复使用的具有回退功能的页面...而是新打开的页面,因此,执行“window.history.back();”这句代码可以说是完全没有什么用... 

再次调整脚本逻辑:

  • 根据主页面路径,顺次打开两个子页面;
  • 在子页面内点赞,然后关闭;
记得关掉之前的脚本,刷新博文主页面

 (🥰成功代码:减少子页面撤回主页面的逻辑,运行时记得打开脚本match所写的页面~)

// ==UserScript==  
// @name         Click Articles and Likes with Debugging  
// @namespace    http://tampermonkey.net/  
// @version      0.4  
// @description  Automatically click and like articles on CSDN blog with additional debugging info  
// @author       You  
// @match        https://blog.csdn.net/lh11223326  
// @match        https://blog.csdn.net/lh11223326/*  
// @grant        none  
// ==/UserScript==  
  
(function() {  
    'use strict';  
  
    var numLikesToPerform = 2; // 设置需要点赞的文章数量  
    var currentIndex = 0; // 当前要处理的文章索引  
    var selectorBase = "#userSkin > div.user-profile-body > div > div.user-profile-body-right > div > div.mainContent > div > div > div";  
  
    function performLike() {  
        console.log('当前页面:', window.location.href); // 输出当前页面的网址  
        if (document.URL.includes('article/details')) {  
            var likeButton = document.getElementById('is-like'); // 假设的点赞按钮ID  
            if (likeButton) {  
                setTimeout(function() { // 增加延时以确保页面加载完成  
                    likeButton.click();  
                    console.log('文章已点赞'); // 执行点赞后的输出效果  
                }, 1000); // 延时1秒后执行点赞操作  
            } else {  
                console.log('未找到点赞按钮');  
            }  
            // 延时关闭页面,以确保点赞操作已完成  
            setTimeout(function() {  
                window.close();  
            }, 2000); // 点赞后2秒关闭页面  
        }  
    }  
  
    function clickArticle() {  
        if (currentIndex < numLikesToPerform) {  
            var articleSelector = selectorBase + ':nth-child(' + (currentIndex + 1) + ') > article > a';  
            var articleLink = document.querySelector(articleSelector);  
            if (articleLink) {  
                articleLink.click();  
                currentIndex++; // 递增索引以处理下一篇文章  
                console.log('已打开文章链接:', articleLink.href); // 输出已打开文章的网址  
            } else {  
                console.log('未找到文章链接');  
                // 停止执行脚本或进行其他处理  
            }  
        }  
    }  
  
    // 初始执行,从主页面开始  
    window.onload = function() {  
        if (document.URL.includes('article/details')) {  
            performLike(); // 如果是在文章页面,则执行点赞操作  
        } else if (document.URL.startsWith('https://blog.csdn.net/lh11223326')) {  
            clickArticle(); // 点击第一篇文章  
            setInterval(clickArticle, 5000); // 每5秒点击下一篇文章,可根据需要调整时间间隔  
        }  
    };  
})();

执行的效果:

  • 子页面瞬间打开,点赞,然后关闭,退回主页面;
  • 之后关掉油猴脚本,再次点击文章,发现第1个和第2个文章都点赞了;

关掉脚本,再次刷新,点入前两个博文的子页面,发现前两个博文的点赞量与点赞标记都更改了~


🐍Python + Selenium

🧪Selenium介绍

Selenium 是一个用于自动化 Web 浏览器的工具,它允许你通过编程方式控制浏览器(如 Chrome、Firefox 等),模拟用户的行为,如点击、输入等。Selenium 可以非常直接地用于实现自动点赞,因为它可以模拟真实的用户操作。

Selenium入门指南:入门指南 | Selenium

🧪Selenium安装

Selenium + Python + VScode 安装教程(for VScode)

参考教程1_作者[峰回路转]:python+Visual studio code 配置Selenium环境

🌄Python配置Selenium

如果已经安装了Python,那么接下来的操作是这样的,首先打开windows的powershell~

  • 键盘按下win+R 👉 输入powershell 👉 确定 ~
  • 或者,也可以自己在D盘新建一个文件夹 👉 右键 [在终端中打开] ~

  • 把安装命令粘贴到输入行~
pip install selenium
  • 等待安装完成(我的计算机上是10分钟左右),运行完成以后的样子~

  • 再运行一次下面的更新命令,完成更新~
python.exe -m pip install --upgrade pip

🌄VScode配置Selenium

  • 最上面的菜单栏中 视图 👉 终端~

  • 在下方的终端中,输入安装指令~
pip install selenium

安装与运行中可能会报编码的错误。如果对编码有疑惑,也可以参照这个:

参考教程2_作者[骑摩托的蜗牛]:一篇文章彻底搞懂Python字符编码方式

以下我基本是用VScode在写代码,Python在运行。我的VScode中Python代码好像一含中文就报错,而且我找不到修改编码的地方,但是通过Python3.10打开就没有中文编码的问题~

如果有小伙伴晓得VScode应该怎么配置才能避免中文报错,还请不吝赐教~~ 

🌄安装浏览器driver

首先,需要下载一个对应浏览器的驱动器。以下主要以chrome作为演示~

参考教程3_作者[NicePython]:Selenium3 + Python3:安装selenium浏览器驱动 - 知乎 

参考教程4_作者[zhoukeguai]:chromedriver下载与安装方法,亲测可用-CSDN博客

以上2个路径均提供了114版本及之前的chromedriver,打开镜像网站就可以用~

不知道自己chrome版本的,在地址栏输入这个,第一行会显示你的版本~

chrome://version/

但是如果有倒霉的小伙伴,打开之后发现自己版本太新的,那镜像网站就可能不适合你了~

你可以访问chromedriver的官方,里面有更新的版本,安装匹配自己版本的driver: 

官方driver:Chrome for Testing availability

官方driver[123.0,windows,64位]:storage.googleapis.com

下载完成后,找到你的chrome安装地址,如果不确定你的安装地址,右键桌面浏览器图标 - 属性 - 打开文件所在的位置~

  • 如果你曾经为Chrome配置过环境变量,这样就省得再配一遍环境变量了;
  • 如果你没有为Chrome配置过环境变量,返回小标题,下面的参考教程3、4有详细安装教程~

把下载的chromedriver.exe与LICENSE.chromedriver扔在那个路径~

🌄Selenium测试安装结果

在控制台输入以下语句,检查自己的selenium版本~

pip show selenium

如果显示selenium为3.X版本,请替换第2行的浏览器路径,执行以下语句:

from selenium import webdriver  
  
# 设置 ChromeDriver 的路径  
chromedriver_path = "/path/to/chromedriver"  # 请将此路径替换为您的 chromedriver 实际路径  
  
# 初始化 Chrome WebDriver  
driver = webdriver.Chrome(executable_path=chromedriver_path)  
  
# 接下来,您可以使用 driver 来控制浏览器  
driver.get('https://www.example.com')  
  
# 关闭浏览器  
driver.quit()

如果显示selenium为4.X版本,请替换第2行的浏览器路径,那么请执行以下语句: 

from selenium import webdriver                          # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.service import Service   # 从selenium.webdriver.chrome.service中导入Service模块
  
chromedriver_path = r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe" # 声明chrome浏览器驱动的保存位置
  
service = Service(chromedriver_path)         # 创建chrome浏览器驱动的服务
  
driver = webdriver.Chrome(service=service)   # 创建chrome浏览器,并将chrome浏览器驱动服务传入
   
driver.get('https://www.baidu.com')          # 访问页面
  
driver.quit()

如果执行以上代码,没有报错,弹出了百度浏览器并且快速消失了,那说明脚本已经成功启动了浏览器,执行了某些操作,然后正常退出。目前为止,你的安装步骤还是成功的~

🫥话说,试了很多博主的测试版本都不行,会报“SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape”与“SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte”这样的错误,看起来是编码问题,不过应该也与版本问题有关~

😥另外,Selenium 4.x引入了一些与3.x版本不兼容的更改。其中之一就是使用Service对象来指定WebDriver的可执行文件路径。如果您在使用Selenium 4.x,并且遇到与3.x版本相关的教程或代码示例,那么您可能需要对代码进行相应的调整。

😇后面实际操作发现4.X和3.X版本的区别太大,如果你用的是3.X版本的小伙伴,博文在这里我们就可以say goodbye了,上面所贴大佬博文的链接内容可能更适合你~

🧪Selenium使用

🌄搜索练习

与JS的学习路径类似,在进入正题以前,我们先跑一个简单的脚本。

以下代码实现了通过百度搜索,打开文心一言网页~

 (🥰成功代码

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC,以便调用

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开百度网页  
driver.get('https://www.baidu.com')  
  
# 等待搜索框可点击  
search_box = WebDriverWait(driver, 10).until(  
    EC.element_to_be_clickable((By.ID, 'kw'))  
)  
  
# 在搜索框中输入“文心一言”  
search_box.send_keys('wenxinyiyan')  
  
# 找到搜索按钮并点击  
search_button = driver.find_element(By.ID, 'su')  
search_button.click()  

# 打印当前页面的URL和标题,以便调试  
print("Current URL:", driver.current_url)  
print("Page Title:", driver.title)  
  
# 等待一段时间,让页面有足够的时间加载  
import time  
time.sleep(5)  # 等待5秒  
  
# 再次打印URL和标题,看是否发生了变化  
print("Current URL after wait:", driver.current_url)  
print("Page Title after wait:", driver.title)
time.sleep(5)  # 等待5秒  

# 显式等待,等待元素加载  
try:  
    first_result_link = WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, "//*[@id='1']/div/div[1]/h3/a"))  
    )  
    # 打开第一个搜索结果的链接  
    first_result_link.click()  
    time.sleep(5)  # 等待5秒,让页面加载  
  
    # 如果你想要获取链接的href属性,可以这样做  
    # link_url = first_result_link.get_attribute('href')  
    # print("Link URL:", link_url)  
  
except Exception as e:  
    print("Element not found or not clickable:", e)  
time.sleep(5)  # 等待5秒

# 关闭浏览器  
driver.quit()

( 话说,我真的很爱让代码睡觉 )大概等待1分钟左右,就可以弹出网页了~~

🌄登录CSDN

☀️账号密码(未测试)

下面的代码我没有完全执行流程,我大概执行到截图这一步(输入用户名、密码、产生报错)就不是很想执行了...原因是,我忘记自己的密码了,又懒得重置...

(😔失败代码:执行到最后一步,因为忘记自己的密码而作罢~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开百度网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  

def login():  
    # 显式等待登录按钮并点击  
    login_button = WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a'))  
    )  
    login_button.click()  
    
    # 等待弹出层出现  
    WebDriverWait(driver, 10).until(  
        EC.presence_of_element_located((By.CLASS_NAME, 'passport-login-container'))  
    )  
    
    # 切换到登录iframe  
    # 假设iframe的name或id属性为'passport_iframe',请根据实际情况修改  
    WebDriverWait(driver, 10).until(  
        EC.frame_to_be_available_and_switch_to_it((By.NAME, 'passport_iframe'))  
    ) 
    
    # 现在我们已经在iframe内部,可以查找其中的元素了  
    # 定位到密码登录的元素  
    password_login_element = driver.find_element(By.XPATH, '//span[text()="密码登录"]')  
  
    # 点击密码登录元素  
    password_login_element.click()  
    
    import time;
    # 找到用户名输入框并输入用户名  
    username_input = driver.find_element(By.XPATH, '//input[@placeholder="手机号/邮箱/用户名"]')  
    username_input.send_keys('username')  
    time.sleep(1)  # 等待时间可以缩短,仅作演示使用  
  
    # 找到密码输入框并输入密码  
    password_input = driver.find_element(By.XPATH, '//input[@placeholder="密码"]')  
    password_input.send_keys('password')  
    time.sleep(1)  # 等待时间可以缩短,仅作演示使用  
  
    # 勾选同意协议,这里假设点击图标表示同意,具体行为可能因网页实现而异  
    agree_button = driver.find_element(By.XPATH, '//i[@class="icon icon-nocheck"]')  
    agree_button.click()  
    time.sleep(1)  # 等待时间可以缩短,仅作演示使用  
  
    # 点击登录按钮,确保在尝试点击之前按钮是可用的  
    login_button = driver.find_element(By.XPATH, '//button[text()="登录" and not(@disabled)]')  
    login_button.click()
    # 以上这些我都没试过,不知道是否可行,你可以试试看,反正我是不会试的,我选择手动扫码登录

# 调用login函数  
login()
    # # 关闭浏览器  
    # driver.quit()
    

你可以尝试把用户名“username”和密码“password”改成自己的,看看会不会成功~

username_input.send_keys('username') 
username_input.send_keys('password') 

但是我稍微动用了点我那2KB容量的大脑想了想:在用账号密码登录的时候,说不定会碰到人机验证,可能还得额外写代码来应对验证码的问题。我这个人比较实在,所以就直接选择手动扫码登录了。登录之后,我记录下自己的Cookie,这样就可以模拟登录状态了~

☀️Cookie 

参考教程5_作者[风,又奈何]:selenium cookie 登录 - 风,又奈何 - 博客园 (cnblogs.com)

下面这段代码,我也没有运行成功,可能是比较旧的版本试用,或者我的设置有问题...

(😔失败代码:这段代码用途是记录自己的cookie,可以产生文件cookie.txt,但是这个文件后续不能模拟登录~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  

def login():  
    # 显式等待登录按钮并点击  
    login_button = WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a'))  
    )  
    login_button.click()  
    
    # 等待弹出层出现  
    WebDriverWait(driver, 10).until(  
        EC.presence_of_element_located((By.CLASS_NAME, 'passport-login-container'))  
    )  
    
    # 切换到登录iframe  
    # 假设iframe的name或id属性为'passport_iframe',请根据实际情况修改  
    WebDriverWait(driver, 10).until(  
        EC.frame_to_be_available_and_switch_to_it((By.NAME, 'passport_iframe'))  
    ) 
    
    # 现在我们已经在iframe内部,可以查找其中的元素了  
    # 程序打开网页后,30秒内手动登录,登录成功后,程序会自动继续执行
    time.sleep(30)
    
    with open('cookies.txt', 'w') as f:
        f.write(json.dumps(driver.get_cookies()))

# 调用login函数  
login()
    # # 关闭浏览器  
    # driver.quit()
    

如果运行成功的话,大概在本地会出现一个cookies.txt~

但是把cookies添加到登录的信息,就会获得一款错误代码,遇到了与博主同款的报错提示:

“selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain: Cookie 'domain' mismatch”

于是我也试着运行了一下他的两种解法。方法1,变成int是不可行的;方法2,删除字段也是不可行的,都会报错...

(😔失败代码:即使尝试了博主提供的修复方式,可能因为版本的问题,依旧无法运行~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login():  
    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
            
    for cookie in cookies_list:  
        # 如果cookie中有expiry且是float类型,则转为int  
        if 'expiry' in cookie and isinstance(cookie['expiry'], float):  
            cookie['expiry'] = int(cookie['expiry'])  
        # 添加cookie前检查domain是否匹配当前网页的域名  
        if 'domain' in cookie and cookie['domain'] == '目标网站的域名':  # 请替换为目标网站的域名  
            driver.add_cookie(cookie)  
        else:  
            print(f"Skipping cookie for domain {cookie.get('domain')}, does not match current domain.")  
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()


# 调用login函数  
login()
    # # 关闭浏览器  
    # driver.quit()
    

看错误的提示,大概是域名不匹配,所以自己手动设置一下Domain吧——

参考教程6_作者[秋刀鱼渔夫]:利用selenium携带cookies实现免登录_selenium cookie-CSDN博客

这是成功获取Cookie的代码,文件可以起名为“get_cookies”,务必自行操作一下(页面弹出登录框的30秒内完成),手动完成1次登录,生成的cookies.txt很有用,是以后自动登录的关键!

 (🥰成功代码:获取Cookie的代码,文件可以起名为“get_cookies”~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开百度网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  

def login():  
    # 显式等待登录按钮并点击  
    login_button = WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//*[@id="csdn-toolbar"]/div/div/div[3]/div/div[1]/a'))  
    )  
    login_button.click()  
    
    # 等待弹出层出现  
    WebDriverWait(driver, 10).until(  
        EC.presence_of_element_located((By.CLASS_NAME, 'passport-login-container'))  
    )  
    
    # 切换到登录iframe  
    # 假设iframe的name或id属性为'passport_iframe',请根据实际情况修改  
    WebDriverWait(driver, 10).until(  
        EC.frame_to_be_available_and_switch_to_it((By.NAME, 'passport_iframe'))  
    ) 
    
    # 现在我们已经在iframe内部,可以查找其中的元素了  
    # 程序打开网页后,30秒内手动登录,登录成功后,程序会自动继续执行
    time.sleep(30)
    
    with open('cookies.txt', 'w') as f:
        f.write(json.dumps(driver.get_cookies()))

# 调用login函数  
login()
    # # 关闭浏览器  
    # driver.quit()
    

当本路径下生成可用的cookies.txt后,新建python文件,随便起个好听的名字,例如login.py,粘贴下面的代码~

 (🥰成功代码:根据上面“get_cookies”产生的cookies.txt,经过漫长约2min的等待,成功实现自动登录。成功了,有点开心~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login():  
    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
            
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()


# 调用login函数  
login()
    # # 关闭浏览器  
    # driver.quit()
    

🌄给1个人点1个赞

参考教程7_作者[啊芫荽]:Python|selenium实现自动点赞收藏(进阶版) - (hncd1024.github.io)

参考教程8_作者[K同学]:实战项目二: 实现CSDN自动点赞-腾讯云 (tencent.com)

参考教程9_作者[风度翩翩猪肉王子]:Python+Selenium个人网页自动化点赞_小红书

参考教程10_作者[数据大宇宙]:Python无头爬虫Selenium系列(01):像手工一样操作浏览器

参考教程11_作者[生活处处有BUG]:八千字《基于Python的Selenium4从入门到高级》

☀️XPath访问

常见的思路可能还是通过XPath访问点赞路径什么的,然而,我又又又失败了!

(😔失败代码:傻傻定位不到点赞的Xpath~)

def auto_click():  
    # 点击第一篇文章  
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//a[contains(@href, "https://blog.csdn.net/lh11223326/article/details")]'))  
    ).click()  
    print("进入文章页面。")  
          
    # 点击喜欢按钮 ,失败
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, "//a[./span[@id='spanCount']]")) # 假设喜欢按钮是一个a标签,且包含一个id为spanCount的span标签
    ).click()  
    print("点赞成功1。")  
        
    # 点击喜欢按钮,假设相对路径为//*[@id="spanCount"],失败
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//*[@id="spanCount"]'))
    ).click()  
    print("点赞成功2。") 
        
    # 点击喜欢按钮,假设标签包含<span id="spanCount" class="count " style="color: rgb(153, 153, 153);"></span>,失败
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//span[@id="spanCount"]'))
    ).click()  
    print("点赞成功3。") 
    # 点击喜欢按钮
    time.sleep(3)
    driver.find_element(By.XPATH, '//button[@class=" low-height hover-box btn-like "]').click()
    print("点赞成功。")  

自己碰了一鼻子灰,于是乎我咨询了一下AI,发现自己访问了一个寂寞,这个点赞代码就是计数、和放特效的,而我在傻傻地访问spanCount也就是计数,Selenium是没有办法直接操作的囧~~

我们再次回顾一下在JS的步骤中,发现的点赞代码:

<li class="tool-item ... is-like" id="is-like">  
  <a class="tool-item-href">  
    <!-- 点赞活跃状态的图像(初始时隐藏) -->  
    <img id="is-like-imgactive-animation-like" style="display:none;" ...>  
    <!-- 点赞被激活后的图像(初始时隐藏) -->  
    <img class="isactive" id="is-like-imgactive" style="display:none;" ...>  
    <!-- 默认状态的点赞图像(初始时显示) -->  
    <img class="isdefault" id="is-like-img" style="display:block;" ...>  
    <!-- 点赞数 -->  
    <span id="spanCount" class="count ">41</span>  
  </a>  
  ...  
</li>

我们改成By id = "is-like"试一下。顺便,我有点担心自己在打开新的页面以后能不能成功完成转换页面的功能,因此也在这里增加测试语句~

(😔失败代码:经过测试,无法完成转换页面的功能~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException  
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login():  
    # 控制栏反馈  
    print("正在加载cookies...")  

    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
    
    # 添加cookies到浏览器  
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("Cookies已加载,页面已刷新。")  

def auto_click():  
    # 点击第一篇文章  
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//a[contains(@href, "https://blog.csdn.net/lh11223326/article/details")]'))  
    ).click()  
    print("进入文章页面。")  
    
    # 反馈当前操作的页面URL
    time.sleep(3)
    print(driver.current_url)
          
    # 点击喜欢按钮
    time.sleep(3)
    driver.find_element(By.ID, 'is-like').click()
    print("点赞成功。")  
         
     
# 调用login函数  
login()  
  
# 可以在这里调用auto_click函数或其他你需要执行的函数  
auto_click()  
  
# 当你完成所有操作后,可以选择关闭浏览器  
# driver.quit()

虽然执行又失败了,但是根据反馈,我发现自己还是停留在了主页面,并没有访问子页面...

因此,我们可以通过切换窗口实现这个功能。具体来说,调整代码的逻辑:

  • 访问主页面,运行脚本;
  • 脚本保存当前的窗口,然后选择下一个窗口去执行点赞命令;

(🥰成功代码:运行之前,记得按照上文代码,在本地保存自己的cookies,并命名为cookies.txt~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException  
import time
import json

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login():  
    # 控制栏反馈  
    print("正在加载cookies...")  

    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
    
    # 添加cookies到浏览器  
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("Cookies已加载,页面已刷新。")  

def auto_click():  
    # 保存当前窗口句柄  
    current_window = driver.current_window_handle  
      
    # 点击第一篇文章  
    WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.XPATH, '//a[contains(@href, "https://blog.csdn.net/lh11223326/article/details")]'))  
    ).click()  
    print("进入文章页面。")  
      
    # 等待新窗口打开  
    WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))  
      
    # 获取所有窗口句柄  
    all_windows = driver.window_handles  
      
    # 切换到新打开的窗口(不是当前窗口的那个)  
    for window in all_windows:  
        if window != current_window:  
            driver.switch_to.window(window)  
            break  
      
    # 反馈当前操作的页面URL  
    time.sleep(3)  
    print(driver.current_url)  
      
    # 点击喜欢按钮  
    time.sleep(3)  
    try:  
        WebDriverWait(driver, 10).until(  
            EC.element_to_be_clickable((By.ID, 'is-like'))  
        ).click()  
        print("点赞成功。")  
    except TimeoutException:  
        print("未找到点赞按钮或无法点击。")  
      
    # 如果需要,可以在这里切换回原来的窗口  
    # driver.switch_to.window(current_window) 
     
# 调用login函数  
login()  
  
# 可以在这里调用auto_click函数或其他你需要执行的函数  
auto_click()  
  
# 当你完成所有操作后,可以选择关闭浏览器  
# driver.quit()

执行完操作以后,我们又把友友的赞再次点没了(🤣这一篇博文可怜的赞被我来回点,有的时候手动点,有的时候脚本点,有的时候就是点开了,有的时候就是点没了)~

☀️Request访问

参考教程12_作者[青灯Python]:短视频平台自动点赞脚本(手把手教你制作)

参考教程13_作者[小啊小狼]:

参考教程14_翻译[编程禅师]:Python Requests库使用指南 - 知乎 (zhihu.com)

或许我们也可以考虑,直接调用服务器的点赞接口送出去一个赞...

我们需要通过Chrome开发者工具查看点赞的发送请求,按照以下步骤操作:

  1. 打开Chrome浏览器,并访问包含点赞功能的网页:CSS设置字体样式-CSDN博客
  2. 按下F12键(或在页面上右键点击并选择“检查”)打开开发者工具。
  3. 在开发者工具的顶部菜单中,选择“Network”选项卡。
  4. 确保已经勾选了“Preserve log”选项,以便在页面刷新时保留之前的网络请求记录。
  5. 在页面上执行点赞操作。
  6. 在“Network”选项卡中,你应该能看到一个新的网络请求出现。这个请求就是与点赞操作相关的。
  7. 点击这个请求,你可以在右侧的面板中查看请求的详细信息,包括请求的URL、请求方法、请求头、响应状态、响应头和响应体等信息。

按照上面的图示,你会抓到一个like包包~

like的Headers里的内容如下,表示请求的发送源,是通过POST输送like:

Request URL:https://blog.csdn.net//phoenix/web/v1/article/like
Request Method:POST
Status Code:200 OK
Remote Address:117.149.203.51:443
Referrer Policy:unsafe-url

like的Payloas里的内容如下,表示博文的ID:

articleId: 137433939

😣那么在跳转页面以后保持登录状态,直接发一个包包应该就可以了....

(🥰成功代码:不用跳转,直接调用API运行~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.common.exceptions import NoSuchElementException, TimeoutException  
import time
import json
import requests  
import urllib.parse  


# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def auto_click():  
    # 控制栏反馈  
    print("正在加载cookies...")  

    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
    
    # 添加cookies到浏览器  
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("Cookies已加载,页面已刷新。")   
      
    # 传递参数 
    time.sleep(3)  
    # 将cookies_list转换为requests可以使用的cookies字典    
    requests_cookies = {}    
    for cookie in cookies_list:    
        requests_cookies[cookie['name']] = cookie['value']    
          
    # 准备POST请求的数据  
    post_data = {  
        'articleId': '137433939'  # 假设这是您要点赞的文章ID  
    }  
    encoded_data = urllib.parse.urlencode(post_data)  # 对数据进行编码  
      
    # 现在可以使用requests_cookies和encoded_data来发送请求了    
    url = 'https://blog.csdn.net/phoenix/web/v1/article/like'    
    headers = {  
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36',
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  
    }  
    response = requests.post(url, headers=headers, cookies=requests_cookies, data=encoded_data)  
    
    # 检查响应状态码和内容  
    if response.status_code == 200:  
        print("请求成功!")  
    else:  
        print(f"请求失败,状态码:{response.status_code}")
     
  
# 可以在这里调用auto_click函数或其他你需要执行的函数  
auto_click()  
  
# 当你完成所有操作后,可以选择关闭浏览器  
# driver.quit()

headers里User-Agent的内容,可能需要你根据自身的实际情况修改...

运行以后,如果控制台反馈状态码200,且点开后子页面的赞与主页面是不相同的,那么应该也是成功了~

🌄给1个人点2个赞

🤣把def auto click写2遍就可以了,我可真是个机灵鬼!

(🥰成功代码:开玩笑的,我还不想被钉在代码界耻辱柱上~)

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException  
import time
import json

# 设置需要点赞的文章数量numLikesToClick = 2
numLikesToClick = 2

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login():  
    # 控制栏反馈  
    print("正在加载cookies...")  

    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
    
    # 添加cookies到浏览器  
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("Cookies已加载,页面已刷新。")  

def auto_click():  
    # 保存当前窗口句柄  
    current_window = driver.current_window_handle  
    
    for i in range(1, numLikesToClick + 1):
        article_xpath = f'//*[@id="userSkin"]/div[2]/div/div[2]/div/div[2]/div/article[{i}]/a'
        # 点击第i篇文章  
        WebDriverWait(driver, 10).until(  
            EC.element_to_be_clickable((By.XPATH, article_xpath))   
        ).click()  
        print("进入文章页面。")  
      
        # 等待新窗口打开  
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))  
      
        # 获取所有窗口句柄  
        all_windows = driver.window_handles  
      
        # 切换到新打开的窗口(不是当前窗口的那个)  
        for window in all_windows:  
            if window != current_window:  
                driver.switch_to.window(window)  
                break  
      
        # 反馈当前操作的页面URL  
        time.sleep(3)  
        print(driver.current_url)  
      
        # 点击喜欢按钮  
        time.sleep(3)  
        try:  
            WebDriverWait(driver, 10).until(  
                EC.element_to_be_clickable((By.ID, 'is-like'))  
            ).click()  
            print("点赞成功。")  
        except TimeoutException:  
            print("未找到点赞按钮或无法点击。")  
        

        # 关闭当前窗口
        time.sleep(3)      
        driver.close()
            
        # 在这里切换回原来的窗口  
        driver.switch_to.window(current_window) 
     
# 调用login函数  
login()  
  
# 可以在这里调用auto_click函数或其他你需要执行的函数  
auto_click()  
  
# 当你完成所有操作后,可以选择关闭浏览器  
# driver.quit()

🌄隐藏小标题:给2个人点2个赞(失败了)

首先,在上述博文登录 - Cookie的地方,运行获取Cookie的代码(具体来说,就是贴在参考教程6下面的那一段代码),准备好针对2个人的分别的cookies,并重命名为cookies_user1.txt,cookies_user2.txt~

话说,如果找不到合适的博主,或许可以考虑这两个博主,虽然我测试点赞没有经过人家的同意,不晓得他们两个看到有2个博文的赞来回被点会不会生气hhh:
🌸,🌸

运行以下代码,不晓得为什么,2次会打开同一个人的页面。

页面点赞执行流程是没问题的,但是登出与登录之间账号有问题,稍微有点郁闷了...emm,还是暂存一下,我要去睡觉了——

from selenium import webdriver                                      # 从selenium库中调用webdriver模块
from selenium.webdriver.chrome.options import Options               # 从selenium.webdriver.chrome.options中导入Options模块
from selenium.webdriver.chrome.service import Service               # 从selenium.webdriver.chrome.service中导入Service模块
from selenium.webdriver.common.by import By                         # 从selenium.webdriver.common.by中导入By模块
from selenium.webdriver.common.action_chains import ActionChains    # 从selenium.webdriver.common.action_chains中导入ActionChains模块,用于模拟鼠标操作
from selenium.webdriver.support.ui import WebDriverWait             # 从selenium.webdriver.support.ui中导入WebDriverWait模块
from selenium.webdriver.support import expected_conditions as EC    # 从selenium.webdriver.support中导入expected_conditions模块,并重命名为EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException  
import time
import json

# 设置需要点赞的文章数量numLikesToClick = 2
numLikesToClick = 2

# 设置ChromeDriver的路径  
chromedriver_path =r"C:\Users\Dell\AppData\Local\Google\Chrome\Application\chromedriver.exe"  # 请将此路径替换为您的chromedriver实际路径  

# 创建一个Options对象,设置在脚本执行完毕后保持浏览器窗口打开,以便后续操作
chrome_options = Options()  
chrome_options.add_experimental_option("detach", True)  

# 创建一个Service对象  
service = Service(chromedriver_path)  
  
# 初始化Chrome WebDriver  
driver = webdriver.Chrome(service=service)  
  
# 打开CSDN网页  
driver.get('https://blog.csdn.net/lh11223326?type=blog')  
# 清除浏由于浏览器已经打开的cookies
driver.delete_all_cookies()

def login(cookies_file): 
    # 控制栏反馈  
    print("正在加载cookies...")  

    # 使用json库加载cookies
    with open('cookies.txt', 'r') as cookief:
        cookies_list = json.load(cookief)  
    
    # 添加cookies到浏览器  
    for cookie in cookies_list:  
        driver.add_cookie({  
            'domain': '.csdn.net',  # 假设我们都是在csdn.net网站下登录的,所以这里直接用.csdn.net
            'name': cookie['name'],  # 假设cookies.txt中每个cookie都是一个包含'name'和'value'的字典  
            'value': cookie['value'],  
            'path': '/',  
            'secure': False,  # 根据实际情况设置  
            'httpOnly': False  # 根据实际情况设置,通常可以通过浏览器的开发者工具查看cookie的属性  
        }) 
                  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("Cookies已加载,页面已刷新。")  

def auto_click():  
    # 保存当前窗口句柄  
    current_window = driver.current_window_handle  
    
    for i in range(1, numLikesToClick + 1):
        article_xpath = f'//*[@id="userSkin"]/div[2]/div/div[2]/div/div[2]/div/article[{i}]/a'
        # 点击第i篇文章  
        WebDriverWait(driver, 10).until(  
            EC.element_to_be_clickable((By.XPATH, article_xpath))   
        ).click()  
        print("进入文章页面。")  
      
        # 等待新窗口打开  
        WebDriverWait(driver, 10).until(EC.number_of_windows_to_be(2))  
      
        # 获取所有窗口句柄  
        all_windows = driver.window_handles  
      
        # 切换到新打开的窗口(不是当前窗口的那个)  
        for window in all_windows:  
            if window != current_window:  
                driver.switch_to.window(window)  
                break  
      
        # 反馈当前操作的页面URL  
        time.sleep(3)  
        print(driver.current_url)  
      
        # 点击喜欢按钮  
        time.sleep(3)  
        try:  
            WebDriverWait(driver, 10).until(  
                EC.element_to_be_clickable((By.ID, 'is-like'))  
            ).click()  
            print("点赞成功。")  
        except TimeoutException:  
            print("未找到点赞按钮或无法点击。")  
        

        # 关闭当前窗口
        time.sleep(3)      
        driver.close()
            
        # 在这里切换回原来的窗口  
        driver.switch_to.window(current_window) 
    
# 退出登录状态
def sign_out():
    # 等待页面加载完成,找到需要悬停的元素  
    toolbar_btn = WebDriverWait(driver, 10).until(  
        EC.presence_of_element_located((By.CSS_SELECTOR, 'div.toolbar-btn.toolbar-btn-login.toolbar-btn-login-new.csdn-toolbar-fl.toolbar-subMenu-box'))  
    )  
  
    # 创建ActionChains对象  
    action_chains = ActionChains(driver)  
  
    # 模拟鼠标悬停在toolbar_btn元素上  
    action_chains.move_to_element(toolbar_btn).perform()  
  
    # 等待下拉菜单出现后,找到退出按钮并点击  
    logout_link = WebDriverWait(driver, 10).until(  
        EC.element_to_be_clickable((By.CSS_SELECTOR, 'li.pt-8.csdn-profile-logout > a'))  
    )  
    logout_link.click()  
    # 刷新页面以确保cookies生效  
    driver.refresh()
    # 控制栏反馈  
    print("已退出登录。")  
    

# 用户cookies文件列表  
users_cookies = ['cookies_user1.txt', 'cookies_user2.txt'] 
     
# 对每个用户执行登录和点赞操作  
for cookies_file in users_cookies:  
    login(cookies_file)          # 调用login函数使用对应的cookies文件登录当前用户  
    auto_click()                 # 调用auto_click函数为当前登录的用户点赞  
    sign_out()                   # 调用sign_out函数退出登录  
     

# 当你完成所有操作后,可以选择关闭浏览器  
# driver.quit()

也许我们可以简化一下逻辑:登录并点赞成功后,不再进行反复的登录登出操作,而是直接跳转到下一个人的页面。

不过说实话,我现在头秃,真的有点懒得再深入思考这个问题了。以我现在的编程水平,即使勉强拼凑出一段能跑的代码,恐怕也是笨拙且低效的。毕竟,没有人愿意使用那些需要在严苛条件下改动一大堆的糟糕代码~~

😉😉等将来我深入学习Python和网页前端技术之后,再回来优化这段代码吧,有缘回见~


🔚总结

博文已至尾声,若有表述不清或存疑之处,诚邀各位小伙伴留言探讨与指正,以助我不断优化内容。诸如发现错误、难以理解、表述不够简洁或功能缺失等问题,都请不吝赐教,我会尽快修正。🙏

在整理资料时,我偶然发现了Python GUI点赞法,但考虑到文章篇幅(在几乎零基础的JS和Python知识上已写下四万字,还有不少失败的代码尝试未Po出或已删除)、时间紧迫(清明节期间连续三天测试与写作)以及日渐稀少的头发(...),我决定暂不深入探讨,对此感兴趣的朋友可自行研究。🔍

再次提示,本文主要作为Python与JavaScript的入门脚本分享,各位在根据自身需求修改代码时,请自行承担相应后果。📏

我是梅头脑,若觉本文有用,欢迎点赞支持,你的每一个赞都是我继续创作的动力源泉!🌟🌟

同系列的博文:🌸瞎写_梅头脑_的博客-CSDN博客,其实同系列博文就这一篇...

同博主的博文:🌸随笔03 笔记整理-CSDN博客

  • 14
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值