目录
1.简介
Selenium是一个Web的自动化测试工具,类型像我们玩游戏用的按键精灵,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器)。
Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生。
但是被用歪了,现在一般作为破解反爬的一种手段,一般用于解决动态页面或者js加密的爬虫问题。(ps:只要有js参与页面动态生成元素的都叫动态页面)
2.模块安装与环境搭建
2.1Selenium库的安装
pip install selenium==3.8.0
最好安装3.8.0版本的,方便后期方法的使用。
2.2浏览器驱动的安装
因为本文章主要讲的时网页自动化,所以需要安装浏览器驱动,这里安装并使用的是谷歌浏览器驱动。
注意:安装浏览器驱动时前提要看一下自己浏览器的版本,在下面网址中下载与自己浏览器版本相同的驱动。
谷歌浏览器下载配置:打开如下页面:CNPM Binaries Mirror
把exe文件放置到如下位置之一:Python的安装目录下(建议放这里 自己的python环境安装目录)
2.3测试
# 导入selenium的web驱动对象
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
print(driver.page_source)
如果网页正常打开了百度网页就说明环境搭建成功了。
失败原因:
1.浏览器驱动版本与浏览器的版本没有对应。
2.浏览器驱动的位置没有放对地方。
3.相关知识
3.1快速入门
from selenium import webdriver
import time
# 打开浏览器驱动
driver = webdriver.Chrome()
# 加载网址
driver.get("http://www.baidu.com")
# 页面源码
print(driver.page_source)
# 获取 cookie
print(driver.get_cookies())
# url
print(driver.current_url)
# 截图
driver.save_screenshot("./baidu0.png")
# 输入
driver.find_element_by_id("kw").send_keys("996")
time.sleep(2)
# 截图
driver.save_screenshot("./baidu1.png")
# 点击
driver.find_element_by_id("su").click()
time.sleep(2)
# 截图
driver.save_screenshot("./baidu2.png")
# 退出
driver.quit()
以上代码是进行网页自动化时常用到的方法。主要可以进行一些截图,获取cookies,模拟点击,登录等操作。
3.2定位UI元素
定位单个元素主要使用find_element_by_xpath,定位多个相同元素主要使用find_elements_by_xpath。当然也可以使用find_elements_by_id等。
(以find_element_by_xpath方法为例)获取标签的text值使用的是/text(),获取属性值使用的是@属性名。
# 通过xpath查找(select_one)
find_element_by_xpath
/text()
/@属性名
多个元素查找(select)
find_elements_by_xpath
find_elements_by_xxx
3.3添加代理IP
from selenium import webdriver
options = webdriver.ChromeOptions() # 创建一个配置对象
options.add_argument('--proxy-server=http://120.38.68.247:17167') # 使用代理ip
driver = webdriver.Chrome(chrome_options=options) # 实例化带有配置的driver对象
3.4携带用户信息启动
options = webdriver.ChromeOptions()
options.add_argument("--user-data-dir=C:/Users/自己C盘中用户文件夹中的个人文件夹/AppData/Local/Google/Chrome/User Data/")
driver = webdriver.Chrome(options=options)
使用这种方式更加真实的模拟浏览器访问,使用的是用户本地的信息,但是每次只能启动一个浏览器进程。如果程序报错想要再次进行测试就必须先把浏览器关掉。
4.自动化抢红包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
driver = webdriver.Chrome()
# 最大化网页
driver.maximize_window()
# 打开网址
driver.get('https://www.csdn.net/')
sleep(1)
# 定位登录/注册 按钮,并点击
Login_button = driver.find_element(By.CLASS_NAME, 'toolbar-btn-loginfun')
Login_button.click()
sleep(1)
# 切换iframe表单
driver.switch_to.frame('passport_iframe')
sleep(1)
# 定位密码登录按钮并点击
Passwor_login = driver.find_element(By.XPATH, '//span[4]')
Passwor_login.click()
sleep(1)
# 定位账号密码输入栏
User_information = driver.find_elements(By.TAG_NAME, 'input')
# 清空账号栏
User_information[0].clear()
# 输入账号
User_information[0].send_keys('用户名')
sleep(1)
# 清空密码栏
User_information[1].clear()
# 输入密码
User_information[1].send_keys('密码')
sleep(1)
driver.find_element(By.CLASS_NAME, 'icon-nocheck').click()
Login = driver.find_element(By.CLASS_NAME, 'base-button')
Login.click()
sleep(5)
# 切换回主页面
driver.switch_to.default_content()
sleep(5)
# 定位社区按钮,并点击
driver.find_element_by_xpath('//*[@id="csdn-toolbar"]/div/div/div[1]/ul/li[4]/a').click()
time.sleep(3)
driver.find_element_by_xpath('//*[@id="tab-4"]').click()
time.sleep(3)
item = 1
while True:
time.sleep(5)
li_list = driver.find_elements_by_xpath('//div[@class="tab-list-item blink"]')[item]
driver.execute_script("arguments[0].scrollIntoView();", li_list)
if item % 10 == 0:
driver.execute_script("arguments[0].scrollIntoView();", li_list)
li_list.click()
time.sleep(2)
# 定位红包按钮,并点击
driver.switch_to_window(driver.window_handles[1])
time.sleep(2)
try:
driver.find_element_by_xpath('//span[@class="amount"]').click()
time.sleep(2)
if driver.find_element_by_xpath("//div[@class='env-container']/div[@id='preOpen']/footer/div[@class='red-openbtn open-start']"):
print(driver.find_element_by_xpath("//div[@class='env-container']/div[@id='preOpen']/footer/div[@class='red-openbtn open-start']"))
driver.find_element_by_xpath("//div[@class='env-container']/div[@id='preOpen']/footer/div[@class='red-openbtn open-start']").click()
time.sleep(2)
driver.find_element_by_xpath("//div[@class='close-btn']").click()
print(item)
except Exception as e:
driver.find_element_by_xpath("//div[@class='redpack-card redpack-card-overdue large']").click()
time.sleep(2)
if driver.find_element_by_xpath("//div[@class='env-container']/div[@id='preOpen']/footer/div[@class='red-openbtn open-start']"):
driver.find_element_by_xpath("//div[@class='env-container']/div[@id='preOpen']/footer/div[@class='red-openbtn open-start']").click()
time.sleep(2)
driver.find_element_by_xpath("//div[@class='close-btn']").click()
print(item)
except Exception as e:
pass
driver.close()
time.sleep(1)
# 切换
driver.switch_to_window(driver.window_handles[0])
item += 1
该案例就是使用自动化模拟浏览器登录并进行自动抢红包功能,后期还会进行代码修改,喜欢的话加关注作者吧。