原本设想是使用selenium来编写一个自动化发送弹幕的机器人。来代替我发送弹幕来进行弹幕抽奖等。代码如下

# coding: UTF-8
 from selenium import webdriver
 from selenium.webdriver.common.keys import Keys
 import time
 import pyperclip
 from selenium.webdriver.support.wait import WebDriverWait         #实例化1个谷歌浏览器对象
 #
 browser=webdriver.Chrome()
 browser.get('https://www.douyu.com/')#进入斗鱼首页 #登录
 WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-header"]/div/div/div[3]/div[7]/div/div/a/span'))#显示等待直到有登录
 browser.find_element_by_xpath('//*[@id="js-header"]/div/div/div[3]/div[7]/div/div/a/span').click()#点击头像
 browser.implicitly_wait(5)#隐式等待五分钟,等待加载

斗鱼 弹幕 python_软件测试

browser.switch_to_frame('login-passport-frame')#进入弹出的登录框中
 WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="loginbox"]/div[2]/div[1]/div[2]'))#显示等待
 browser.find_element_by_xpath('//*[@id="loginbox"]/div[2]/div[1]/div[2]').click()#点击转换页面,转为电话号码登录

斗鱼 弹幕 python_python_02

WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[6]/input'))#显示等待

#输入账号密码
 user=input("请输入账号:")
 passwd=input("请输入密码:")
 browser.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[1]/div/input').send_keys(user)
 browser.find_element_by_xpath('//*[@id="loginbox"]/div[3]/div[2]/div/form/div[3]/input[1]').send_keys(passwd)

斗鱼 弹幕 python_爬虫_03


#由于需要进行图片和短信验证码验证,所以此处提示手动在浏览器通过验证
 print('请在页面点击登录并通过验证。')
login = input("请输入是否登录完成y/n:")
 browser.switch_to.default_content()#退出登录框
 browser.implicitly_wait(5)#隐式等待
 #输入判断是否发弹幕
 panduan = input("请输入是否发弹幕y/n:")#想要发送弹幕就进入循环
while panduan=='y':
     #通过搜索房间号的方式,并点击搜索到的连接进入想要抽奖的直播间     u = input("请输入需要发送弹幕的直播间号:")
     browser.switch_to_window(browser.window_handles[-1])#跳到新打开的页面
     browser.find_element_by_class_name("Search-text").clear()
     browser.find_element_by_class_name("Search-text").send_keys(u)#将房间号传入搜索框
     browser.find_element_by_class_name("Search-text").send_keys(Keys.ENTER)#模拟enter键

斗鱼 弹幕 python_斗鱼 弹幕 python_04


time.sleep(5)#程序沉睡五秒,进行加载
     browser.switch_to_window(browser.window_handles[0])
     browser.close()#关闭上一个页面
     browser.switch_to_window(browser.window_handles[-1])
     browser.execute_script("document.body.style.zoom='0.67'")#将新页面尺寸调整为%67
#在搜索到的页面点击进入房间
     WebDriverWait(browser, 10, 0.2).until(
         lambda x: x.find_element_by_xpath('//*[@id="js-search-result"]/section[3]/section[2]/section[1]/div[2]/div/a'))    browser.find_element_by_xpath('//*[@id="js-search-result"]/section[3]/section[2]/section[1]/div[2]/div/a').send_keys(
         Keys.ENTER)

斗鱼 弹幕 python_爬虫_05


time.sleep(5)
     browser.close()#关闭上一个页面
     browser.switch_to_window(browser.window_handles[-1])
     panduan1='y'
     browser.execute_script("document.body.style.zoom='0.67'")
#选择发弹幕方式进入两个分支自定义或字典
     c_type=int(input("请输入方式,输入1手动设定弹幕,输入2使用字典:"))
     if c_type==1:#进入发弹幕循环,直到时间超时
         while panduan1=='y':
             #以秒为单位设定抽奖参数,并抽奖
             a=input("请输入发送的弹幕:")
             b=float(input("发送弹幕的时间/s:"))
             c=float(input("发送弹幕的时间间隔/s:"))            starttime=time.time()#获取此时时间
#此时时间减去开始时间比设定的弹幕发送时间小,则一直发送
            while(time.time() - starttime < b):
                 WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea'))                browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(a)#将弹幕传入输入框
                 time.sleep(c)#弹幕间的时间间隔
                 browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.ENTER)
             panduan1 = input("请输入是否继续在此直播间y/n:")
     elif c_type==2:
进入字典发弹幕循环,如果超时则暂停发送
         while panduan1=='y':
             #以秒为单位设定抽奖参数,并抽奖
             a=input("请输入文件名:")
             f_word = open(a + ".txt", 'r', encoding='UTF-8')#打开字典文件
             b=float(input("发送弹幕的时间/s:"))
             c=float(input("发送弹幕的时间间隔/s:"))            starttime=time.time()
            while(time.time() - starttime < b):
                 line=f_word.readline()#按行读取字典内的内容#当字典数据读完后,重新从开始位置进行读取
                 if line == '':
                     f_word.close()
                     f_word = open(a + ".txt", 'r', encoding='UTF-8')
                     continue
                 WebDriverWait(browser,10,0.2).until(lambda x:x.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea'))
                 line.replace("\n","")#将读取到的每一行的换行符删掉
                 pyperclip.copy(line)#将读取到的内容填入剪切板
                 browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.CONTROL,'v')#模拟键盘ctrl+v进行粘贴操作
                 time.sleep(c)
                 browser.find_element_by_xpath('//*[@id="js-player-asideMain"]/div/div[2]/div/div[2]/div[2]/textarea').send_keys(Keys.ENTER)
             f_word.close()
             panduan1 = input("请输入是否继续在此直播间发送弹幕y/n:")
     panduan=input("请输入是否换一个直播间y/n:")

斗鱼 弹幕 python_selenium_06

封装

结合thinter和pyinstaller可以封装成一个可移植的程序,只需在程序文件夹下放入自己系统谷歌浏览器对应的chromedriver.exe就可以实现在不同windows系统上进行迁移

斗鱼 弹幕 python_爬虫_07

斗鱼 弹幕 python_selenium_08