python+selenium实战之无限评论

该项目使用Python的Selenium库自动化登录CSDN并进行无限评论与点赞操作,涉及Firefox浏览器,geckodriver的安装配置。通过滚动条模拟用户行为,对多个技术分类下的文章进行评论与点赞。项目代码详细,包含异常处理,可直接运行。需注意替换登录账号和密码,并确保环境配置正确。
摘要由CSDN通过智能技术生成


建议先看 摘要,了解大体项目内容,配好相应环境, 登录模块内容记得改成你自己的账号和密码,然后直接看 源代码汇总,在自己电脑上跑跑,能用就继续学习本文章内容

概要

功能:

  • 对csdn门户网站进行无限评论和点赞操作
  • 该实战项目使用的是firefox浏览器,进行selenium进行自动化操作
  • 对selenium使用不熟,可转至Python Selenium库的使用

要求:

  • 安装selenium库,安装代码 pip install selenium
  • 使用firefox(如果你想用google,相应的驱动自己去装也行)
  • 下载geckodriver(是Firefox的官方webdriver),如下图页面下载

根据不同的系统下载相应的geckodriver
在这里插入图片描述将geckodriver放在firefox的文件夹下,如下图
在这里插入图片描述

  • 完成以上要求内容,你离成功就剩一半了

项目效果展示:可以看到我的鼠标可是没有动的

在这里插入图片描述

1、登录模块

from selenium import webdriver
import numpy as np
import time

# 1、登录csdn
# 模拟登录
def login():
	# 以下这个executable_path由自己安装的geckodriver位置决定
    drive = webdriver.Firefox(executable_path='C:\Program Files\Mozilla Firefox\geckodriver.exe')
    drive.get("https://passport.csdn.net/login?code=public")
    drive.maximize_window()
    drive.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div[2]/div[5]/ul/li[2]/a").click()
    drive.find_element_by_xpath('//*[@id="all"]').send_keys("你的csdn账号")
    drive.find_element_by_xpath('//*[@id="password-number"]').send_keys("你的csdn密码")
    drive.find_element_by_xpath('/html/body/div[2]/div/div/div[1]/div[2]/div[5]/div/div[6]/div/button').click()
    time.sleep(4)
    return drive
login()

运行结果:可能csdn能检测到我这是自动化,运行完有如下的一个验证页面,不要慌,自己登录进去即可
在这里插入图片描述登录进去就是如下图,这时候已经获取的session,之后的代码如果操作页面,就是默认以登录的状态进行
在这里插入图片描述

2、生成评论

# 2、生成评论
def generate_review():
    csdn_review = ['大佬,厉害厉害!!!',"看的出来博主用心了","博客很全面,很仔细,点赞","有所收获,感谢","内容不错,三连了",'八千里路的云与月,全部在阅读中走进了我心灵的深处'
                  ,"文章本天成,妙手偶得之。粹然无疵瑕,岂复须人为?","学习了","哈哈 很棒棒哦","感觉很厉害的亚子","好文章","博主写的好好,一起加油吖,向Python大佬学习","大佬牛啊,再下佩服",
                  "支持,帮大忙了","好像很腻害的样子大佬有空带带我",'博主写的非常好,有理论有例子,非常容易看懂,感谢博主!',"学起来,坚持~欢迎回访一起交流!","看三遍也看不够的好文,mark~","哈哈",'学到了,收藏一波~欢迎回访一起交流!',
                   "看完大佬的文章,我的心情竟是久久不能平静。正如老子所云:大音希声,大象无形。我现在终于明白我缺乏的是什么了。","牛蛙牛蛙,以后跟着大佬学习","收藏了,趁着春节好好学习",'总结的太棒了,这是一位宝藏博主啊,mark一波,小弟期待您的关注哦。',
                   "风雨过后天空几度平静的苍白,你走后我的心几分速bai跳的空白","欲寄彩笺兼尺素,山长水阔知何处。——晏殊《鹊踏枝》","红豆生南国,春来发几枝。",'人生苦短,我用python',"没有字母的日子,如同一堆温暖的木头,被人们记住,是一种大脑的烟雾。","行到水穷处 坐看云起时",
                   "三十功名尘与土,八千里路云和月",'所爱隔山海 山海不可平',"代码之路任重道远,愿跟博主努力习之。","爱了爱了","览君荆山作,江鲍堪动色","快进我的收藏夹吃灰吧","七月的风,八月的云。"]
