Python爬虫-Selenium(2) 傷城~ 2022-05-13 05:06 264阅读 0赞 # Python爬虫-Selenium(2) # @(博客)\[selenium, python, 爬虫\] * Python爬虫-Selenium(2) * 前言 * 动作链 * 1. 拖拽 * 2. 滑动 * 3. 其他 * 执行js语句 * 其他 * 1. Select * 2. Alert ## 前言 ## 上一次说了一些关于selenium的使用以及固定的配置(禁止提示,禁止加载图片,无头设置),可selenium的强大远不于此。 ## 动作链 ## 动作链与节点交互有些不同,通常是指鼠标拖拽,键盘按键等 ### 1. 拖拽 ### 菜鸟教程中有个展示jquery拖拽效果的地址,可以用来练手([http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable][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() **实现效果:** ![这里写图片描述][70] ### 2. 滑动 ### 现今有许多页面会有滑动解锁的验证,selenium也可以帮我们模拟实现滑动效果。这里用**国家企业信用信息公示系统(上海)**网页来演示([http://www.sgs.gov.cn/notice][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() **运行效果:** ![这里写图片描述][70 1] ### 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() **运行效果:** ![这里写图片描述][70 2] -------------------- 因为可以执行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() **运行效果:** ![这里写图片描述][70 3] ## 其他 ## ### 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() **运行效果:** ![这里写图片描述][70 4] ### 2. Alert ### 可能会遇到浏览器弹出alert框,如: ![这里写图片描述][70 5] 此时需要导入:`from selenium.webdriver.common.alert import Alert` alert = Alert(browser) alert.accept() # 确定 alert.dismiss() # 取消 [http_www.runoob.com_try_try.php_filename_jqueryui-api-droppable]: http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable [70]: /images/20220513/9c2647e1ac76477ca02f8d043ee72030.png [http_www.sgs.gov.cn_notice]: http://www.sgs.gov.cn/notice [70 1]: /images/20220513/a1cab479b9204e3bb89b0b5fa471dbab.png [70 2]: /images/20220513/6fbc84d3d65047b58f65d3e3f937619c.png [70 3]: /images/20220513/a5d4270f63e24508b9f3050483e9af56.png [70 4]: /images/20220513/4f46039fe0074299a99b46173d6a93d5.png [70 5]: /images/20220513/5c950caf179a470ea0aa2ca7eaef1774.png
还没有评论,来说两句吧...