Maison >développement back-end >Tutoriel Python >Selenium+PhantomJs analyse et restitue les opérations de base de Js
Certaines personnes disent que la bibliothèque Selenium et PhantomJ sont un outil polyvalent lorsqu'elles sont utilisées ensemble. Alors, sont-ils vraiment si puissants ? Jetons un coup d’œil à l’utilisation de la bibliothèque Selenium. A travers cet article, revenons sur le fonctionnement de la bibliothèque Selenium combinée avec PhantomJs, Chrome et autres navigateurs.
Qu'est-ce que Selenium
Selenium est un outil de test automatisé qui prend en charge certains navigateurs, notamment Chrome, Firefox, Safari, PhantomJs, etc. S'il est utilisé dans les robots d'exploration, nous l'utilisons principalement pour résoudre certains problèmes de rendu JavaScript.
Lorsque nous utilisons la bibliothèque Requests pour demander certaines pages Web, telles que 163music, les données de réponse que nous obtenons ne correspondent pas à toutes les informations que nous voyons dans le navigateur. Il peut être rendu via js. Ensuite, si nous utilisons la bibliothèque Selenium, nous ne nous soucierons plus de savoir comment résoudre ce problème.
Parce que notre navigateur, tel que PhantomJs, est un navigateur sans interface, il est utilisé pour restituer et analyser js, et la bibliothèque Selenium est chargée d'envoyer certaines commandes au navigateur et d'en simuler certaines, telles que les listes déroulantes et. glisser-déposer, tourner les pages, saisir un formulaire et d'autres actions. De cette façon, la combinaison des deux peut parfaitement résoudre ces problèmes de rendu JS.
Remarque
Bien que la bibliothèque Selenium plus PhantomJs soit très utile, après tout, elle pilote un navigateur et obtient ensuite des données. Ainsi, lorsque nous l'utiliserons, nous constaterons qu'il n'est pas aussi rapide que certaines bibliothèques d'analyse que nous utilisons. C’est en fait son inconvénient, c’est pourquoi je vous suggère quand même de ne pas les utiliser jusqu’à ce que vous ne trouviez vraiment pas de solution.
Préparation de l'installation
pip installe directement la bibliothèque Selenium :
pip install selenium
Installation du pilote du navigateur :
Pilote du navigateur Chrome
Pilote de navigateur PhantomJs
Nous devons configurer le pilote de navigateur installé sur nos variables d'environnement. Pour les utilisateurs Windows, la configuration des variables d'environnement est plus compliquée. Nous devons trouver l'emplacement du pilote téléchargé, puis copier son emplacement de fichier et le coller dans la variable d'environnement.
La configuration est terminée, saisie en ligne de commande :
phantomjs -v
Vérifiez si l'opération a réussi.
Exemple d'utilisation
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()
Si nous exécutons le code ci-dessus, nous verrons qu'un navigateur Chrome est ouvert localement, puis j'entre l'URL de mon blog, alors il le fera saisissez automatiquement « Python » dans la barre de recherche et cliquez sur Entrée pour rechercher. Et imprimez l'URL et le code source de la page de résultats.
Nos exemples sont tous exploités à l'aide du navigateur Chrome, car PhantomJs n'a pas d'interface et il n'est pas pratique de voir l'effet. Si vous ne l'exécutez pas correctement, le navigateur n'est généralement pas ouvert, cela signifie que vous n'avez pas installé le navigateur Chrome ou que vous n'avez pas configuré le pilote avec des variables d'environnement.
Alors que signifient ces lignes de code, et quelles instructions leur donnons-nous ?
Déclarer l'objet navigateur
from selenium import webdriver browser = webdriver.Chrome() # 声明其他浏览器 browser = webdriver.PhantomJs() browser = webdriver.Firefox()
Cela équivaut à appeler la méthode webdriver de la bibliothèque Selenium pour instancier un navigateur Chrome pour nous appeler .
Visitez la page
from selenium import webdriver browser = webdriver.Chrome() browser.get('http://www.yukunweb.com')
Nous transmettons l'url que nous voulons visiter à la méthode get. Appelez le navigateur pour accéder à l'URL.
Rechercher un élément
input = browser.find_element_by_id('s')
Ce code appelle la méthode find_element_by_id Comme son nom l'indique, il s'agit de trouver la balise avec l'identifiant 's'. , alors s'il s'agit d'une opération. Si la classe est 's', c'est find_element_by_class('s').
Bien sûr, on peut aussi utiliser les sélecteurs CSS et les sélecteurs xpath pour trouver des éléments :
input = browser.find_element_by_css_selector("#s") print(input) input = browser.find_element_by_xpath('//*[@id="s"]') print(input)
En imprimant les résultats, vous pouvez voir que peu importe le sélecteur utilisé, les résultats de la recherche sont les même. Voici quelques API de recherche :
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
Trouver plusieurs éléments
Si l'élément que nous recherchons est la balise li dans la page Web, il existe de nombreux éléments. Ensuite, notre méthode de recherche est la même que pour un élément unique, sauf que pour l'API de recherche, nous devons ajouter une forme plurielle après l'élément. C'est-à-dire :
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
L'opération interactive sur les éléments
consiste à émettre des instructions et à appeler des méthodes interactives pour les éléments que nous obtenons.
browser.get('http://www.yukunweb.com') input = browser.find_element_by_id('s') input.send_keys('Python') input.send_keys(Keys.ENTER)
Dans ce code, nous trouvons d'abord l'élément avec l'identifiant 's', puis lui passons la valeur 'Python', puis appelons la méthode interactive et tapons return voiture.
Bien sûr, dans la plupart des cas, nous ne pouvons pas utiliser directement la méthode consistant à appuyer sur Entrée, car nous ne savons pas si le formulaire a été soumis après avoir appuyé sur Entrée. Nous devons utiliser le finder pour trouver l'élément du bouton de soumission, puis simuler un clic :
button = browser.find_element_by_class_name('xxxx') button.click() # 清除表单信息 button.clear()
Ensuite, nous pouvons voir que lors de la simulation de connexion, nous pouvons saisir directement le numéro de compte et le mot de passe manuellement. S'il y a un code de vérification, fournissez directement une méthode de saisie. Nous saisissons manuellement le code de vérification et le transmettons au formulaire. Est-il très simple de simuler la connexion ?
Actions interactives
元素交互动作与上面的操作是不同的。上面的操作需要获得一个特定的元素。然后对这个特定的元素调用一些指令,才可以完成交互。而这个交互是将这些动作附加到动作链中串行执行。
我们以拖拽元素为例(我们需要导入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.地址
最后
D'accord, à travers cet article, j'espère que vous pourrez comprendre fondamentalement certaines des façons d'utiliser la bibliothèque Selenium combinée avec les pilotes de navigateur. Nous utilisons Chrome dans notre exemple, mais dans le code réel, il est préférable d'utiliser PhantomJs, car il n'a pas d'interface et fonctionne relativement mieux.
J'ai dit au début de l'article qu'il n'est généralement pas recommandé d'utiliser Selenium car il est très lent. Mais même si c’est lent, c’est quand même très cool, n’est-ce pas ?
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!