Selenium实现CSDN自动关注

22 次阅读 预计阅读时间: 4 分钟


n

没有运行环境的可以参考这篇: https://www.jinke.love/4753.html

nnnn

功能演示

nnnn
nnnn

完整代码

nnnn

代码使用Python3编写的自动关注程序,使用了Selenium和Tkinter库,还使用多线程处理关闭浏览器和结束Tkinter应用程序。
程序打开浏览器并访问特定网站,并与网页交互,点击按钮和滚动页面。使用Tkinter创建右下角弹出窗口,显示操作结果。程序使用多线程,一个线程运行Selenium和Tkinter任务,另一个线程负责主Tkinter窗口。
使用此源码时,需要下载安装好谷歌浏览器,并且使用谷歌浏览器登录好CSDN账号,再将源码浏览器缓存路径改为自己的浏览器缓存路径。

nnnn
import threadingnimport timenimport tkinter as tknfrom selenium import webdrivernfrom selenium.common.exceptions import TimeoutExceptionnfrom selenium.webdriver import ActionChainsnfrom selenium.webdriver.common.by import Bynfrom selenium.webdriver.support import expected_conditions as ECnfrom selenium.webdriver.support.ui import WebDriverWaitnclass PopupWindow:n    def __init__(self, master):n        self.master = mastern        self.popup = tk.Toplevel()n        self.popup.wm_overrideredirect(True)  # 隐藏窗口边框和标题栏n        self.popup.wm_attributes('-topmost', 1)  # 窗口置顶n        self.popup_frame = tk.Frame(self.popup)n        self.popup_frame.pack()n        self.popup_text = tk.Text(self.popup_frame, wrap='word')n        self.popup_text.pack(side='left', fill='both', expand=True)n        self.scrollbar = tk.Scrollbar(self.popup_frame, command=self.popup_text.yview)n        self.scrollbar.pack(side='right', fill='y')n        self.popup_text.config(yscrollcommand=self.scrollbar.set)n        self.set_window_position()n    def set_window_position(self):n        screen_width = self.master.winfo_screenwidth()n        screen_height = self.master.winfo_screenheight()n        window_width = 200n        window_height = 100n        self.popup.geometry(n            f'{window_width}x{window_height}+{screen_width - window_width - 10}+{screen_height - window_height - 10}')n    def update_content(self, message):n        self.popup_text.insert('end', message + '\n')n        self.popup_text.see('end')  # 滚动到最底部ndef getTab(driverObj):n    div_element = WebDriverWait(driverObj, 10).until(n        EC.visibility_of_element_located((By.CLASS_NAME, 'blog-nav-box'))n    )n    action = ActionChains(driverObj)n    action.move_to_element(div_element).perform()n    # 找到div元素下的所有a标签n    a_elements = div_element.find_elements(By.TAG_NAME, 'a')n    return [tabname.text for tabname in a_elements]ndef changeTab(driverObj, tabName, popupWindow):n    try:n        parent_div = WebDriverWait(driverObj, 5).until(n            EC.visibility_of_element_located((By.CLASS_NAME, 'blog-nav-box')))n        action = ActionChains(driverObj)n        action.move_to_element(parent_div).perform()n        top_tab = WebDriverWait(driverObj, 5).until(n            EC.element_to_be_clickable((By.XPATH, f'//a[text()="{tabName}"]')))n        action.move_to_element(top_tab).click().perform()  # 模拟鼠标移动到顶部标签并点击n    except TimeoutException:n        returnndef followUser(driverObj, tabName, popupWindow):n    try:n        fnum = 0n        sipder = WebDriverWait(driverObj, 5).until(EC.visibility_of_element_located((By.CLASS_NAME, 'template-cont')))n        if not sipder:n            returnn        recommendations = WebDriverWait(driverObj, 5).until(n            EC.presence_of_all_elements_located((By.CLASS_NAME, 'recommendation')))n        for recommendation in recommendations:n            follow_button = recommendation.find_element(By.CLASS_NAME, 'recommendation-btn')n            if 'active' not in follow_button.get_attribute('class'):n                follow_button.click()n                fnum += 1n        popupWindow.update_content(f'{tabName}关注量:{fnum}')n    except Exception as e:n        popupWindow.update_content(f'{tabName}侧栏未显示')n        returnndef run_selenium_and_tkinter(popupWindow):n    options = webdriver.ChromeOptions()n    options.add_argument('--start-maximized')n    options.add_argument('user-data-dir=C:\\Users\zhangjinke\AppData\Local\Google\Chrome\\User Data')n    options.add_experimental_option('detach', True)n    driver = webdriver.Chrome(options=options)n    driver.get('https://blog.csdn.net')n    tablist = getTab(driver)n    # 其他代码保持不变n    try:n        for tabname in tablist:n            popupWindow.update_content('当前标签页: ' + tabname)n            changeTab(driver, tabname, popupWindow)n            followUser(driver, tabname, popupWindow)  # 将tabName传递给followUsern            # time.sleep(1)n            driver.execute_script('window.scrollTo(0, 0)')n    finally:n        # 关闭浏览器并结束所有进程n        close_all_processes(driver, root, popupWindow.popup)ndef close_all_processes(driver, root, popup):n    driver.quit()  # 关闭浏览器n    root.destroy()  # 结束Tkinter主窗口n    popup.destroy()  # 关闭提示窗口nif __name__ == '__main__':n    root = tk.Tk()n    root.withdraw()  # 隐藏Tkinter主窗口n    popup_window = PopupWindow(root)n    # 创建线程来运行Selenium和Tkintern    selenium_thread = threading.Thread(target=run_selenium_and_tkinter, args=(popup_window,))n    selenium_thread.start()n    popup_window.update_content('主任务启动成功')n    root.protocol('WM_DELETE_WINDOW', lambda: [root.destroy(), popup_window.popup.destroy()])  # 处理窗口关闭事件n    root.mainloop()
n
最后更新于 2024-02-22