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 Optionsif __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 webdriverfrom selenium.webdriver import Chromefrom selenium.webdriver import ChromeOptionsif __name__ == '__main__':# 实现规避检测option = ChromeOptions()option.add_experimental_option('excludeSwitches', ['enable-automation'])bro = Chrome(executable_path='./chromedriver.exe', options=option)
7、自动化测试淘宝搜索
from selenium import webdriverfrom time import sleepif __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 webdriverfrom lxml import etreefrom time import sleep# 导入动作链相关的包from selenium.webdriver import ActionChainsif __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()
