本页源码可以在这里下载。
使用selenium自动发送斗鱼弹幕
首先确定思路,第一次登录,获取到有效cookies之后对cookies进行保存,然后以后直接使用cookies进行登录,模拟点击发送弹幕。
首先看登录按钮:
第一次点击按钮来登录。
然后将cookies序列化保存。
代码:
def login(url): driver.get(url) driver.maximize_window() print(driver.title) time.sleep(1) login_button = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#header > div > div > div.o-unlogin.fl > a.u-login.fl"))) # 点击登录按钮 login_button.click() # 这个时候我们用二维码登录,设置最多等待3分钟,如果登录那个区域是可见的,就登录成功 WebDriverWait(driver, 180).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "#header > div > div > div.o-login.fl"))) print("登录成功") # 保存cookie到cookies.pkl文件 session = requests.Session() # 获取cookie cookies = driver.get_cookies() # 把cookie写入文件 if not os.path.exists("cookie"): os.mkdir("cookie") pickle.dump(cookies, open("./cookie/cookies.pkl", "wb"))
使用cookies进行登录:
def login_with_cookie(url): driver.get("https://www.douyu.com") # 把cookie文件加载出来 with open("./cookie/cookies.pkl", "rb") as cookiefile: cookies = pickle.load(cookiefile) for cookie in cookies: # print(cookie) driver.add_cookie(cookie) time.sleep(3) driver.get(url) # 如果cookie没有登录成功,退出程序 try: WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "#header > div > div > div.o-login.fl"))) except: print("对不起,使用cookie登录失败,请先删除cookies文件再重新登录") os._exit(0) print("登录成功") print(driver.title)
发送弹幕,其中弹幕保存在danmu.dm文件下:
def send_barrage(): file = open("danmu.dm", mode='r', encoding='utf-8') while (True): line = file.readline() if not line: file.seek(0) continue wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > textarea"))).send_keys(line) time.sleep(TIME) wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > div.b-btn"))).click() # 清空输入框信息 wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > textarea"))).clear() print(line)
主函数,设置了等待时间和修改chrome配置:
if __name__ == "__main__": options = webdriver.ChromeOptions() prefs = { "profile.default_content_setting_values.plugins": 1, "profile.content_settings.plugin_whitelist.adobe-flash-player": 1, "profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player": 1, "PluginsAllowedForUrls": "https://www.douyu.com" } # 修改chrome配置 options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path="./driver/win/chromedriver.exe", chrome_options=options) # 隐式等待是全局性的,只要用了driver.findxx没有第一时间找到元素,就会等待5s,当然一般都被用wait覆盖掉了 driver.implicitly_wait(5) # 显示等待是定向性的,最大等待时间10s,每次检测元素有没有生成的时间间隔300ms,过了最大等待时间抛出异常 wait = WebDriverWait(driver, timeout=10, poll_frequency=300) url = 'https://www.douyu.com/' + ROOM_ID if os.path.exists("./cookie/cookies.pkl"): print("存在Cookies,自动登录") login_with_cookie(url) else: print("不存在cookie,手动登录") login(url) send_barrage()
完整代码:
# -*- coding:utf-8 -*- import os from selenium import webdriver from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from config import * import time import requests import pickle def login(url): driver.get(url) driver.maximize_window() print(driver.title) time.sleep(1) login_button = wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#header > div > div > div.o-unlogin.fl > a.u-login.fl"))) # 点击登录按钮 login_button.click() # 这个时候我们用二维码登录,设置最多等待3分钟,如果登录那个区域是可见的,就登录成功 WebDriverWait(driver, 180).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "#header > div > div > div.o-login.fl"))) print("登录成功") # 保存cookie到cookies.pkl文件 session = requests.Session() # 获取cookie cookies = driver.get_cookies() # 把cookie写入文件 if not os.path.exists("cookie"): os.mkdir("cookie") pickle.dump(cookies, open("./cookie/cookies.pkl", "wb")) def login_with_cookie(url): driver.get("https://www.douyu.com") # 把cookie文件加载出来 with open("./cookie/cookies.pkl", "rb") as cookiefile: cookies = pickle.load(cookiefile) for cookie in cookies: # print(cookie) driver.add_cookie(cookie) time.sleep(3) driver.get(url) # 如果cookie没有登录成功,退出程序 try: WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.CSS_SELECTOR, "#header > div > div > div.o-login.fl"))) except: print("对不起,使用cookie登录失败,请先删除cookies文件再重新登录") FIRST_TIME = True os._exit(0) print("登录成功") print(driver.title) def send_barrage(): file = open("danmu.dm", mode='r', encoding='utf-8') while (True): line = file.readline() if not line: file.seek(0) continue wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > textarea"))).send_keys(line) time.sleep(TIME) wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > div.b-btn"))).click() # 清空输入框信息 wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, "#js-send-msg > textarea"))).clear() print(line) if __name__ == "__main__": options = webdriver.ChromeOptions() prefs = { "profile.default_content_setting_values.plugins": 1, "profile.content_settings.plugin_whitelist.adobe-flash-player": 1, "profile.content_settings.exceptions.plugins.*,*.per_resource.adobe-flash-player": 1, "PluginsAllowedForUrls": "https://www.douyu.com" } # 修改chrome配置 options.add_experimental_option("prefs", prefs) driver = webdriver.Chrome(executable_path="./driver/win/chromedriver.exe", chrome_options=options) # 隐式等待是全局性的,只要用了driver.findxx没有第一时间找到元素,就会等待5s,当然一般都被用wait覆盖掉了 driver.implicitly_wait(5) # 显示等待是定向性的,最大等待时间10s,每次检测元素有没有生成的时间间隔300ms,过了最大等待时间抛出异常 wait = WebDriverWait(driver, timeout=10, poll_frequency=300) url = 'https://www.douyu.com/' + ROOM_ID if os.path.exists("./cookie/cookies.pkl"): print("存在Cookies,自动登录") login_with_cookie(url) else: print("不存在cookie,手动登录") login(url) send_barrage()
.
0 条评论