没有运行环境的可以参考这篇: https://www.jinke.love/4753.html
功能演示
完整代码
代码使用Python3编写的自动关注程序,使用了Selenium和Tkinter库,还使用多线程处理关闭浏览器和结束Tkinter应用程序。
程序打开浏览器并访问特定网站,并与网页交互,点击按钮和滚动页面。使用Tkinter创建右下角弹出窗口,显示操作结果。程序使用多线程,一个线程运行Selenium和Tkinter任务,另一个线程负责主Tkinter窗口。
使用此源码时,需要下载安装好谷歌浏览器,并且使用谷歌浏览器登录好CSDN账号,再将源码浏览器缓存路径改为自己的浏览器缓存路径。
import threading import time import tkinter as tk from selenium import webdriver from selenium.common.exceptions import TimeoutException from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.support.ui import WebDriverWait class PopupWindow: def __init__(self, master): self.master = master self.popup = tk.Toplevel() self.popup.wm_overrideredirect(True) # 隐藏窗口边框和标题栏 self.popup.wm_attributes('-topmost', 1) # 窗口置顶 self.popup_frame = tk.Frame(self.popup) self.popup_frame.pack() self.popup_text = tk.Text(self.popup_frame, wrap='word') self.popup_text.pack(side='left', fill='both', expand=True) self.scrollbar = tk.Scrollbar(self.popup_frame, command=self.popup_text.yview) self.scrollbar.pack(side='right', fill='y') self.popup_text.config(yscrollcommand=self.scrollbar.set) self.set_window_position() def set_window_position(self): screen_width = self.master.winfo_screenwidth() screen_height = self.master.winfo_screenheight() window_width = 200 window_height = 100 self.popup.geometry( f'{window_width}x{window_height}+{screen_width - window_width - 10}+{screen_height - window_height - 10}') def update_content(self, message): self.popup_text.insert('end', message + '\n') self.popup_text.see('end') # 滚动到最底部 def getTab(driverObj): div_element = WebDriverWait(driverObj, 10).until( EC.visibility_of_element_located((By.CLASS_NAME, 'blog-nav-box')) ) action = ActionChains(driverObj) action.move_to_element(div_element).perform() # 找到div元素下的所有a标签 a_elements = div_element.find_elements(By.TAG_NAME, 'a') return [tabname.text for tabname in a_elements] def changeTab(driverObj, tabName, popupWindow): try: parent_div = WebDriverWait(driverObj, 5).until( EC.visibility_of_element_located((By.CLASS_NAME, 'blog-nav-box'))) action = ActionChains(driverObj) action.move_to_element(parent_div).perform() top_tab = WebDriverWait(driverObj, 5).until( EC.element_to_be_clickable((By.XPATH, f'//a[text()="{tabName}"]'))) action.move_to_element(top_tab).click().perform() # 模拟鼠标移动到顶部标签并点击 except TimeoutException: return def followUser(driverObj, tabName, popupWindow): try: fnum = 0 sipder = WebDriverWait(driverObj, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 'template-cont'))) if not sipder: return recommendations = WebDriverWait(driverObj, 5).until( EC.presence_of_all_elements_located((By.CLASS_NAME, 'recommendation'))) for recommendation in recommendations: follow_button = recommendation.find_element(By.CLASS_NAME, 'recommendation-btn') if 'active' not in follow_button.get_attribute('class'): follow_button.click() fnum += 1 popupWindow.update_content(f'{tabName}关注量:{fnum}') except Exception as e: popupWindow.update_content(f'{tabName}侧栏未显示') return def run_selenium_and_tkinter(popupWindow): options = webdriver.ChromeOptions() options.add_argument('--start-maximized') options.add_argument('user-data-dir=C:\\Users\zhangjinke\AppData\Local\Google\Chrome\\User Data') options.add_experimental_option('detach', True) driver = webdriver.Chrome(options=options) driver.get('https://blog.csdn.net') tablist = getTab(driver) # 其他代码保持不变 try: for tabname in tablist: popupWindow.update_content('当前标签页: ' + tabname) changeTab(driver, tabname, popupWindow) followUser(driver, tabname, popupWindow) # 将tabName传递给followUser # time.sleep(1) driver.execute_script('window.scrollTo(0, 0)') finally: # 关闭浏览器并结束所有进程 close_all_processes(driver, root, popupWindow.popup) def close_all_processes(driver, root, popup): driver.quit() # 关闭浏览器 root.destroy() # 结束Tkinter主窗口 popup.destroy() # 关闭提示窗口 if __name__ == '__main__': root = tk.Tk() root.withdraw() # 隐藏Tkinter主窗口 popup_window = PopupWindow(root) # 创建线程来运行Selenium和Tkinter selenium_thread = threading.Thread(target=run_selenium_and_tkinter, args=(popup_window,)) selenium_thread.start() popup_window.update_content('主任务启动成功') root.protocol('WM_DELETE_WINDOW', lambda: [root.destroy(), popup_window.popup.destroy()]) # 处理窗口关闭事件 root.mainloop()
Comments NOTHING