#     print (len(csdn_review))
    random = np.random.randint(len(csdn_review))
    return csdn_review[random]

def scroll2Bottom(drive,times=3):
    js = "var q=document.documentElement.scrollTop=20000"
    for i in range(times):
        drive.execute_script(js)
        time.sleep(1)
  1. 这一部分很简单就是两个函数
  2. 一个是随机生成各种评论
  3. 另一个是模拟三次滚动条划到最底部的操作,这个操作有点费解?
  4. 不要慌,点进去看这个页面,这个页面划到底部只有25篇文章(如下图),我要将所有文章都显示出来只能先模拟三次滚动条划到最底部,不信你可以试试喽
    在这里插入图片描述

3、主要内容

这一步就是我们模拟评论的核心代码喽。这部分比较多,我讲一下我的思路。

  1. 先维护一个url_lists,就是如下图的url链接(C++,java,etc…)
    在这里插入图片描述
  2. 对每一个链接内的所有文章循环
  3. 对每个文章内部进行评论以及关注操作
  4. 大概内容就是如此,细节可以自己去揪。你可以先运行一遍代码,看下能否成功,这能给你提供一个正反馈
def category_handle(url,sleep_time):
    article_times = 0
    drive.get(url)
    scroll2Bottom(drive,5)
    # 定位一组元素,使用elements即可进行定位
    all_articles = drive.find_elements_by_xpath('/html/body/div[2]/div/div/div/div/div/div/div/div[2]/div[1]/div/div[2]/div')
    
    for article in all_articles:
        article_times = article_times + 1
        a = article.find_element_by_tag_name("a")
        href = a.get_attribute('href')

        js='window.open("'+href+'");'
        drive.execute_script(js)

        # 将句柄转换为新的页面
        current_window = drive.current_window_handle
        allHandles = drive.window_handles
        for handle in allHandles:
            if handle != drive.current_window_handle:
                drive.switch_to_window(handle)
                break;

        # 进行评论点赞,二连
        try:
            time.sleep(2)
            # 1、评论
            toolbox = drive.find_element_by_class_name("toolbox-list")
            toolbox.find_element_by_xpath("li[2]/a").click()
            drive.find_element_by_xpath('//*[@id="comment_content"]').send_keys(generate_review())
            time.sleep(2)
            
            # 1.1、点击确认评论
            # 使用如下定位,否则很容易出问题,具有局部特殊性
            rightBox = drive.find_element_by_xpath('//*[@id="rightBox"]')
            rightBox.find_element_by_tag_name("input").click()                                                           
            
            # 2、点赞
            time.sleep(3)
            drive.find_element_by_xpath('//*[@id="is-like-span"]').click()
            
            print ("自动化第"+str(article_times)+"个页面,该页面成功了")
        except:
#             print (drive.title)
            print ("自动化第"+str(article_times)+"个页面,该页面失败了")
        finally:
            time.sleep(sleep_time)
            drive.close()
            drive.switch_to_window(current_window)

    articles = article_times
   
   
url_lists = ["https://blog.csdn.net/rank/list?type=c%2Fc%2B%2B","https://blog.csdn.net/rank/list?type=java","https://blog.csdn.net/rank/list?type=javascript","https://blog.csdn.net/rank/list?type=php","https://blog.csdn.net/rank/list?type=python","https://blog.csdn.net/rank/list?type=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD","https://blog.csdn.net/rank/list?type=%E5%8C%BA%E5%9D%97%E9%93%BE","https://blog.csdn.net/rank/list?type=%E5%A4%A7%E6%95%B0%E6%8D%AE","https://blog.csdn.net/rank/list?type=%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91","https://blog.csdn.net/rank/list?type=%E5%B5%8C%E5%85%A5%E5%BC%8F","https://blog.csdn.net/rank/list?type=%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7","https://blog.csdn.net/rank/list?type=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95","https://blog.csdn.net/rank/list?type=%E6%B5%8B%E8%AF%95","https://blog.csdn.net/rank/list?type=%E6%B8%B8%E6%88%8F","https://blog.csdn.net/rank/list?type=%E7%BD%91%E7%BB%9C","https://blog.csdn.net/rank/list?type=%E8%BF%90%E7%BB%B4"]
articles = 0

