1.声明浏览器对象
selenium支持多个浏览器,也支持手机端的浏览器,除此之外还有Phantomjs,下面举一个简单的例子,创建一个谷歌浏览器对象,依次类推可以得到其他浏览器对象
from selenium import webdriver
browser = webdriver.Chrome()
2.请求页面
# 使用get方法请求百度网页
browser.get('https://www.baidu.com')
# page_source属性用于获取网页的源代码,然后就可以使用正则表达式,css,xpath,bs4来解析网页
print(browser.page_source)
browser.close()
3.查找单个节点和多个节点
寻找单个节点的多有方法,返回的结果是WebElement类型的
browser.find_element_by_id()
browser.find_element_by_name()
browser.find_element_by_xpath()
browser.find_element_by_tag_name()
browser.find_element_by_link_text()
browser.find_element_by_class_name()
browser.find_element_by_css_selector()
browser.find_element_by_partial_link_text()
如果是找多个节点,在element后面加s,结果是列表类型
当我们要定位到百度的搜索框时,我们可以看到,检查元素中,input这个节点里有class,id 等等属性,我们通过定位相关属性,就能定位到想要的节点
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
browser.close()
4模拟浏览器进行操作
在打开浏览器之后,我们往往需要在一些搜索框里输入文字,删除文字,点击一些按钮等等,这时我们需要用到一下几种方法
send_keys():输入文字
clear():清除文字
click():点击按钮
举个例子,我们打开百度浏览器,然后输入一些关键字,删除,再次输入一些关键字,然后点击回车然后搜索
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
input.send_keys('许嵩')
time.sleep(3)
input.clear()
input.send_keys('python')
input.send_keys(Keys.ENTER)
# button = browser.find_element_by_class_name('btn self_btn')
# button.click()
browser.close()
5.模拟鼠标移动,键盘按键等没有特定的执行对象的操作
模拟浏览器的时候,我们可能会使用到一些拖动的操作,比如需要将某一个点拖到另外一个地方去,这种方法我们可以称之为动作链。
首先打开网页http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable中的一个实例,选中要拖动的节点以及拖动到哪里的节点,使用ActionChains对象使它变成一个变量,再调用drag_and_drop方法以及perform方法来执行该过程。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('http:www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to.frame('iframeResult')
yuanlai = browser.find_element_by_css_selector('#draggable')
mubiao = browser.find_element_by_css_selector('#droppable')
a = ActionChains(browser)
a.drag_and_drop(yuanlai,mubiao)
a.perform()
6.拖动滑动条
使用爬虫爬取网页时,经常会看到使用滑动条的页面,然后会显示加载中,没多久就会加载出新的页面出来。如果直接爬取,往往只能爬到一页甚至是前几页的信息。
在此可以直接模拟运行JavaScript,滑到网页的最底下。使用的是execute_script(),并且可以设置一个网页提示框
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.toutiao.com/search/?keyword=街拍')
# execute_script()将进度条拉到最下面,然后弹出提示框
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')
browser.execute_script('alert("已经到最下面了")')
7.获取节点信息
获取节点信息与两种方法,第一种是使用page_source属性,获取到目标网页的源代码之后,使用正则表达式,css,xpath ,bs4等工具进行抓取信息。第二种就是直接使用selenium的一些方法和属性。
① 获取属性
首先选中要匹配解析的节点,然后调用get_attribute方法来获取节点的属性。
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.get_attribute('class'))
② 获取文本
依然是先代开网址,然后定位到目标节点,再使用text属性来获取文本
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
print(input.text)
③ 获取ID,位置,标签名和大小
方法和前两个类似,直接调用即可获得相关的值
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
# 获取节点id
print(input.id)
# 获取节点在页面的相对位置
print(input.location)
# 获取节点标签名称
print(input.tag_name)
# 获取节点大小
print(input.size)
8.切换frame
网页有一种很常见的节点叫做iframe,相当于是子frame,也就是页面的子页面。
结构和外部网页的结构一致,当我们使用selenium打开页面,默认是在父页面里执行的,但是呢,这种网页我们往往是获取不到子页面的节点,所以要使用switch_to.frame()来跳转页面,然后再进行相对应的操作
然后尝试获取父页面的某个节点,如果获取不到就报错,接下来就换回父页面去获取该节点,就能成功了。
from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
browser = webdriver.Chrome
browser.get('https://www.toutiao.com')
browser.switch_to.frame('tanxssp-tuwen-iframemm')#具体是什么,要看节点frame的id是什么
try:
title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
except NoSuchElementException:
print('没有这个节点')
browser.switch_to.parent_frame()
title = browser.find_element_by_id('tanx-a-mm_32479643_3494618_81668314')
print(title)
print(title.text)
9.延时等待
有些时候,网页有额外的Ajax请求,并没有那么快就能加载出来,所以我们要有耐心地等待一下。
等待分为两种,隐式等待和显式等待
隐式等待,查找某个节点的时候,隐式等待就会等待固定的时间,如果到了时间你还没有来,他就会发脾气,然后向上级打小报告说你没有出现。
from selenium import webdriver
browser = webdriver.Chrome
browser.implicitly_wait(10)
browser.get('https://www.baidu.com')
input = browser.find_element_by_id('kw')
print(input)
显式等待就显得比较有人情味一点,会做人。当她准备等你的时候,她会温馨地提示你,她最多等你多久,如果你在规定的时间内到了,那好,就一起接着做其他事。如果你超过了时间没来,那也没办法了,只能向上级报告这个问题了。
# 显式等待
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')
# 引入WWebDriverWait对象,指定等待的最长时间
wait = WebDriverWait(browser,10)
# 调用unti方法,然后设定等待的条件,表示直到这个节点出现的意思。参数是节点的定位元组,也就是说ID为q的节点搜索框
# 成功就返回,不成功就抛出异常
input = wait.until(EC,presence_of_element_located((By.ID,'q')))
button = wait.until(EC,element_to_be_clickable((By.CSS_SELECTOR,'btn-search')))
print(input,button)
'''
所有的等待条件
title_is 标题是某内容
title_contains 标题包含某内容
presence_of_element_located 节点加载出来,传入定位元组
visibility_of_element_located 节点可见,传入定位元组
visibility_of 可见,传入节点对象
presence_of_all_element_located 所有节点加载出来
text_to_be_present_in_element 某个节点文本包含某文字
text_to_be_present_in_element_value 某个节点值包含某文字
frame_to_be_available_and_switch_to_it 加载并且切换
invisibility_of_element_located 节点不可见
element_to_be_clickable 节点可点击
staleness_of 判断一个节点是否在DOM,可判断页面是否已经刷新
element_to_be_selected 节点可选择,传节点对象
element_located_to_be_selected 节点可选择,传定位元组
element_selection_state_to_be 传入节点对象以及状态,相等返回true,否则返回false
element_located_selection_state_to_be 传入定位元组以及状态,相等返回true,否则返回false
alert_is_present 是否出现警告
'''
10.后退前进
使用浏览器都有前进后退的功能,在selenium中,back()表示后退,forward()表示前进
# 后退前进
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser .get('https://www.baidu.com')
browser.back()
time.sleep(3)
browser.forward()
browser.close()
11.获取cookies
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
print(browser.get_cookies())
browser.add_cookie({'name':'name','domain':'www.baidu.com','value':'germey'})
print(browser.get_cookies())
browser.delete_all_cookies()
print(browser.get_cookies())
12.选项卡管理
import time
from selenium import webdriver
browser = webdriver.Chrome()
browser.get('https://www.baidu.com')
# window.open()新开启一个选项卡
browser.execute_script('window.open()')
# window_handles 用于获取当前开启的所有选项卡,返回的是选项卡的代号列表
print(browser.window_handles)
# switch_to_window用于切换选项卡
browser.switch_to_window(browser.window_handles[1])
browser.get('https://www.taobao.com')
time.sleep(3)
browser.switch_to_window(browser.window_handles[0])
browser.get('https://python.org')
未完待续。。。