安装
1. 火狐浏览器: 下载geckodriver.exe把这个文件放在和python.exe相同的路径下
geckodriver.exe: 是selenium用来打开火狐浏览器的驱动。需要将它和python.exe放在一起2. 下载的位置:
https://github.com/mozilla/geckodriver/releases最新版火狐浏览器驱动geckodriver的地址。
知识点:
seleniumbase
selenium测试框架在爬虫中的应用: # 网页中通过js渲染的数据,爬虫的解决办法: # 1. 去静态源码中查找<script>var infolist = {'name':'123', }</script> # 2. 抓包或者网络请求中,查看是否有类似与json的get请求,直接请求这个json的API拿到数据 # 3. 使用phantomjs/selenium进行访问动态页面,而静态页面仍然使用requests进行获取 # selenium框架本身提供了许多元素定位的方法,find_element_by_id()这些方法底层是用python语言实现的,提取速度上会慢一些。通常情况下,使用phantomjs/selenium也只是获取js渲染后的网页源代码,而网页中数据的提取,还可以使用xpath, css, re, bs4, etree等。 # selenium框架的元素定位 # geckodriver.exe: 是selenium用来打开火狐浏览器的驱动。需要将它和python.exe放在一起。 # chromedriver.exe: 是谷歌的 # 注意:不兼容会出现启动错误 # 1. geckodriver.exe的版本必须和火狐浏览器的版本兼容; # 2. geckodriver.exe的版本必须和当前操作系统兼容; import time from selenium import webdriver from selenium.webdriver.common.by import By # 创建一个浏览器对象,会打开一个浏览器窗口 driver = webdriver.Firefox() # driver = webdriver.Chrome() driver.get('https://www.baidu.com') kw = driver.find_element(by=By.CSS_SELECTOR, value="#kw") kw.send_keys('selenium') # 通过id定位到输入框 # keyword = driver.find_element_by_id('kw') # # <class 'selenium.webdriver.firefox.webelement.FirefoxWebElement'> # print(type(keyword)) # # # 在向输入框中输入内容之前,可以先将之前的旧内容清空 # keyword.clear() # # # 向输入框中输入内容send_keys # keyword.send_keys('selenium') # # # 通过class定位到搜索按钮 # search_btn = driver.find_element_by_class_name('s_btn') # # # 点击search_btn # search_btn.click() # # time.sleep(3) # # driver.find_element_by_css_selector('.result > h3 > a').click() # 通过一个连接标签的文本内容定位标签 # driver.find_element_by_link_text('贴吧') # driver.find_element_by_xpath('') # 批量获取元素 # res = driver.find_elements_by_css_selector('.result') # res = driver.find_elements(by=By.CSS_SELECTOR, value='.result') # 获取js渲染后的网页源代码 print(driver.page_source) time.sleep(3) # 休眠2秒,将浏览器driver对象退出 driver.close()
selenium元素等待
# 元素等待:js代码执行渲染期间,导致数据/标签加载缓慢,如果元素没有加载完成, 直接通过find_element去进行定位,会出现元素不存在的异常。 # 1. time.sleep(10) 强制性等待,不管元素在设置时间范围内是否加载出来, 都必须要等待固定的时间。 # 2. WebDriverWait(10) 智能等待的方法,最多等待10秒,10秒之后仍然没有元素, 会抛出异常。10秒内找到这个元素,直接向下执行代码。 这个方法一般适用于单个元素的等待; # 3. implicitly_wait(10) 最大等待时间10秒,针对的是整个页面,给当前页面设置 最大等待时间; from selenium import webdriver from selenium.webdriver.support.wait import WebDriverWait driver = webdriver.Firefox() driver.get('https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&suggest=history_1&_input_charset=utf-8&wq=&suggest_query=&source=suggest') driver.implicitly_wait(20) # 在定位价格时,添加元素等待 # price = WebDriverWait(driver, 20).until(lambda driver:driver.find_element_by_css_selector('.price > strong')) # print(price.text) # 方式二: price = driver.find_element_by_css_selector('.ctx-box > .title > a') is_display = WebDriverWait(driver, 20).until(lambda driver: price.is_displayed()) print(is_display) if is_display: # 如果元素可见,再执行点击,输入,清空等操作 price.click() else: # 不可见 pass driver.close()
selenium查找元素的方法总结:
一次查找多个元素
partial: 局部的 [ ˈpɑ:rʃl ]
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