# 设置每评论一次的睡眠时间,防止检测到机操,这里设置为了10秒
sleep_time = 10
# 设置从第几个url链接开始自动化
start_url_num = 6

time_start=time.time()
for i in range(start_url_num,len(url_lists)):
    cur_review_success_times = 0
    cur_like_success_times = 0
    articles = 0
    print ("第"+str(i)+"个链接进行selenium :"+url_lists[i])
    
    category_handle(url_lists[i],sleep_time)
    print ("访问共"+str(articles)+"条")
    
time_end=time.time()
print('all time cost',(time_end-time_start)/60,'min')
    

运行结果:

  • 运行了大概3小时,进行了有上千次评论和点赞了。
  • 效果就是文章最前面的那个gif动图
  • 文本结果如下图
    在这里插入图片描述
  • 如下图,才跑了几十分钟就有这么多消息了,哈哈哈哈哈!
    在这里插入图片描述

4、源代码汇总(可直接运行)

from selenium import webdriver
import numpy as np
import time

# 1、登录csdn
# 模拟登录
def login():
	# 以下这个executable_path由自己安装的geckodriver位置决定
    drive = webdriver.Firefox(executable_path='C:\Program Files\Mozilla Firefox\geckodriver.exe')
    drive.get("https://passport.csdn.net/login?code=public")
    drive.maximize_window()
    drive.find_element_by_xpath("/html/body/div[2]/div/div/div[1]/div[2]/div[5]/ul/li[2]/a").click()
    # 注意这里当然要你的账号和密码
    # 要不然怎么可能可以直接跑
    drive.find_element_by_xpath('//*[@id="all"]').send_keys("你的csdn账号")
    drive.find_element_by_xpath('//*[@id="password-number"]').send_keys("你的csdn密码")
    drive.find_element_by_xpath('/html/body/div[2]/div/div/div[1]/div[2]/div[5]/div/div[6]/div/button').click()
    time.sleep(4)
    return drive
drive = login()


# 2、生成评论
def generate_review():
    csdn_review = ['大佬,厉害厉害!!!',"看的出来博主用心了","博客很全面,很仔细,点赞","有所收获,感谢","内容不错,三连了",'八千里路的云与月,全部在阅读中走进了我心灵的深处'
                  ,"文章本天成,妙手偶得之。粹然无疵瑕,岂复须人为?","学习了","哈哈 很棒棒哦","感觉很厉害的亚子","好文章","博主写的好好,一起加油吖,向Python大佬学习","大佬牛啊,再下佩服",
                  "支持,帮大忙了","好像很腻害的样子大佬有空带带我",'博主写的非常好,有理论有例子,非常容易看懂,感谢博主!',"学起来,坚持~欢迎回访一起交流!","看三遍也看不够的好文,mark~","哈哈",'学到了,收藏一波~欢迎回访一起交流!',
                   "看完大佬的文章,我的心情竟是久久不能平静。正如老子所云:大音希声,大象无形。我现在终于明白我缺乏的是什么了。","牛蛙牛蛙,以后跟着大佬学习","收藏了,趁着春节好好学习",'总结的太棒了,这是一位宝藏博主啊,mark一波,小弟期待您的关注哦。',
                   "风雨过后天空几度平静的苍白,你走后我的心几分速bai跳的空白","欲寄彩笺兼尺素,山长水阔知何处。——晏殊《鹊踏枝》","红豆生南国,春来发几枝。",'人生苦短,我用python',"没有字母的日子,如同一堆温暖的木头,被人们记住,是一种大脑的烟雾。","行到水穷处 坐看云起时",
                   "三十功名尘与土,八千里路云和月",'所爱隔山海 山海不可平',"代码之路任重道远,愿跟博主努力习之。","爱了爱了","览君荆山作,江鲍堪动色","快进我的收藏夹吃灰吧","七月的风,八月的云。"]
#     print (len(csdn_review))
    random = np.random.randint(len(csdn_review))
    return csdn_review[random]

