При работе в браузере мы можем открывать новые вкладки и работать в них. Можем открыть любое количество вкладок одновременно, но работать можем только в активной. Мы можем переключаться между вкладками, получать их title, проходить по вкладкам в цикле, получать их дескрипторы — практически все то, что вы делаете вручную.
Вам может понадобиться собрать данные со второй вкладки, не отвлекаясь на первую. Или сайт, который вы парсите, открывает ссылки в новой вкладке. Такое происходит, если у ссылок есть атрибут target=»_blank».
Дескриптор — это идентификатор вкладки браузера. В Opera и Chrome дескрипторы выглядят одинаково, например, CDwindow-8696D8A3F22B281BB03FC1EC259B251, а в Firefox они имеют иной вид, например, d8e0e954-bf72-4eae-a63e-ea404c3b0eb. Дескрипторы — это те сущности, которые помогают нам манипулировать вкладками.
.current_window_handle — возвращает дескриптор текущей вкладки;
.window_handles — возвращает список всех дескрипторов открытых вкладок;
.switch_to.window(window_handles[0]) — переключает фокус между вкладками.
Запустите код ниже, чтобы посмотреть, как он работает. Этот код открывает первую вкладку методом .get(«URL»), затем открывает ещё три вкладки методом .execute_script() и после этого печатает все дескрипторы открытых вкладок.
import time from selenium import webdriver with webdriver.Chrome() as browser: browser.get('https://mob25.com/') time.sleep(1) browser.execute_script('window.open("https://mob25.com/category/novosti-cifrovyh-tehnologij/", "_blank1");') browser.execute_script('window.open("https://mob25.com/category/knigi/", "_blank2");') browser.execute_script('window.open("https://mob25.com/category/stati/", "_blank3");') time.sleep(2) print(browser.window_handles)
В некоторых гайдах в интернете вы будете встречать информацию о том, что работать можно только в первой открытой вкладке, а остальные открываются лишь для красоты. Но хочу вас обрадовать: это совсем не так. Работать мы можем со всеми вкладками, но только по очереди и только в активной.
Запустите у себя в терминале код ниже, чтобы наблюдать за работой Selenium во всех вкладках по очереди. Обратите внимание на то, что итерация по вкладкам происходит в случайном порядке — это обусловлено асинхронной природой обработки данных современными браузерами. Следует также учесть, что самая первая вкладка имеет имя «data»; в этой вкладке открывается страница, переданная в метод .get(«URL»).
from selenium import webdriver from selenium.webdriver.common.by import By with webdriver.Chrome() as browser: browser.execute_script('window.open("https://mob25.com/", "_blank1");') browser.execute_script('window.open("https://mob25.com/category/novosti-cifrovyh-tehnologij/", "_blank2");') browser.execute_script('window.open("https://mob25.com/category/knigi/", "_blank3");') browser.execute_script('window.open("https://mob25.com/category/stati/", "_blank4");') for page in browser.window_handles: browser.switch_to.window(page) for y in browser.find_elements(By.CLASS_NAME, 'check'): y.click()
Получаем title вкладки
Title — это то, что содержится в HTML-тегах <title>Текст на вкладке</title> и отображается на вкладке браузера.
Чтобы получить имя вкладки, т.е. её title, используется метод .execute_script(«return document.title;»), в который мы передали код JavaScript, возвращающий имя вкладки.
Запустите код ниже у себя в терминале. Этот код откроет страницу и напечатает в консоли title вкладки.
from selenium import webdriver with webdriver.Chrome() as browser: browser.get("https://mob25.com/category/knigi/") print(browser.execute_script("return document.title;"))
>>> WEB Парсинг на Python — Stepik