Selenium自动访问B站

在这里插入图片描述

文章目录

  • Selenium介绍与环境搭建
    • 功能介绍
    • 安装Selenium
    • ChromeDriver
  • 模仿B站登录
    • 构建ChromeDriver
    • Xpath核心回顾
  • 模拟用户发送消息
    • 模拟器常见操作实现
    • 翻页与异常捕获

Selenium介绍与环境搭建

Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera等。这个工具的主要功能包括:测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。

功能介绍

  1. 框架底层使用JavaScript模拟真实用户对浏览器进行操作。测试脚本执行时,浏览器自动按照脚本代码做出点击,输入,打开,验证等操作,就像真实用户所做的一样,从终端用户的角度测试应用程序。
  2. 使浏览器兼容性测试自动化成为可能,尽管在不同的浏览器上依然有细微的差别。
  3. 用简单,可使用Java,Python等多种语言编写用例脚本。

安装Selenium

Selenium自动访问B站_第1张图片

ChromeDriver

ChromeDriver 是 google 为网站开发人员提供的自动化测试接口,WebDriver是一个开源工具,用于在许多浏览器上自动测试webapps。它提供了导航到网页,用户输入,JavaScript执行等功能

  1. ChromeDriver的安装一定要与Chrome的版本一致,不然就不起作用,查看chrom的版本则在浏览器地址栏输入:chrome://version/
  2. Chromedriver下载地址: http://chromedriver.storage.googleapis.com/index.html

模仿B站登录

构建ChromeDriver

from selenium import webdriver
from selenium.webdriver import ActionChains
import time

driver = webdriver.Chrome(executable_path=r"../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(30)
# 切换到第二个选项卡    driver.switch_to_frame()
driver.switch_to_window(driver.window_handles[1])
self.driver.switch_to.window(self.driver.window_handles[1])
# 页面左边两个忽略掉
showIM_list = self.driver.find_elements_by_xpath("//span[@class='vip-name-check fans-name']")
print('当前页私信联系数量:', len(showIM_list))

Xpath核心回顾

XPath 是一门在 XML、HTML 文档中查找信息的语言,XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式

Selenium自动访问B站_第2张图片

from lxml import etree

wb_data = """

"""

html =  etree.HTML(wb_data)
# 通过etree.HTML把字符串转化为  Element html 对象
print(html)
# 可以看出在来的标签上面添加了html和body标签
print(etree.tostring(html))
print('用法1:获取某个标签元素(标签 + 属性 + 值),a后面不用再加斜杆,否则报错')
data = html.xpath("/html/body/div/ul/li/a")
for i in data:
    print(i.text)

print('用法2:获取某个标签元素的内容(直接在需要查找内容的标签后面加一个/text()即可)')
data = html.xpath("/html/body/div/ul/li/a/text()")
for i in data:
    print(i)

print('用法3:获取a标签的某个属性,//表示文档里的任何位置的节点')
data = html.xpath('//li//a/@href')
for i in data:
    print(i)

print('用法4:找到路径下a标签属性等于link2.html的内容')
data = html.xpath("//a[@href='link2.html']/text()")
print(data) # 返回的都是List列表类型
for i in data:
    print(i)

print('用法5:查找倒数第二个li标签里的a标签的href属性')
data = html.xpath("//li[last()-1]/a/text()")
for i in data:
    print(i)

模拟用户发送消息

模拟器常见操作实现

from selenium import webdriver
from selenium.webdriver import ActionChains
import time

driver = webdriver.Chrome(executable_path="../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(40)
# 切换选项卡功能
driver.switch_to_window(driver.window_handles[1])
# xpath   // 代表从任何路径开始, @代表的是属性
showIM_list = driver.find_elements_by_xpath("//span[@class='vip-name-check fans-name']")
print('当前页的粉丝数量为:',len(showIM_list))

for index, im in enumerate(showIM_list):
	# ActionChains: https://www.cnblogs.com/king8/p/10383308.html
	ActionChains(driver).move_to_element(im).perform()
	time.sleep(1)
	# 鼠标放上去后通过 shift + Q 可以采用快捷键 触发检查元素,默认是在当前页面打开,如果想新开页面则获取地址,手动打开
	href = driver.find_element_by_xpath("//a[@class='btn idc-btn default']")
	url = href.get_attribute("href")
	# 执行js相关代码此方法重要
	driver.execute_script("window.open('" + url + "')")
	time.sleep(2)
	# # 切换到新tab页面(第三个页面)
	driver.switch_to.window(driver.window_handles[2])
	textarea = driver.find_element_by_xpath("//textarea[@class='textarea'][@placeholder='回复一下吧~']")
	textarea.send_keys("测试一下!")
	time.sleep(1)
	# textarea文本域写了内容后,在按钮处会自动添加一个active样式
	send_text = driver.find_element_by_xpath("//button[@class='btn-box send-btn active']")
	print(send_text)
	# send_text.click()
	driver.close()  # 关闭当前tab选项卡
    driver.switch_to.window(driver.window_handles[1])

翻页与异常捕获

第一页所有数据搞定是没有意义的,很多时候我们需要实现翻页效果,其次当前用户操作失败如果没有异常捕获那么程序会自动停止,因此为了程序的健壮性可以在操作的部分捕获异常。

from selenium import webdriver
import time
from selenium.webdriver import ActionChains

driver = webdriver.Chrome(executable_path="../data/chromedriver.exe")
driver.get("https://passport.bilibili.com/login")
time.sleep(40)
# 切换选项卡功能
driver.switch_to_window(driver.window_handles[1])

def send_message():
    # xpath   // 代表从任何路径开始, @代表的是属性
    showIM_list = driver.find_elements_by_xpath(
        "//span[@class='vip-name-check fans-name' or @class='vip-name-check fans-name this-is-vip']")
    print('当前页的粉丝数量为:', len(showIM_list))

    for index, im in enumerate(showIM_list[:2]):
        try:
            # 执行鼠标移动的功能
            ActionChains(driver).move_to_element(im).perform()
            time.sleep(1)
            href = driver.find_element_by_xpath("//a[@class='btn idc-btn default']")
            url = href.get_attribute('href')
            # 创建一个新tab选项卡,可以调用js来完成
            driver.execute_script("window.open('" + url + "')")
            time.sleep(2)
            # 切换的新的选项卡
            driver.switch_to.window(driver.window_handles[2])
            textarea = driver.find_element_by_xpath("//textarea[@class='textarea'][@placeholder='回复一下吧~']")
            textarea.send_keys('感谢您的关注!')
            btn = driver.find_element_by_xpath("//button[@class='btn-box send-btn active']")
            # print(btn)
            btn.click()
            time.sleep(2)
        except Exception as e:
            print(f'第{index}行,推送消息失败,错误消息为:{e.msg}')
        finally:
            driver.close()  # 关闭当前tab选项卡
            driver.switch_to.window(driver.window_handles[1])
            time.sleep(2)
    next_page = driver.find_element_by_xpath("//li[@class='be-pager-next'][@title='下一页']")
    next_page.click()
    time.sleep(3)
    send_message()

# 启动时候调用当前函数
send_message()

在这里插入图片描述

你可能感兴趣的:(Python有意思)