下载:pip install selenium
什么是selenium?
selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行处理(Selenium Grid)。Selenium的核心Selenium Core基于JsUnit,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。
selenium可以模拟真实浏览器,自动化测试工具,支持多种浏览器,爬虫中主要用来解决JavaScript渲染问题。
浏览器驱动下载
chromedriver是一个驱动Chrome浏览器的驱动程序,使用他才可以驱动浏览器。当然针对不同的浏览器有不同的driver。以下列出了不同浏览器及其对应的driver;
chrome: http://chromedriver.storage.googleapis.com/index.html
Firefox:Releases · mozilla/geckodriver · GitHub
IE:http://selenium-release.storage.googleapis.com/index.html
Edge: Microsoft Edge WebDriver - Microsoft Edge Developer
根据自行浏览器版本对应下载最接近的chromedriver版本。
检验是否安装成功:
终端输入(cmd):chromedriver
使用方法
from selenium import webdriver
#指定浏览器
driver = webdriver.Chrome()
#打开指定窗口
driver.get('https://www.baidu.com/')
#获取网页源代码
print(driver.page_source)
获取第二窗口源码
from selenium import webdriver
#指定浏览器
driver = webdriver.Chrome()
#打开指定窗口
driver.get('https://www.baidu.com/')
#打开第二窗口
driver.execute_script("window.open('https://www.taobao.com/')")
#切换窗口(切换为第二窗口)
driver.switch_to.window(driver.window_handles[1])
#如果获取第三个窗口也是window_handles[1]
#获取网页源代码
print(driver.page_source)
#关闭当前窗口
driver.close()
#退出浏览器driver.quit()
元素定位find_element
定位到输入框位置,使用.send_keys("python")填充元素
通过By方法定位
from selenium import webdriver
from selenium.webdriver.common.by import By #定位元素必要模块
driver = webdriver.Chrome()
driver.get('https://www.baidu.com/')
#定位网页元素
#通过id获取
driver.find_element(By.ID,"kw")
#通过类名class获取
# driver.find_element(By.CLASS_NAME,"s_ipt")
#通过name获取
# driver.find_element(By.NAME,"wd")
#通过标签获取 一个网页当中有多个相同标签,不建议使用
# driver.find_element(By.TAG_NAME,'div')
#通过Xpath定位 光标移到id鼠标右键-copy-copy Xpath
# driver.find_element(By.XPATH,'//*[@id="kw"]').send_keys('selenium')
#通过css语法定位
# driver.find_element(By.CSS_SELECTOR,"#kw").send_keys('web')
#通过关键字定位 如果该窗口有多个国台办关键字只会打开第一个
# driver.find_element(By.PARTIAL_LINK_TEXT,'国台办').click()
操作表单元素
#使用clear方法清除输入框的内容
input_name = driver.find_element(By.ID,"kw")
input_name.clear()
#使用.send_keys("python")填充元素
input_name.send_keys('python')
#搜索框在网页当中是用鼠标点击的,所以在代码中也要选中这个框,然后执行click()
search = driver.find_element_by_id("国台办").click()
页面等待
如果设置了页面等待10秒,表示最大等待时间为10秒,如果3秒网页就加载完成,剩下的7秒就无需再等待可直接操作。如果超出10秒会报错
使用方法:
WebDriverWait(当前网页,时间).当网页加载完成之后((通过ID,'找到这个元素'))
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 #EC判断元素是否加载完成
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
selenium写爬虫时遇到 iframe的问题
iframe是html标签,作用是文档中的文档,或者浮动的框架(FRAME)。iframe元素惠创建包含另外一个文档的内联框架(即行内框架),作用就是嵌套网页。
所以在写selenium爬虫时,要注意获取的标签是否包含在iframe内,如果是,则需要单独将iframe链接的内容提取出来,单独进行定位