旗下导航:搜·么
当前位置:网站首页 > Python教程 > 正文

Selenium+PhantomJs剖析衬着Js的基础操纵【Python教程】,python,爬虫,Selenium,PhantomJs

作者:搜教程发布时间:2019-11-27分类:Python教程浏览:33评论:0


导读:有人说Selenium库和PhantomJ,说他们连系运用是全能的利器。那末,他们真的那末凶猛吗,我们一起来看看Selenium库的用法吧。经由过程这篇文章让我们来看一下Selen...
有人说Selenium库和PhantomJ,说他们连系运用是全能的利器。那末,他们真的那末凶猛吗,我们一起来看看Selenium库的用法吧。经由过程这篇文章让我们来看一下Selenium库连系PhantomJs,Chrome等一些浏览器的操纵吧。

什么是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网别的相干文章!

标签:python爬虫SeleniumPhantomJs


欢迎 发表评论: