由于我们使用的是chorme
浏览器,所以只需要实例化出其操纵对象即可:
from selenium import webdriver driver = webdriver.Chrome()
以后的操纵都是操纵该实例对象,如果你使用其他版本浏览器,请自行下载驱动,支持的浏览器如下:
driver = webdriver.Firefox() driver = webdriver.Edge() driver = webdriver.PhantomJS() driver = webdriver.Safari()
1.基本使用
from selenium
import webdriver
import time
driver = webdriver.Chrome(r"./chromedriver.exe")
driver.get("https://www.baidu.com")
driver.find_element_by_id("kw").send_keys("博客园") time.sleep(2) driver.find_element_by_id('su').click() time.sleep(2)
driver.quit()
2.元素定位
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_class_name()
driver.find_element_by_tag_name()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_xpath()
driver.find_element_by_css_selector()
3 ifarme定位
对于webdriver
来说,它拥有一层作用域。
默认是在顶级作用域中,如果出现了ifarme
标签,则必须切换到ifarme
标签的作用域才能查找其里面的元素。
如下,想查找其中的button
:
<div id="modal">
<iframe id="buttonframe"name="myframe"src="https://seleniumhq.github.io">
<button>Click here</button>
</iframe>
</div>
如果直接获取button
则不会生效,因为目前作用域是外部的html
标签中,不能获取内部iframe
的作用域:
正确的方法是找到ifarme
标签,对其进行切换作用域的操作:
还可以通过索引值进行切换:
https://www.selenium.dev/documentation/zh-cn/support_packages/mouse_and_keyboard_actions_in_detail/
from selenium import webdriver
from time import sleep
上面提到过,如果使用requets
模块访问某一url
却没有拿到想要的数据,那么很可能是前后端分离通过RESTful APIs
进行数据交互。
这个时候我们可以使用selenium
模块来对同一url
发起请求,由于是浏览器打开,所有的RESTFUL API
都会进行请求,然后直接通过属性page_source
解析返回的源码数据:
from selenium import webdriver
from lxml import etree
driver=webdriver.Chrome(r"./chromedriver.exe",)
driver.get('https://www.baidu.com/')
source_code = driver.page_source
屏蔽掉所有可能出现的异常:
from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException,NoSuchFrameException
try:
browser=webdriver.Chrome()
browser.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframssseResult')
except TimeoutException as e:
print(e)
except NoSuchFrameException as e:
print(e)
finally:
browser.close()
12 无头操作
每次使用selenium
时都会打开一个浏览器,能不能有什么办法让他隐藏界面呢?
指定参数即可,这种没有界面的浏览也可以称其为无头浏览器:
executable_path='./chromedriver.exe'
13 规避检测
window.navigator.webdriver 检测
可能有的门户网站已经对selenium
做出了检测,如果检测到是该脚本执行可能不允许你访问API
,此时就可以通过伪造信息达到潜行的效果。
将selenium
伪装成人为操作:
from selenium.webdriver import ChromeOptionsoption = ChromeOptions() option.add_experimental_option('excludeSwitches', ['enable-automation']) driver = webdriver.Chrome(executable_path='./chromedriver.exe',options=option)driver.get("http://www.baidu.com") driver.close()