1、selenium模块
- selenium模块和爬虫的关系
- 可以非常便捷的获取网站中动态加载的数据
- 便捷的实现模拟登录
- 什么是selenium模块
- 基于浏览器自动化的一个模块。
- 可以通过编写相关的python代码[表示相关动作],触发到浏览器当中。
- 基于浏览器自动化的一个模块。
- selenium使用流程:
- 环境安装
- pip install selenium
- 环境安装
- 下载一个浏览器的驱动程序(谷歌)
- 实例化一个浏览器对象
**
- 编写基于浏览器自动化的操作代码
2、执行页面行为动作 (js代码)
F12在Console中可以进行测试
滚动:window.scrollTo(0,document.body.scrollHeight)
- 第一个参数是x 第二个参数是y
- document.body.scrollHeight :表示滚动一屏的高度
3、selenium方法和属性
方法/属性 | 作用 |
---|---|
bro = webdriver.Chrome(executable_path=”./chromedriver.exe”) | 获得一个浏览器对象 |
bro.back() | 回退 |
bro.get() | 发送get请求 |
bro.page_source 属性 | 获取页面源码数据 可用来生成树 |
bro.execute_script() | 执行一段js代码 |
bro.find_xxx_xx() | 进行标签定位 |
标签.send_keys() | 往标签里传入值 |
bro.forword() | 向前 |
bro.quit() | 关闭页面 |
4、selenium 处理 iframe
iframe: 在一个页面中嵌套一个子页面
**
如果你想定位的标签在iframe中,直接使用find_xxx_Xx是定位不到的
必须通过如下操作进行标签定位:
动作链
from selenium.webdriver import ActionChains
# 导包
action = ActionChains(浏览器对象)
# 创建动作链对象
action.click_and_hold(要移动的元素对象)
# 点击长按
action.move_by_offset(17, 0)
# 移动 x水平 y 垂直
action.perform()
# 立即执行动作链
action.release()
# 释放动作链
5、无头浏览器和规避检测
无头浏览器:不让浏览器弹出来,眼睛看不见,背地默默执行
from selenium import webdriver
# 导入无头浏览器相关的类
from selenium.webdriver.chrome.options import Options
if __name__ == '__main__':
# 无头浏览器进行参数设定
chrome_options = Options()
chrome_options.add_argument("--headless")
chrome_options.add_argument("--disable-gpu")
# --------------------------------------------
# 在创建浏览器对象时,多添加一个形参 chrome_options
# 这样就实现了无头浏览器
bro = webdriver.Chrome(executable_path="./chromedriver.exe", chrome_options=chrome_options)
bro.get("https://www.baidu.com")
print(bro.page_source)
6、规避selenium请求不被门户网站检测到
一些门户网站对于selenium进行了反爬机制,如果检测到请求时selenium发送的那就会直接阻挡本次请求
from selenium import webdriver
from selenium.webdriver import Chrome
from selenium.webdriver import ChromeOptions
if __name__ == '__main__':
# 实现规避检测
option = ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
bro = Chrome(executable_path='./chromedriver.exe', options=option)
7、自动化测试淘宝搜索
from selenium import webdriver
from time import sleep
if __name__ == '__main__':
bro = webdriver.Chrome(executable_path="./chromedriver.exe")
# 打开淘宝
bro.get("http://www.taobao.com")
# 标签定位 定位到搜索框
# find_element_by_id() 通过id来找到对应元素,并返回该元素
search_input = bro.find_element_by_id("q")
# 向搜索框中传入一个值
search_input.send_keys("iphone")
# 找到搜索按钮元素,class名只能是一个,中间不能有空格
button = bro.find_element_by_class_name("btn-search")
# 触发他的单击事件
button.click()
# 关闭浏览器
sleep(5)
bro.quit()
8、处理iframe和动作链
from selenium import webdriver
from lxml import etree
from time import sleep
# 导入动作链相关的包
from selenium.webdriver import ActionChains
if __name__ == '__main__':
url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
bro = webdriver.Chrome("./chromedriver.exe")
bro.get(url)
# 切换浏览器标签定位的作用域,切换到iframe 参数写iframe的id即可
bro.switch_to.frame("iframeResult")
# 拖动标签
# 动作链: 一系列连续的动作
# 1. 创建动作链对象,将浏览器对象作为参数传递进去
action = ActionChains(bro)
# 2. 点击且长按指定的元素 click_and_hold()
div1 = bro.find_element_by_id("draggable")
action.click_and_hold(div1)
# 3. 将div1元素进行移动,模拟人的移动使用循环
for i in range(1, 6):
# move_by_offset() 偏移方法 第一参数是x轴水平 第二个参数是y轴垂直
# perform() 让动作链立即执行
action.move_by_offset(17, 0).perform()
# 每次拖动完成后停顿一秒
sleep(0.2)
action.click(div1)
# 4. 释放动作链
action.release()