1、selenium介绍
Selenium是一个自动化测试工具,利用它可以驱动浏览器执行特定的动作,如点击、下拉等操作,同时还可以获取浏览器当前呈现的页面的源代码,做到可见即可爬。对于一些JavaScript动态渲染的页面来说,此种抓取方式非常有效。本节中,就让我们来感受一下它的强大之处吧。
Selenium是调用本地浏览器直接发送请求,这样不管网站运用多么复杂的数据加载算法、加密等手段,都可以通过所见即所得来获取数据,当然这种方式的缺点就是速度比较慢,需要等待浏览器渲染出页面元素。
2、selenium安装,python与selenium版本均选择3.X以上版本
(1)安装selenium的python支持库,使用命令
pip
install
selenium
(2)下载并运行selenium-server服务器,官方下载地址为:
http://selenium-release.storage.googleapis.com/3.11/selenium-server-standalone-3.11.0.jar,下载完成后运行
java -jar selenium-server-standalone-3.11.0.jar 启动服务,启动成功后的样子:
编码方式:
from
selenium
import
webdriver
from
selenium.webdriver.common.desired_capabilities
import
DesiredCapabilities
browser = webdriver.Remote(
command_executor
=
'http://127.0.0.1:4444/wd/hub'
,
desired_capabilities
=DesiredCapabilities.CHROME) #将使用chrome浏览器
(3)另外也可以根据你使用的浏览器,Chrome或FireFox等下载对应的driver程序,如chromedriver的下载地址为:https://chromedriver.storage.googleapis.com/index.html?path=2.37/
编码方式:
from
selenium
import
webdriver #导入需要的库文件
browser = webdriver.Chrome(
executable_path
=
"D:
\\
selenium_server
\\
chromedriver"
) #这里需要指定chromedriver地址
(4)程序运行后的如下:
到这里为止说明你已经安装成功了。
如果你不能翻墙,无法下载所需的资源,可以到 https://download.csdn.net/download/wollzengji/10360107 这个页面去下载
3、selenium使用
(1)简单示例
from
selenium
import
webdriver
from
selenium.webdriver.common.keys
import
Keys #提供键盘按键支持
browser
=
webdriver.Chrome(executable_path="D:\\selenium_server\\chromedriver")
assert
"Python"
in
browser
.
title #判断title中是否含有“Python”,如果不含有将抛出异常
elem
=
browser
.
find_element_by_name
(
"q"
) #找到元素
elem
.
clear
() #清空输入框
elem
.
send_keys
(
"pycon"
) #在输入框中输入字符
elem
.
send_keys
(
Keys
.
RETURN
) #提交页面
browser
.
close
() #关闭页面,quit方法将关闭整个浏览器
(2)查找元素
单个元素:
- 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
示例:
browser.
find_element_by_id
(
'loginForm'
) #通过id查找元素
browser.
find_element_by_name
(
'username'
) #通过name来判断,将查找第一个元素,如
<
input
name
=
"username"
type
=
"text"
/>
browser.
find_element_by_xpath
(
"//form[@id='loginForm']"
) #通过xpath查找元素,
包含
id
属性并且其值为
loginForm
的form元素
browser.
find_element_by_link_text
(
'Continue'
) #通过链接文本查找元素,如<a href="continue.html">Continue</a>
browser.
find_element_by_tag_name
(
'h1'
) #通过标签名查找元素,如<h1>Welcome</h1>
browser.
find_element_by_class_name
(
'content'
) #通过class name查找元素,如
<
p
class
=
"content"
>
Site
content
goes
here
.</
p
>
browser.
find_element_by_css_selector
(
'p.content'
) #通过CSS选择器查找元素,如
<
p
class
=
"content"
>
Site
content
goes
here
.</
p
>
可以通过browser.find_element_by_id('loginForm').get_attribute("title") #获取元素属性内容
browser
.
find_element_by_id
(
'loginForm'
).
text #获取元素文本
(3)与页面交互
element
.
clear
() #清空输入框
element
.
send_keys
(
"some text"
) #在输入框中输入文本
from
selenium.webdriver.support.ui
import
Select
select
=
Select
(browser
.
find_element_by_name
(
'name'
)) #找到select元素
select
.
select_by_index
(
index
) #根据下标找到具体option
select
.
select_by_visible_text
(
"text"
) #根据文本找到具体option
select
.
select_by_value
(
value
) ##根据value找到具体option
select
.
deselect_all
() #取消选中option
select
.
all_selected_options #获得选中的option
select
.
options #获得所有的option
option
.
click
() #选中option
browser.
find_element_by_id
(
"submit"
)
.
click
() #提交表单
browser.
forward
() #在历史记录中前进
browser.
back
() #在历史记录中后退
browser.get_cookies() #获取所有的cookie
browser
.
add_cookie
(
{
'name'
:
'name'
,
'domain'
:
'
www.zhihu.com'
;
,
'value'
:
'germey'
}
) #添加cookie
browser
.
delete_all_cookies
(
) #删除所有cookie
browser.
execute_script
(
"window.scrollTo(0, document.body.scrollHeight);"
) #滚到页面的底部,这里是用了模拟javaScript方法
(4)等待页面加载完成(Waits)
现在的大多数的Web应用程序是使用Ajax技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出
ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。
Selenium Webdriver 提供两种类型的waits - 隐式和显式。 显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。 而隐式等待让Webdriver等待一定的时间后再去查找某元素。
(a)显示等待:
wait = WebDriverWait(browser
,
10
)
imput=wait.until(EC.presence_of_element_located((By.ID
,
'tagId'
)))
button
=
wait
.
until
(
EC
.
element_to_be_clickable
(
(
By
.
CSS_SELECTOR
,
'.btn-search'
)
)
)
在抛出TimeoutException异常之前将等待10秒或者在10秒内发现了查找的元素。 WebDriverWait 默认情况下会每500毫秒调用一次ExpectedCondition直到结果成功返回。 ExpectedCondition成功的返回结果是一个布尔类型的true或是不为null的返回值。
可以通过以下元素查找内容
ID =
"id"
XPATH =
"xpath"
LINK_TEXT =
"link text"
PARTIAL_LINK_TEXT =
"partial link text"
NAME =
"name"
TAG_NAME =
"tag name"
CLASS_NAME =
"class name"
CSS_SELECTOR =
"css selector"
等待条件及其含义
等待条件
|
含义
|
title_is
|
标题是某内容
|
title_contains
|
标题包含某内容
|
presence_of_element_located
|
节点加载出来,传入定位元组,如
(By.ID, 'p')
|
visibility_of_element_located
|
节点可见,传入定位元组
|
visibility_of
|
可见,传入节点对象
|
presence_of_all_elements_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
|
是否出现警告
|
(b)隐式等待
browser
.
implicitly_wait
(
10
)
# 该操作会等待10秒钟以后,在执行后续操作,除非服务器限速,不然推荐使用显示等待
browser
.
get
(
"
http://somedomain/url_that_delays_loading"
;
)
4、资料文件