python爬⾍从⼊门到放弃(⼋)之Selenium库的使⽤
⼀、什么是Selenium
selenium 是⼀套完整的web应⽤程序测试系统,包含了测试的录制(selenium IDE),编写及运⾏(Selenium Remote Control)和测试的并⾏处理(Selenium Grid)。Selenium的核⼼Selenium Core基于JsUnit,完全由JavaScript编写,因此可以⽤于任何⽀持JavaScript的浏览器上。
selenium可以模拟真实浏览器,⾃动化测试⼯具,⽀持多种浏览器,爬⾍中主要⽤来解决JavaScript渲染问题。
⼆、selenium基本使⽤
⽤python写爬⾍的时候,主要⽤的是selenium的Webdriver,我们可以通过下⾯的⽅式先看看Selenium.Webdriver⽀持哪些浏览器
执⾏结果如下,从结果中我们也可以看出基本⼭⽀持了常见的所有浏览器:
这⾥要说⼀下⽐较重要的PhantomJS,PhantomJS是⼀个⽽基于WebKit的服务端JavaScript API,⽀持Web⽽不需要浏览器⽀持,其快速、原⽣⽀持各种Web标准:Dom处理,CSS选择器,JSON等等。PhantomJS可以⽤⽤于页⾯⾃动化、⽹络监测、⽹页截屏,以及⽆界⾯测试
声明浏览器对象
上⾯我们知道了selenium⽀持很多的浏览器,但是如果想要声明并调⽤浏览器则需要:
from selenium import webdriver
browser = webdriver.Chrome()
browser = webdriver.Firefox()
这⾥只写了两个例⼦,当然了其他的⽀持的浏览器都可以通过这种⽅式调⽤
访问页⾯
from selenium import webdriver
browser = webdriver.Chrome()
<("www.baidu")
print(browser.page_source)
browser.close()
上述代码运⾏后,会⾃动打开Chrome浏览器,并登陆百度打印百度⾸页的源代码,然后关闭浏览器
查元素
单个元素查
from selenium import webdriver
browser = webdriver.Chrome()
<("www.taobao")
input_first = browser.find_element_by_id("q")
input_second = browser.find_element_by_css_selector("#q")
input_third = browser.find_element_by_xpath('//*[@id="q"]')
print(input_first)
print(input_second)
print(input_third)
browser.close()
这⾥我们通过三种不同的⽅式去获取响应的元素,第⼀种是通过id的⽅式,第⼆个中是CSS选择器,第三种是xpath选择器,结果都是相同的。
结果如下:
这⾥列举⼀下常⽤的查元素⽅法:
find_element_by_name
find_element_by_id
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
下⾯这种⽅式是⽐较通⽤的⼀种⽅式:这⾥需要记住By模块所以需要导⼊
from selenium.webdrivermon.by import By
from selenium import webdriver
from selenium.webdrivermon.by import By
browser = webdriver.Chrome()
<("www.taobao")
input_first = browser.find_element(By.ID,"q")
print(input_first)
browser.close()
当然这种⽅法和上述的⽅式是通⽤的,browser.find_element(By.ID,"q")这⾥By.ID中的ID可以替换为其他⼏个
多个元素查
其实多个元素和单个元素的区别,举个例⼦:find_elements,单个元素是find_element,其他使⽤上没什么区别,通过其中的⼀个例⼦演⽰:from selenium import webdriver
browser = webdriver.Chrome()
<("www.taobao")
lis = browser.find_elements_by_css_selector('.service-bd li')
print(lis)
browser.close()
这样获得就是⼀个列表
当然上⾯的⽅式也是可以通过导⼊from selenium.webdrivermon.by import By 这种⽅式实现
lis = browser.find_elements(By.CSS_SELECTOR,'.service-bd li')
同样的在单个元素中查的⽅法在多个元素查中同样存在:
find_elements_by_name
find_elements_by_id
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
元素交互操作
对于获取的元素调⽤交互⽅法
from selenium import webdriver
import time
browser = webdriver.Chrome()
<("www.taobao")
input_str = browser.find_element_by_id('q')
input_str.send_keys("ipad")
time.sleep(1)
input_str.clear()
input_str.send_keys("MakBook pro")
button = browser.find_element_by_class_name('btn-search')
button.click()
运⾏的结果可以看出程序会⾃动打开Chrome浏览器并打开淘宝输⼊ipad,然后删除,重新输⼊MakBook pro,并点击搜索
交互动作
将动作附加到动作链中串⾏执⾏
from selenium import webdriver
from selenium.webdriver import ActionChains
browser = webdriver.Chrome()
url = "www.runoob/try/try.php?filename=jqueryui-api-droppable"
<(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
target = browser.find_element_by_css_selector('#droppable')
actions = ActionChains(browser)
actions.drag_and_drop(source, target)
actions.perform()
执⾏JavaScript
这是⼀个⾮常有⽤的⽅法,这⾥就可以直接调⽤js⽅法来实现⼀些操作,
下⾯的例⼦是通过登录知乎然后通过js翻到页⾯底部,并弹框提⽰
from selenium import webdriver
browser = webdriver.Chrome()
<("www.zhihu/explore")
获取元素属性
get_attribute('class')
from selenium import webdriver
browser = webdriver.Chrome()
url = 'www.zhihu/explore'
<(url)
logo = browser.find_element_by_id('zh-top-link-logo')
print(logo)
_attribute('class'))
获取⽂本值
text
from selenium import webdriver
browser = webdriver.Chrome()
url = 'www.zhihu/explore'
<(url)
input = browser.find_element_by_class_name('zu-top-add-question')
)
获取ID,位置,标签名
id
location
tag_name
size
from selenium import webdriver
browser = webdriver.Chrome()
url = 'www.zhihu/explore'
<(url)
input = browser.find_element_by_class_name('zu-top-add-question')
print(input.id)
print(input.location)
print(input.tag_name)
print(input.size)
Frame
在很多⽹页中都是有Frame标签,所以我们爬取数据的时候就涉及到切⼊到frame中以及切出来的问题,通过下⾯的例⼦演⽰这⾥常⽤的是switch_to.from()和switch_to.parent_frame()
import time
from selenium import webdriver
ptions import NoSuchElementException
browser = webdriver.Chrome()
url = 'www.runoob/try/try.php?filename=jqueryui-api-droppable'
<(url)
browser.switch_to.frame('iframeResult')
source = browser.find_element_by_css_selector('#draggable')
print(source)
try:
logo = browser.find_element_by_class_name('logo')
except NoSuchElementException:
print('NO LOGO')
browser.switch_to.parent_frame()
logo = browser.find_element_by_class_name('logo')
print(logo)
)
等待
当使⽤了隐式等待执⾏测试的时候,如果 WebDriver没有在 DOM中到元素,将继续等待,超出设定时间后则抛出不到元素的异常, 换句话说,当查元素或元素并没有⽴即出现的时候,隐式等待将等待⼀段时间再查 DOM,默认的时间是0
隐式等待
到了⼀定的时间发现元素还没有加载,则继续等待我们指定的时间,如果超过了我们指定的时间还没有加载就会抛出异常,如果没有需要等待的时候就已经加载完毕就会⽴即执⾏
from selenium import webdriver
browser = webdriver.Chrome()
browser.implicitly_wait(10)
<('www.zhihu/explore')
jquery是什么有什么作用input = browser.find_element_by_class_name('zu-top-add-question')
print(input)
显⽰等待
指定⼀个等待条件,并且指定⼀个最长等待时间,会在这个时间内进⾏判断是否满⾜等待条件,如果成⽴就会⽴即返回,如果不成⽴,就会⼀直等待,直到等待你指定的最长等待时间,如果还是不满⾜,
就会抛出异常,如果满⾜了就会正常返回
from selenium import webdriver
from selenium.webdrivermon.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
browser = webdriver.Chrome()
<('www.taobao/')
wait = WebDriverWait(browser, 10)
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)
上述的例⼦中的条件:EC.presence_of_element_located()是确认元素是否已经出现了
EC.element_to_be_clickable()是确认元素是否是可点击的
常⽤的判断条件:
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 frame加载并切换
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 是否出现Alert
浏览器的前进和后退
back()
forward()
import time
from selenium import webdriver
browser = webdriver.Chrome()
<('www.baidu/')
<('www.taobao/')
<('/')
browser.back()
time.sleep(1)
browser.forward()
browser.close()
cookie操作
get_cookies()
delete_all_cookes()
add_cookie()
from selenium import webdriver
browser = webdriver.Chrome()
<('www.zhihu/explore')
_cookies())
browser.add_cookie({'name': 'name', 'domain': 'www.zhihu', 'value': 'zhaofan'})
_cookies())
browser.delete_all_cookies()
_cookies())
选项卡管理
通过执⾏js命令实现新开选项卡window.open()
不同的选项卡是存在列表⾥browser.window_handles
通过browser.window_handles[0]就可以操作第⼀个选项卡
import time
from selenium import webdriver
browser = webdriver.Chrome()
<('www.baidu')
print(browser.window_handles)
browser.switch_to_window(browser.window_handles[1])
<('www.taobao')
time.sleep(1)
browser.switch_to_window(browser.window_handles[0])
<('')
异常处理
from selenium import webdriver
ptions import TimeoutException, NoSuchElementException browser = webdriver.Chrome()
try:
<('www.baidu')
except TimeoutException:
print('Time Out')
try:
browser.find_element_by_id('hello')
except NoSuchElementException:
print('No Element')
finally:
browser.close()
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论