def scroll2Bottom(drive,times=3):
    js = "var q=document.documentElement.scrollTop=20000"
    for i in range(times):
        drive.execute_script(js)
        time.sleep(1)

# 3、主要内容
def category_handle(url,sleep_time):
    article_times = 0
    drive.get(url)
    scroll2Bottom(drive,5)
    # 定位一组元素,使用elements即可进行定位
    all_articles = drive.find_elements_by_xpath('/html/body/div[2]/div/div/div/div/div/div/div/div[2]/div[1]/div/div[2]/div')
    
    for article in all_articles:
        article_times = article_times + 1
        a = article.find_element_by_tag_name("a")
        href = a.get_attribute('href')

        js='window.open("'+href+'");'
        drive.execute_script(js)

        # 将句柄转换为新的页面
        current_window = drive.current_window_handle
        allHandles = drive.window_handles
        for handle in allHandles:
            if handle != drive.current_window_handle:
                drive.switch_to_window(handle)
                break;

        # 进行评论点赞,二连
        try:
            time.sleep(2)
            # 1、评论
            toolbox = drive.find_element_by_class_name("toolbox-list")
            toolbox.find_element_by_xpath("li[2]/a").click()
            drive.find_element_by_xpath('//*[@id="comment_content"]').send_keys(generate_review())
            time.sleep(2)
            
            # 1.1、点击确认评论
            # 使用如下定位,否则很容易出问题,具有局部特殊性
            rightBox = drive.find_element_by_xpath('//*[@id="rightBox"]')
            rightBox.find_element_by_tag_name("input").click()                                                           
            
            # 2、点赞
            time.sleep(3)
            drive.find_element_by_xpath('//*[@id="is-like-span"]').click()
            
            print ("自动化第"+str(article_times)+"个页面,该页面成功了")
        except:
#             print (drive.title)
            print ("自动化第"+str(article_times)+"个页面,该页面失败了")
        finally:
            time.sleep(sleep_time)
            drive.close()
            drive.switch_to_window(current_window)

    articles = article_times
   
   
url_lists = ["https://blog.csdn.net/rank/list?type=c%2Fc%2B%2B","https://blog.csdn.net/rank/list?type=java","https://blog.csdn.net/rank/list?type=javascript","https://blog.csdn.net/rank/list?type=php","https://blog.csdn.net/rank/list?type=python","https://blog.csdn.net/rank/list?type=%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD","https://blog.csdn.net/rank/list?type=%E5%8C%BA%E5%9D%97%E9%93%BE","https://blog.csdn.net/rank/list?type=%E5%A4%A7%E6%95%B0%E6%8D%AE","https://blog.csdn.net/rank/list?type=%E7%A7%BB%E5%8A%A8%E5%BC%80%E5%8F%91","https://blog.csdn.net/rank/list?type=%E5%B5%8C%E5%85%A5%E5%BC%8F","https://blog.csdn.net/rank/list?type=%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7","https://blog.csdn.net/rank/list?type=%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84%E4%B8%8E%E7%AE%97%E6%B3%95","https://blog.csdn.net/rank/list?type=%E6%B5%8B%E8%AF%95","https://blog.csdn.net/rank/list?type=%E6%B8%B8%E6%88%8F","https://blog.csdn.net/rank/list?type=%E7%BD%91%E7%BB%9C","https://blog.csdn.net/rank/list?type=%E8%BF%90%E7%BB%B4"]
articles = 0

# 设置每评论一次的睡眠时间,防止检测到机操,这里设置为了10秒
sleep_time = 10
# 设置从第几个url链接开始自动化
start_url_num = 1

time_start=time.time()
for i in range(start_url_num,len(url_lists)):
    cur_review_success_times = 0
    cur_like_success_times = 0
    articles = 0
    print ("第"+str(i)+"个链接进行selenium :"+url_lists[i])
    
    category_handle(url_lists[i],sleep_time)
    print ("访问共"+str(articles)+"条")
    
time_end=time.time()
print('all time cost',(time_end-time_start)/60,'min')

函数内部做了异常处理,兼容性应该很强,直接跑代码试试。有疑问欢迎评论区下留言,尽量及时回复。

评论 58
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值