准备工作

安装selenium

可以用pip install selenium
也可以在pycharm中安装
image.png

下载浏览器驱动

需要把浏览器驱动放入系统路径中,或者直接告知selenuim的驱动路径

使用Selenium

1.打开驱动

  1. driver = webdriver.Chrome(executable_path="driver/chromedriver.exe") # 谷歌浏览器,可以传入一个指定路径
  2. #driver = webdriver.Chrome("driver/chromedriver.exe")
  3. #driver = webdriver.Chrome()

2.加载网页

  1. driver.get(url) # 打开url网页 比如 driver.get("http://www.baidu.com")

3.元素定位

定位的作用是找到目标位置,你可以对这个元素执行点击,输入等操作,就是页面交互,以前是要找到这些元素。

在element变成elements就是找所有满足的条件,返回数组。

  1. driver.find_element_by_id()
  2. driver.find_element_by_name()
  3. driver.find_element_by_class_name()
  4. driver.find_element_by_tag_name()
  5. driver.find_element_by_link_text()
  6. driver.find_element_by_partial_link_text()
  7. driver.find_element_by_xpath()
  8. driver.find_element_by_css_selector()

4.获取内容

浏览器加载出页面后,用这个属性就能获得加载后的全部html文件

  1. driver.page_source #获取加载js后的页面html
  2. driver.current_url #获取当前页面url
  3. driver.title #获取当前页面的标题

5.控制浏览器操作

  1. driver.set_window_size(480, 800) #控制浏览器窗口大小
  2. driver.back() #后退
  3. driver.forward() #前进
  4. driver.refresh() # 刷新

6.页面元素常用操作

  1. webelement = driver.find_element_by_id("ID")
  2. webelement.send_keys("asdffgghjkl") #模拟按键输入
  3. webelement.clear() #清除文本
  4. webelement.click() #单击元素
  5. webelement.submit()#可以在搜索框模拟回车操作
  6. webelement.size #获得元素的大小
  7. webelement.text #获得元素的文本
  8. webelement.get_attribute("name") #获取元素的某个属性
  9. webelement.is_displayed() #设置该元素是否用户可见

7.鼠标操作

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供

  • perform(): 执行所有 ActionChains 中存储的行为;
  • context_click(): 右击;
  • double_click(): 双击;
  • drag_and_drop(): 拖动;
  • move_to_element(): 鼠标悬停。 ```python from selenium import webdriver

    引入 ActionChains 类

    from selenium.webdriver.common.action_chains import ActionChains

driver = webdriver.Chrome() driver.get(“https://www.baidu.cn“)

定位到要悬停的元素

above = driver.find_element_by_link_text(“设置”)

对定位到的元素执行鼠标悬停操作

ActionChains(driver).move_to_element(above).perform()

  1. <a name="eljZn"></a>
  2. ## 8.键盘事件
  3. - send_keys(Keys.BACK_SPACE) 删除键(BackSpace)
  4. - send_keys(Keys.SPACE) 空格键(Space)
  5. - send_keys(Keys.TAB) 制表键(Tab)
  6. - send_keys(Keys.ESCAPE) 回退键(Esc)
  7. - send_keys(Keys.ENTER) 回车键(Enter)
  8. - send_keys(Keys.CONTROL,'a') 全选(Ctrl+A)
  9. - send_keys(Keys.CONTROL,'c') 复制(Ctrl+C)
  10. - send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X)
  11. - send_keys(Keys.CONTROL,'v') 粘贴(Ctrl+V)
  12. - send_keys(Keys.F1) 键盘 F1
  13. - ……
  14. - send_keys(Keys.F12) 键盘 F12
  15. ```python
  16. from selenium.webdriver import Keys
  17. webelement.send_keys(Keys.ENTER) #通过Keys这个类来模拟键盘输入,Keys在上面的from导入

9.等待页面加载完成

如果页面用到特别多的ajax的话,程序不知道什么时候加载完成。需要等待页面渲染完成

显示等待

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException)。

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. driver = webdriver.Firefox()
  6. driver.get("http://www.baidu.com")
  7. element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
  8. element.send_keys('selenium')
  9. driver.quit()

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。具体格式如下:
WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

  • driver :浏览器驱动。
  • timeout :最长超时时间,默认以秒为单位。
  • poll_frequency :检测的间隔(步长)时间,默认为0.5S。
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。
  • WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。
  • until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
  • until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。

在本例中,通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在。

隐式等待

在访问页面开始就设置一个时间,假设设置10秒,程序会等页面加载10秒,如果10秒内加载出来了,就开始抓取,如果10秒还没加载出来,直接就开始抓,可能就异常了

  1. from selenium import webdriver
  2. driver = webdriver.Firefox()
  3. driver.implicitly_wait(10) # 秒
  4. driver.get("http://www.baidu.com")

10.在不同的窗口或者框架之间移动

  1. driver.switch_to.window("windowName")
  2. driver.switch_to.frame("frameName")
  1. #先通过xpth定位到iframe
  2. xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')
  3. #再将定位对象传给switch_to_frame()方法
  4. driver.switch_to_frame(xf)

一旦我们完成了frame中的工作,我们可以这样返回父frame:

  1. driver.switch_to_default_content()

11.警告框处理

  1. alert = driver.switch_to.alert #切换到页面的警告框
  2. alert.text #返回 alert/confirm/prompt 中的文字信息
  3. alert.accept() #接受现有警告框
  4. alert.dismiss() #解散现有警告框
  5. alert.send_keys() #发送文本至警告框

  1. from selenium import webdriver
  2. from selenium.webdriver.support.select import Select
  3. from time import sleep
  4. driver = webdriver.Chrome()
  5. driver.implicitly_wait(10)
  6. driver.get('http://www.baidu.com')
  7. sel = driver.find_element_by_xpath("//select[@id='nr']")
  8. Select(sel).select_by_value('50') # 显示50条

13.文件上传

  1. driver.find_element_by_name("file").send_keys('D:\\upload_file.txt') # # 定位上传按钮,添加本地文件

14.cookie操作

  1. driver.get_cookie() #获得所有cookie信息
  2. driver.get_cookie(name) #返回字典的key为“name”的cookie信息
  3. driver.add_cookie(cookie_dict) #添加cookie。“cookie_dict”指字典对象,必须有name 和value 值
  4. driver.delete_cookie(name,optionsString) #删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”
  5. driver.delete_all_cookies() #删除所有cookie信息

15.调用JavaScript代码

  1. js="window.scrollTo(100,450);" #一段js代码
  2. driver.execute_script(js) # 通过javascript设置浏览器窗口的滚动条位置

16.关闭浏览器

  1. driver.close() #关闭单个窗口
  2. driver.quit() #关闭所有窗口

参考

崔庆成