selenium使用的简单介绍
1.基本步骤
seleninum的使用一般分为以下几个步骤(个人总结):
- ①创建一个浏览器对象
- ②加载某个页面
- ③获取元素[可以通过id、name、xpath、连接的文本、标签的名、class、css选择器等方式获取元素]
- ④关闭浏览器
我们以爬取贝壳网新房第一页的楼盘名为例子:
from selenium import webdriver
#这个需要改成自己的自己的驱动位置
driverpath = 'D:\Taosoftware\chromedriver_win32\chromedriver.exe'
#①传入驱动位置, 实例化一个浏览器对象
driver = webdriver.Chrome(executable_path=driverpath)
#②加载贝壳的页面
driver.get("https://qd.fang.ke.com/loupan")
#③获取所有name元素
names= driver.find_elements_by_css_selector(".name")
for name in names:
#打印出楼盘的名
print(name.text)
#④关闭浏览器
driver.quit()
2.获取元素
查找元素可以通过: id、name、xpath、连接的文本、标签的名、class、css选择器等方式获取元素。
此外,提供了两类方法:一类是获取第一个符合条件的元素,另一类是获取符合条件的所有元素。
2.1. Selenium提供了下列的方法给你查找元素:
- find_element_by_id
- find_element_by_name
- find_element_by_xpath
- find_element_by_link_text
- find_element_by_partial_link_text
- find_element_by_tag_name
- find_element_by_class_name
- find_element_by_css_selector
一次查找多个元素 (这些方法会返回一个list列表):
- find_elements_by_name
- find_elements_by_xpath
- find_elements_by_link_text
- find_elements_by_partial_link_text
- find_elements_by_tag_name
- find_elements_by_class_name
- find_elements_by_css_selector
具体可以查看:https://selenium-python-zh.readthedocs.io/en/latest/waits.html这是非官方文档
3.等待
本部分取自selenium文档非官方https://selenium-python-zh.readthedocs.io/en/latest/waits.html
现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。
Selenium Webdriver 提供两种类型的waits - 隐式和显式。 显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再才是查找某元素。
3.1.显式等待
显式的waits
等待一个确定的条件触发然后才进行更深一步的执行。最糟糕的的做法是time.sleep()
,这指定的条件是等待一个指定的时间段。 这里提供一些便利的方法让你编写的代码只等待需要的时间,WebDriverWait
结合ExpectedCondition
是一种实现的方法:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delay_loading")
try:
element = WebDriverWait(driver,10).until(
EC.presence_of_element_located((By.ID,"myDynamicElement"))
)
finally:
driver.quit()
这段代码会等待10秒,如果10秒内找到元素则立即返回,否则会抛出TimeoutException
异常,WebDriverWait默认每500毫秒调用一下ExpectedCondition
直到它返回成功为止。ExpectedCondition
类型是布尔的,成功的返回值就是true,其他类型的ExpectedCondition
成功的返回值就是 not null
。
就是在规定的时间以内如果满足条件, 就往下继续运行。 否则就抛出异常
3.2.隐式等待
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
意思就是说:一旦设置,每次查询元素都会按照新设置的值进行等待
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")
吕云翔的python网络爬虫实战中说:显式等待相比隐士等待更灵活点。
至于为什么这个么说, 我感觉就是因为隐式等待,,隐式等待是设置该WebDriver的实例的生命周期。
4. 执行JS
对于有些操作需要执行JS脚本来完成, 如往下滑动页面等, selenium提供了执行js的方法
- execute_script()
- execute_async_script()
实战项目
- 爬取简述首页文章信息(带有ajax技术)