1、selenium模块

  1. selenium模块和爬虫的关系
    • 可以非常便捷获取网站中动态加载的数据
    • 便捷的实现模拟登录


  1. 什么是selenium模块
    • 基于浏览器自动化的一个模块。
      • 可以通过编写相关的python代码[表示相关动作],触发到浏览器当中


  1. 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是定位不到的

必须通过如下操作进行标签定位:

  • 切换浏览器标签定位的作用域,切换到iframe 参数写iframe的id即可

  • bro.switch_to.frame("传入iframe的id值")

动作链

  1. from selenium.webdriver import ActionChains # 导包


  1. action = ActionChains(浏览器对象) # 创建动作链对象


  1. action.click_and_hold(要移动的元素对象) # 点击长按


  1. action.move_by_offset(17, 0) # 移动 x水平 y 垂直


  1. action.perform() # 立即执行动作链


  1. action.release() # 释放动作链

5、无头浏览器和规避检测

无头浏览器:不让浏览器弹出来,眼睛看不见,背地默默执行

  1. from selenium import webdriver
  2. # 导入无头浏览器相关的类
  3. from selenium.webdriver.chrome.options import Options
  4. if __name__ == '__main__':
  5. # 无头浏览器进行参数设定
  6. chrome_options = Options()
  7. chrome_options.add_argument("--headless")
  8. chrome_options.add_argument("--disable-gpu")
  9. # --------------------------------------------
  10. # 在创建浏览器对象时,多添加一个形参 chrome_options
  11. # 这样就实现了无头浏览器
  12. bro = webdriver.Chrome(executable_path="./chromedriver.exe", chrome_options=chrome_options)
  13. bro.get("https://www.baidu.com")
  14. print(bro.page_source)

6、规避selenium请求不被门户网站检测到

一些门户网站对于selenium进行了反爬机制,如果检测到请求时selenium发送的那就会直接阻挡本次请求

  1. from selenium import webdriver
  2. from selenium.webdriver import Chrome
  3. from selenium.webdriver import ChromeOptions
  4. if __name__ == '__main__':
  5. # 实现规避检测
  6. option = ChromeOptions()
  7. option.add_experimental_option('excludeSwitches', ['enable-automation'])
  8. bro = Chrome(executable_path='./chromedriver.exe', options=option)

7、自动化测试淘宝搜索

  1. from selenium import webdriver
  2. from time import sleep
  3. if __name__ == '__main__':
  4. bro = webdriver.Chrome(executable_path="./chromedriver.exe")
  5. # 打开淘宝
  6. bro.get("http://www.taobao.com")
  7. # 标签定位 定位到搜索框
  8. # find_element_by_id() 通过id来找到对应元素,并返回该元素
  9. search_input = bro.find_element_by_id("q")
  10. # 向搜索框中传入一个值
  11. search_input.send_keys("iphone")
  12. # 找到搜索按钮元素,class名只能是一个,中间不能有空格
  13. button = bro.find_element_by_class_name("btn-search")
  14. # 触发他的单击事件
  15. button.click()
  16. # 关闭浏览器
  17. sleep(5)
  18. bro.quit()

8、处理iframe和动作链

  1. from selenium import webdriver
  2. from lxml import etree
  3. from time import sleep
  4. # 导入动作链相关的包
  5. from selenium.webdriver import ActionChains
  6. if __name__ == '__main__':
  7. url = "https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
  8. bro = webdriver.Chrome("./chromedriver.exe")
  9. bro.get(url)
  10. # 切换浏览器标签定位的作用域,切换到iframe 参数写iframe的id即可
  11. bro.switch_to.frame("iframeResult")
  12. # 拖动标签
  13. # 动作链: 一系列连续的动作
  14. # 1. 创建动作链对象,将浏览器对象作为参数传递进去
  15. action = ActionChains(bro)
  16. # 2. 点击且长按指定的元素 click_and_hold()
  17. div1 = bro.find_element_by_id("draggable")
  18. action.click_and_hold(div1)
  19. # 3. 将div1元素进行移动,模拟人的移动使用循环
  20. for i in range(1, 6):
  21. # move_by_offset() 偏移方法 第一参数是x轴水平 第二个参数是y轴垂直
  22. # perform() 让动作链立即执行
  23. action.move_by_offset(17, 0).perform()
  24. # 每次拖动完成后停顿一秒
  25. sleep(0.2)
  26. action.click(div1)
  27. # 4. 释放动作链
  28. action.release()