什么是Selenium
Selenium是一个自动化测试东西,支撑包括Chrome,Firefox,Safari,PhantomJs等一些浏览器。假如用于爬虫中,我们重要用来处置惩罚一些JavaScript衬着的题目。
我们在运用Requests库去要求一些网页的时刻,比方 163music,我们取得的相应数据呢,并不满是我们在浏览器中看到的信息。他多是经由过程js衬着出来的。那末,我们假如运用Selenium库,就不会再去体贴如何去处置惩罚这类题目了。
由于我们的浏览器,比方PhantomJs,他就是一个无界面的浏览器,他用来衬着剖析js,而Selenium库就担任给浏览器发送一些敕令,模仿一些比方下拉,拖拽,翻页,输入表单等行动。如许他们两个连系,关于那些 JS 的衬着题目是不是是圆满处置惩罚了。
注重
虽然Selenium库加上PhantomJs很好用,然则他毕竟是驱动一个浏览器,然后猎取数据。所以在我们运用中,会发明他并没有我们运用一些剖析库速度快。这着实就是他的弊病,所以我照样发起人人,不到着实找不到处置惩罚办法的时刻,不去运用他们。
装置预备
pip直接装置Selenium库:
pip install selenium
浏览器驱动的装置:
Chrome浏览器驱动
PhantomJs浏览器驱动
我们须要把装置好的浏览器驱动设置到我们的环境变量。关于Windows用户,设置环境变量比较贫苦。我们须要找到下载好的驱动位置,然后复制他的文件位置,见他粘贴到环境变量即可。
设置完成,敕令行输入:
phantomjs -v
检察是不是胜利。
运用样例
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('http://www.yukunweb.com') input = browser.find_element_by_id('s') input.send_keys('Python') input.send_keys(Keys.ENTER) wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID, 'main'))) print(browser.current_url) print(browser.page_source) finally: browser.close()
假如我们运转上面的代码,会看到当地翻开了一个Chrome浏览器,然后在浏览器地点栏输入了我的博客网址,然后他会自动的在搜刮栏输入‘Python’,而且点击了回车搜刮。而且将结果页的url和源代码打印出来。
我们的例子都是运用Chrome浏览器来操纵,由于PhantomJs是无界面的,不方便检察到结果。假如人人运转毛病的话,平常状况是浏览器并没有翻开,那末应该是人人没有装置好Chrome浏览器,或许没有将驱动设置环境变量。
那末这几行代码终究是什么意思呢,我们终究给予了什么指令呢?
声明浏览器对象
from selenium import webdriver browser = webdriver.Chrome() # 声明其他浏览器 browser = webdriver.PhantomJs() browser = webdriver.Firefox()
这就相当于我们挪用了Selenium库的webdriver要领,实例化一个Chrome浏览器给我们挪用。
接见页面
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com')
我们将要接见的url传给get要领。挪用浏览器接见url。
查找元素
input = browser.find_element_by_id('s')
这句代码挪用find_element_by_id要领,望文生义,就是查找id为‘s’的标签,那末假如是操纵class为‘s’的话,就是find_element_by_class('s')。
固然,我们还能够运用 CSS挑选器和xpath挑选器查找元素:
input = browser.find_element_by_css_selector("#s") print(input) input = browser.find_element_by_xpath('//*[@id="s"]') print(input)
经由过程打印结果,能够看到不论运用什么挑选器,查找结果都是一样的。下面是一些查找api:
find_element_by_namefind_element_by_xpathfind_element_by_link_textfind_element_by_partial_link_textfind_element_by_tag_namefind_element_by_class_namefind_element_by_css_selector
查找多个元素
假如我们查找的元素是网页中的li标签,是许多的元素。那末我们的查找体式格局和单个元素是雷同的,只是关于查找的api我们须要在element背面加个复数情势 s。等于:
find_elements_by_namefind_elements_by_xpathfind_elements_by_link_textfind_elements_by_partial_link_textfind_elements_by_tag_namefind_elements_by_class_namefind_elements_by_css_selector
元素交互操纵
等于关于我们猎取的元素下达指令,挪用交互的要领。
browser.get('http://www.yukunweb.com') input = browser.find_element_by_id('s') input.send_keys('Python') input.send_keys(Keys.ENTER)
这段代码中,我们起首查找到了id为‘s’的元素,然后传给他‘Python’值,然后挪用交互要领,敲了回车。
固然,在大多是状况下,我们不能直接运用敲击回车的要领,由于我们不确定是不是是敲了回车,表单就提交了。我们须要运用查找器查找到提交按钮元素,然后模仿点击:
button = browser.find_element_by_class_name('xxxx') button.click() # 消灭表单信息 button.clear()
那末,我们能够看到在模仿上岸时刻,直接让我们手动的输入账号,暗码,假如有验证码的话直接给一个input要领,我们手动输入验证码传给表单,是不是是很简单的就模仿登录了了。
交互行动
元素交互行动与上面的操纵是差别的。上面的操纵须要取得一个特定的元素。然后对这个特定的元素挪用一些指令,才能够完成交互。而这个交互是将这些行动附加到行动链中串行实行。
我们以拖拽元素为例(我们须要导入ACtionChains要领):
from selenium import webdriver from selenium.webdriver import ActionChains browser = webdriver.Chrome() browser.get(url) source = browser.find_element_by_name("source") target = browser.find_element_by_name("target") actions = ActionChains(browser) actions.drag_and_drop(source, target).perform()
这里的sourcs是我们要拖拽的元素,我们运用查找器找到他,target就是我们要拖拽到的位置元素。然后挪用ActionChains要领,完成拖拽操纵。
实行JavaScript
有些行动呢,Selenium库并没有为我们供应特定的api,比方说将浏览器进度条下拉,这个完成起来是很难的。那末我们就能够经由过程让Selenium实行JS来完成进度条的下拉,这个得须要一些js的学问,不过照样很简单的。
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com') browser.execute_script('window.scrollTo(0, document.body.scrollHeight)') browser.execute_script('alert("抵达底部")')
这就相当于我们将一些JS敕令传给Selenium的execute_script这个api,我们运转就能够看到浏览器下拉到底部,然后弹出会话框。
猎取元素文本值
假如我们查找获得一个元素,我们要如何取得元素的一些属性和文本信息呢?
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com') name = browser.find_element_by_css_selector('#kratos-logo > a') print(name.text) print(name.get_attribute('href'))
运转结果能够看到,他打印出了‘不测’和他的url。
Frame框架
有些网页在我们直接运用Selenium驱动浏览器打印源码的时刻,并没有准期取得想要的数据,那在我们检察网页源码的时刻,能够看到网页的iframe标签包裹的一个一个的框架。那末这就须要我们要求对应框架,拿到源码了。
我们以网易云音乐的歌手栏为例。
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://music.163.com/#/discover/artist/signed/') print(browser.page_source)
能够检察结果,并没有我们想要的信息。
from selenium import webdriver browser = webdriver.Chrome() browser.get('https://music.163.com/#/discover/artist/signed/') browser.switch_to.frame('contentFrame') print(browser.page_source)
此次打印,我们就能够看到我们须要的信息了,是不是是很简单。
显现守候
在文章最先的时刻,我们运转的那段代码中有一段代码是不是是还没有说。那就是我们敕令浏览器守候的操纵。
守候有两种体式格局,一种是山人守候,一种是显现守候。当运用了山人守候实行时,假如浏览器没有找到指定元素,将继承守候,假如超越设定时候就会抛出找不到元素的非常。而大多数状况我们发起运用显现守候。
显现守候是你指定一个守候的前提,还指定一个最长守候时候。那末顺序会在最长守候时候内,推断前提是不是建立,假如建立,马上返回。假如不建立,他会一向守候,直到最长守候时候完毕,假如前提依然不满足,就返回非常。
wait = WebDriverWait(browser, 10) wait.until(EC.presence_of_element_located((By.ID, 'main')))
这里的By.ID要领现实上就是一个查找的全能要领,而我们直接查找或许运用CSS、xpath查找充足满足,我也不过量引见,想要相识能够检察官方文档。
这里是晓得查找到id为‘main’就返回。
显现守候的一些前提另有:
title_is 题目是某内容
title_contains 题目包括某内容
presence_of_element_located 元素加载出,传入定位元组,如(By.ID, ‘p’)
visibility_of_element_located 元素可见,传入定位元组
visibility_of_element_located 元素可见,传入定位元组
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
窗口挑选
假如我们在表单输入关键词,提交表单后浏览器新翻开了一个窗口,那末我们要怎样去操纵新的窗口呢?干脆Selenium为我们供应了对应的api.
import time from selenium import webdriver from selenium.webdriver.common.keys import Keys browser = webdriver.Chrome() browser.get('http://www.23us.cc/') input = browser.find_element_by_id('bdcs-search-form-input') input.send_keys('斗破天穹') input.send_keys(Keys.ENTER) browser.switch_to_window(browser.window_handles[1]) print(browser.current_url) time.sleep(1) browser.switch_to_window(browser.window_handles[0]) print(browser.current_url)
经由过程打印结果,不难看出先打印了搜刮结果窗口url,然后打印了索引页url。要注重窗口的索引是从 0 最先的哦,这个人人都邃晓。
非常处置惩罚
非常处置惩罚和一般的非常处置惩罚一样,没有什么要说的,人人本身检察官方非常 api.地点
末了
好了,经由过程本篇文章愿望人人能够基础上相识Selenium库连系浏览器驱动的一些运用要领。我们例子里运用的是Chrome,然则人人在现实的代码里最好是运用PhantomJs,由于他是无界面的,运转起来相对好一点。
文章最先说过平常状况下不发起人人运用Selenium,由于他很慢。然则即使是慢,也很爽啊,是不是是。
以上就是Selenium+PhantomJs剖析衬着Js的基础操纵的细致内容,更多请关注ki4网别的相干文章!