本页源码可以在这里下载。
使用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 条评论