Python爬虫-Selenium(2)

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() # 取消

猜你喜欢

转载自blog.csdn.net/qq_41359051/article/details/82594412