Python爬虫-Selenium(2)
@(博客)[selenium, python, 爬虫]
前言
上一次说了一些关于selenium的使用以及固定的配置(禁止提示,禁止加载图片,无头设置),可selenium的强大远不于此。
动作链
动作链与节点交互有些不同,通常是指鼠标拖拽,键盘按键等
1. 拖拽
菜鸟教程中有个展示jquery拖拽效果的地址,可以用来练手(http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable)
首先导入:from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get("http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable")
# 切换到子frame,这里的参数是子frame的id值
browser.switch_to.frame("iframeResult")
# 找到两个节点
startNode = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ui-draggable")))
endNode = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "ui-droppable")))
# 实例化一个动作链对象
actions = ActionChains(browser)
# 装载一个从“startNode到endNode”的拖拽动作
actions.drag_and_drop(startNode, endNode)
# 执行这个动作
actions.perform()
time.sleep(3)
browser.quit()
实现效果:
2. 滑动
现今有许多页面会有滑动解锁的验证,selenium也可以帮我们模拟实现滑动效果。这里用国家企业信用信息公示系统(上海)网页来演示(http://www.sgs.gov.cn/notice)
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get("http://www.sgs.gov.cn/notice")
# 输入框
input = wait.until(EC.presence_of_element_located((By.CLASS_NAME, "inputSearch")))
input.send_keys("百度")
# 查询按钮
clickBtn = wait.until(EC.element_to_be_clickable((By.CLASS_NAME, "buttonSearch")))
clickBtn.click()
actions = ActionChains(browser)
# 滑动解锁中的按钮
slider = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "div.gt_slider_knob.gt_show")))
# 摁住按钮
actions.click_and_hold(slider).perform()
# 向右滑动100个像素
actions.move_by_offset(100, 0).perform()
time.sleep(2)
browser.quit()
运行效果:
3. 其他
ActionChains提供的常用方法:
click(on_element=None)
单击鼠标左键click_and_hold(on_element=None)
点击鼠标左键,按住不放context_click(on_element=None)
点击鼠标右键double_click(on_element=None)
双击鼠标左键drag_and_drop(source,target)
拖拽到某个元素然后松开drag_and_drop_by_offset(source,xoffset, yoffset)
#拖拽到某个坐标然后松开move_by_offset(xoffset,yoffset)
鼠标移动到距离当前位置(x,y)move_to_element(to_element)
鼠标移动到某个元素move_to_element_with_offset(to_element,xoffset, yoffset)
将鼠标移动到距某个元素多少距离的位置release(on_element=None)
在某个元素位置松开鼠标左键perform()
执行链中的所有动作
执行js语句
通过execute_script()
来执行js脚本,参数为js语句
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get("http://www.baidu.com")
# 这个js脚本第一句是选中id为head的节点;第二句是为这个节点添加属性style="background: blue"
jsScript = """
var body = document.getElementById("head");
body.setAttribute("style", "background: blue");
"""
# 执行脚本文件
browser.execute_script(jsScript)
time.sleep(2)
browser.quit()
运行效果:
因为可以执行js语句,那么自然就允许新开选项卡的操作,selenium提供window_handles属性返回选项卡,switch_to.window()
方法切换选项卡
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get("http://www.baidu.com/")
# 新开选项卡
browser.execute_script("window.open()")
# 切换到第二个选项卡
browser.switch_to.window(browser.window_handles[1])
browser.get("http://www.taobao.com/")
# 切换到第一个选项卡
browser.switch_to.window(browser.window_handles[0])
time.sleep(2)
browser.quit()
运行效果:
其他
1. Select
表单中存在下拉选项卡的时候,可以通过三种方法进行选择
select_by_index()
select_by_visible_text()
select_by_value()
browser = webdriver.Chrome()
browser.maximize_window()
browser.get("http://127.0.0.1:8000/")
citySelect = Select(browser.find_element_by_id("city"))
citySelect.select_by_index(2) # 通过索引
hobbySelect = Select(browser.find_element_by_id("hobby"))
hobbySelect.select_by_visible_text("跑步") # 通过文本
genderSelect = Select(browser.find_element_by_id("gender"))
genderSelect.select_by_value("girl") # 通过value值
time.sleep(2)
browser.quit()
运行效果:
2. Alert
可能会遇到浏览器弹出alert框,如:
此时需要导入:from selenium.webdriver.common.alert import Alert
alert = Alert(browser)
alert.accept() # 确定
alert.dismiss() # 取消