本页源码可以在这里下载。

使用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 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用 * 标注