基本使用
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
browser=webdriver.Chrome()
try:
browser.get("https://www.baidu.com")
input=browser.find_element_by_id("kw") #找到输入框
input.send_keys("Python") #输出Python
input.send_keys(Keys.ENTER) #输入回车键
wait=WebDriverWait(browser,10) #十秒内等待某个按钮被定为到,否则抛出异常
wait.until(EC.presence_of_element_located((By.ID,"content_left"))) #判断某个元素是否被加载到dom树立
print(browser.current_url) #输出当前的url
print(browser.get_cookies()) #输出cookies
print(browser.page_source) #输出网页源代码
finally:
browser.close() #关闭浏览器
百度页面输入文本框的源代码是:
<input type="text" class="s_ipt" name="wd" id="kw" maxlength="100" autocomplete="off">
用到CSDN的搜索也是同样的,主要部分稍微改一下
input=browser.find_element_by_id("keyword") #找到输入框
声明浏览器对象
from selenium import webdriver
brower=webdriver.Chrome()
brower=webdriver.Firefox()
brower=webdriver.Edge()
brower=webdriver.Safari()
调用brower对象,就可以执行各个动作以模拟浏览器操作。
访问页面
get()请求网页,参数传入URL
from selenium import webdriver
brower=webdriver.Chrome()
brower.get(
print(brower.page_source)
brower.close()
Chrome Headless模式
从Chrome59版本开始,支持Headless模式,也就是无界面模式,这样抓取的时候就不会弹出浏览器
基本语法:
chrome_options=webdriver.ChromeOptions()
chrome_options.add_argument("--headless")
browser = webdriver.Chrome(chrome_options=chrome_options)
或者:
options = Options()
options.add_argument('--headless')
options.add_argument('--no-sandbox')
options.add_argument('--ignore-certificate-errors')
查找节点
查找单个节点
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
查找多个节点
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
通用方法find_element(),需要传入两个参数:查找方式By和值
from selenium import webdriver
from selenium.webdriver.common.by import By
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
input_first=browser.find_element(By.ID,"q")
print(input_first)
browser.close()
输出:
elenium.webdriver.remote.webelement.WebElement (session="78fcbfed404d8a74bddbe7aca21f7db7", element="0.7402649243501238-1")>
节点交互
输入文字send_keys()
清空文字clear()
点击按钮click()
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.taobao.com")
input=browser.find_element_by_id("q")
input.send_keys("996.icu")
button=browser.find_element_by_css_selector("#J_TSearchForm > div.search-button > button")
button.click()
动作链
还有另外一些操作,它们没有特定的执行对象,比如鼠标拖拽、键盘按键等,这些动作用另一种方式来执行,就是动作链。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser=webdriver.Chrome()
url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame("iframeResult")
source=browser.find_element_by_css_selector("#draggable") #找到要拖拽的节点
target=browser.find_element_by_css_selector("#droppable") #找到拖拽到的目标节点
action=ActionChains(browser)
action.drag_and_drop(source,target) #调用方法
action.perform() #执行动作
执行JavaScript
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
browser.execute_script("window.scrollTo(0,document.body.scrollHeight)") #将进度条拖到底部
browser.execute_script("alert('To Buttom')") #弹出alert提示框
获取节点信息
get_attribute获取节点的属性
text获取节点内部的文本信息
id获取id、location位置、tag_name获取标签名和size获取大小
from selenium import webdriver
browser=webdriver.Chrome()
url="https://www.zhihu.com/explore"
browser.get(url)
logo=browser.find_element_by_class_name("zu-top-link-logo")
print(logo)
print(logo.get_attribute("class")) #获取属性class的值
input=browser.find_element_by_class_name("zu-top-add-question")
print(input.text) #获取文本内容
print(input.id) #获取节点id
print(input.location) #获取id
print(input.tag_name) #获取标签名称
print(input.size) #获取节点大小,也就是宽高
切换Frame
Selenium打开页面后默认是在父级Frame里面操作,switch_to.frame()方法来切换Frame
import time
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser=webdriver.Chrome()
url="http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable"
browser.get(url)
browser.switch_to.frame("iframeResult")
try:
logo=browser.find_element_by_class_name("logo")
except:
print("No logo")
browser.switch_to.parent_frame()
logo=browser.find_element_by_class_name("logo")
print(logo)
print(logo.text)
browser.close()
延时等待
隐式等待
browser=webdriver.Chrome()
browser.implicitly_wait(10)
显式等待
import time
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
browser=webdriver.Chrome()
browser.get("https://www.taobao.com/")
wait=WebDriverWait(browser,10)
input=wait.until(EC.presence_of_element_located((By.ID,"q")))
#presence_of_element_located代表节点出现的意思,其参数是节点的定位元组
button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,".btn-search")))
#element_to_be_clickable也就是可点击
print(input,button)
前进和后退
back()后退,forward()前进
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.baidu.com/")
browser.get("https://taobao.com/")
browser.back()
time.sleep(5)
browser.forward()
time.sleep(5)
browser.close()
Cookies
get_cookies()获取
delete_all_cookies()删除
add_cookies()添加
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.zhihu.com/explore")
print(browser.get_cookies())
browser.add_cookie({"name":"name","domain":"www.zhihu.com","value":"germey"})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
browser.close()
选项卡管理
import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get("https://www.baidu.com/")
browser.execute_script("window.open()") #新开启一个选项卡
print(browser.window_handles) #获得当前开启的所有选项卡
browser.switch_to_window(browser.window_handles[1]) #切换到第二个选项卡
browser.get("https://www.taobao.com") #打开淘宝
time.sleep(1)
browser.switch_to_window(browser.window_handles[0]) #切换到第一个选项卡
browser.get("https://www.zhihu.com/") #打开知乎
异常处理
from selenium.common.exceptions import TimeoutException,NoSuchElementException
#基本用法如下
except TimeoutException:
except NoSuchElementException: