Как нажать на кнопку на сайте через Python?
Есть сайт, на котором некоторые элементы страницы недоступны до нажатия на кнопку. Адрес при нажатии при этом не меняется, поэтому нельзя просто перейти на другую страницу. Как это сделать? Какие библиотеки нужны?
Отслеживать
задан 21 дек 2019 в 19:05
IceCube092 IceCube092
43 1 1 серебряный знак 8 8 бронзовых знаков
Нет баллов на коммент, поэтому так. Это должно помочь: stackoverflow.com/questions/27869225/…
21 дек 2019 в 19:13
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для подобных целей есть selenium.
Вот небольшой пример авторизации в вк.
from time import sleep from selenium import webdriver VK_ROOT_URL = "https://vk.com/" class TestFunc(object): def __init__(self): self.driver = webdriver.Firefox() self.driver.get(VK_ROOT_URL) def login(self, username, password): email_field = self.driver.find_element_by_id("index_email") email_field.send_keys(username) sleep(5) password_field = self.driver.find_element_by_id("index_pass") password_field.send_keys(password) sleep(5) login_button = self.driver.find_element_by_id("index_login_button") login_button.click() if __name__ == __main__: username = 'username' password = 'password' TestFunc().login(username, password)
Для марса у селенитам есть такая функция как get_attribute(«outerHTML»), которая возвращает HTML. В вашем распоряжении есть большая документация.
Обрабатываем нажатие кнопки в Selenium
В материале «Парсим данные, используя Buetiful Soup и Selenium» мы уже рассмотрели, как быть, когда данные на странице динамически подгружаются при скролле страницы. Но бывают ситуации, когда новые данные можно получить, только нажав на кнопку «Показать ещё» — сегодня узнаем, как через Selenium сымитировать нажатие кнопки для полного открытия страницы, соберём идентификаторы пива, оценки к каждому продукту и отправим данные в Clickhouse
Структура страницы
Возьмём случайную пивоварню — у неё 105 чекинов, то есть, отзывов. Страница с чекинами пивоварни показывает не более 25 чекинов и выглядит так:
Если попробуем промотать в самый низ, столкнёмся с той самой кнопкой, мешающей нам взять все 105 за раз:

Мы поступим так: выясним, к какому классу относится элемент кнопки и будем на неё нажимать, пока это возможно. Так как Selenium запускает браузер, следующая кнопка «Показать ещё» может не успеть прогрузиться, поэтому между нажатиями поставим интервал в пару секунд. Как только страница раскроется полностью — мы возьмём её содержимое и распарсим нужные данные из чекинов. Зайдём в код страницы и найдём кнопку — она относится к классу more_checkins .

У кнопки есть свойства стиля, а именно — display . В случае, если кнопка должна отображаться, display принимает значение block . Но когда промотаем страницу до самого конца, кнопку не нужно будет показывать, ведь открывать больше нечего — поэтому display кнопки примет значение none . В случае, если мы запросим у кнопки display и вернётся none будем знать, что открывать больше нечего и можно перестать жать на кнопку.

Пишем код
Начнём с импорта библиотек:
import time from selenium import webdriver from bs4 import BeautifulSoup as bs import re from datetime import datetime from clickhouse_driver import Client
Chromedriver, необходимый для запуска браузера через Selenium, можно установить с официальной страницы
Подключимся к базе данных, зададим cookies:
client = Client(host='ec1-23-456-789-10.us-east-2.compute.amazonaws.com', user='', password='', port='9000', database='') count = 0 cookies = < 'domain':'untappd.com', 'expiry':1594072726, 'httpOnly':True, 'name':'untappd_user_v3_e', 'path':'/', 'secure':False, 'value':'your_value' >
О том, как запускать Selenium с cookies можно прочитать в материале «Парсим данные каталога сайта, используя Beautiful Soup и Selenium». Нам нужен параметр untappd_user_v3_e.
Так как мы планируем работать с пивоварнями, у которых более сотни тысяч чекинов, может оказаться так, что страница будет чересчур тяжёлой, и нагрузка на машину будет огромна. Чтобы этого избежать, отключим всё лишнее, а затем подключим cookie для авторизации:
options = webdriver.ChromeOptions() prefs = > options.add_experimental_option('prefs', prefs) options.add_argument("start-maximized") options.add_argument("disable-infobars") options.add_argument("--disable-extensions") driver = webdriver.Chrome(options=options) driver.get('https://untappd.com/TooSunnyBrewery') driver.add_cookie(cookies)
Напишем функцию, которая принимает ссылку, переходит по ней, полностью раскрывает страницу и возвращает нам soup, который можно будет распарсить. Получим display кнопки и запишем в переменную more_checkins : пока он не равен none будем нажимать на кнопку и снова получать её display . Сделаем интервал в две секунды между нажатиями, чтобы подождать прогрузку страницы. Как только будет получена вся страница, переведём её в soup библиотекой bs4 .
def get_html_page(url): driver.get(url) driver.maximize_window() more_checkins = driver.execute_script("var more_checkins=document.getElementsByClassName('more_checkins_logged')[0].style.display;return more_checkins;") print(more_checkins) while more_checkins != "none": driver.execute_script("document.getElementsByClassName('more_checkins_logged')[0].click()") time.sleep(2) more_checkins = driver.execute_script("var more_checkins=document.getElementsByClassName('more_checkins_logged')[0].style.display;return more_checkins;") print(more_checkins) source_data = driver.page_source soup = bs(source_data, 'lxml') return soup
Напишем следующую функцию: она тоже будет принимать url страницы, передавать его в get_html_page , получать soup и парсить его. Функция вернёт запакованные списки с идентификатором пива и оценкой к нему.
О том, как парсить элементы страницы мы уже говорили в материале «Парсим данные каталога сайта, используя Beautiful Soup».
def parse_html_page(url): soup = get_html_page(url) brewery_id = soup.find_all('a', )[0]['href'][28:] items = soup.find_all('div', ) checkin_rating_list = [] beer_id_list = [] count = 0 print('Заполняю списки') for checkin in items: print(count, '/', len(items)) try: checkin_rating_list.append(float(checkin.find('div', )['data-rating'])) except Exception: checkin_rating_list.append('cast(Null as Nullable(Float32))') try: beer_id_list.append(int(checkin.find('a', )['href'][-7:])) except Exception: beer_id_list.append('cast(Null as Nullable(UInt64))') count += 1 return zip(checkin_rating_list, beer_id_list)
Наконец, напишем вызов функций по пивоварням. В материале «Использование словарей в Clickhouse на примере данных Untappd» мы уже рассмотрели, как получить список идентификаторов российских пивоварен — обратимся к нему через таблицу в Clickhouse
brewery_list = client.execute('SELECT brewery_id FROM brewery_info')
Если посмотрим на brewery_list , то узнаем, что данные вернулись в неудобном формате: это список кортежей.

Небольшое лямбда-выражение позволит его «выпрямить»:
flatten = lambda lst: [item for sublist in lst for item in sublist] brewery_list = flatten(brewery_list)
Работать с таким списком значительно комфортнее:

Для каждой пивоварни в списке сформируем url — он состоит из стандартной ссылки и идентификатора пивоварни в конце. Отправим url в функцию parse_html_page , которая сама вызовет get_html_page и вернёт списки с beer_id и rating_score . Так как два списка вернутся упакованными можем пройти по ним итератором, сформировав кортеж и отправив его в Clickhouse.
for brewery_id in brewery_list: print('Беру пивоварню с id', brewery_id, count, '/', len(brewery_list)) url = 'https://untappd.com/brewery/' + str(brewery_id) returned_checkins = parse_html_page(url) for rating, beer_id in returned_checkins: tuple_to_insert = (rating, beer_id) try: client.execute(f'INSERT INTO beer_reviews VALUES ') except errors.ServerException as E: print(E) count += 1
С кнопками на этом всё. Постепенно мы формируем отличный датасет для последующего анализа, который рассмотрим в следующем цикле статей, как только завершим сбор данных — возможно, через месяц.
Python-сообщество
![]()
- Начало
- » Python для новичков
- » Kak кликнуть кнопку на сайте?
#1 Март 2, 2016 23:12:51
newpy Зарегистрирован: 2014-08-12 Сообщения: 56 Репутация: 0 Профиль Отправить e-mail
Kak кликнуть кнопку на сайте?
Получилось скачать сайт.
import urllib.parse х = urllib.request.urlopen('https://yandex.ru/internet') y=x.read() print(y)
Хотелось бы научиться кликать кнопки на сайте.
И попутно два вопроса:
1. Такой способ правильный? Может уже так не делают
2. Что за модуль urllib2?
#2 Март 2, 2016 23:57:48
ZerG Зарегистрирован: 2012-04-05 Сообщения: 2363 Репутация: 66 Профиль Отправить e-mail
Kak кликнуть кнопку на сайте?
Начните с того что вы скачали не сайт в вашем понимании а его HTML код и работаете с ним! Вы скачали текстовый файл вы можете сделать по нему поиск. замену и так далее. Для того что бы появилась кнопка в вашем понимании текстовый файл надо сохранить как веб файл и открыть браузером что бы он открыл его как веб страницу а не как текстовый документ
Влодение рускай арфаграфией — это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости
#3 Март 3, 2016 01:37:14
py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9636 Репутация: 839 Профиль Отправить e-mail
Kak кликнуть кнопку на сайте?
newpy
2. Что за модуль urllib2?
Во втором питоне urllib — это старый модуль, потом там стали делать новый и назвали его urllib2. И вот этот новый модуль включили в третий питон под названием urllib.
Есть ещё urllib3.
newpy
Хотелось бы научиться кликать кнопки на сайте.
Потренируйся на сайтах, где ещё остался http. Поставь Wireshark и смотри в нём, что посылается, когда кнопку нажимаешь.
Можешь ещё поставить в браузере Firebug, там тоже можно смотреть, что посылается.
Отредактировано py.user.next (Март 3, 2016 01:58:30)
#4 Март 3, 2016 15:05:27
newpy Зарегистрирован: 2014-08-12 Сообщения: 56 Репутация: 0 Профиль Отправить e-mail
Kak кликнуть кнопку на сайте?
ZerG
вы можете сделать по нему поиск. замену и так далее.
я вот эти и имел ввиду, что могу выбрать данные, которые мне “показывает” страница.. Например yandex.ru/internet выдает мой айпи, мой город.. Но что бы получить ещё кое-что (например скорость интернета) необходимо нажимать имеющуюся там же кнопку “тестирование скорости”. Теперь хотелось бы научиться нажимать на эту кнопку..
Правильно ли я понимаю, что нет никаких “нажатий” кнопок на сайте, а нужно отследить какая ссылка отправляется при нажатии на кнопку и таким же способом “скачать” этот сайт?
py.user.next
urllib2…включили в третий питон под названием urllib.
спасибо ценная информация. И похоже что действительно нет никаких “нажатий” мифических кнопок раз говоришь Wireshark, Firebug
Спасибо за отклики. Обоим поставил крестики
#5 Март 4, 2016 03:10:15
py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9636 Репутация: 839 Профиль Отправить e-mail
Kak кликнуть кнопку на сайте?
newpy
И похоже что действительно нет никаких “нажатий” мифических кнопок
Нажатие на кнопку приводит к тому, что браузер формирует запрос в соответствии с протоколом HTTP (протокол передачи гипертекста). А то, как он его формирует, записывается в описании для кнопки на языке HTML (язык разметки гипертекста).
Сервер, который получает запрос, не знает, как тот был сформирован.
Отредактировано py.user.next (Март 4, 2016 03:13:27)
Как нажать на кнопку с использованием Selenium и Python? ️
Как нажать на кнопку в Selenium с использованием Python?
Для нажатия на кнопку в Selenium с использованием Python, вам понадобится найти элемент кнопки на веб-странице и вызвать соответствующий метод для его нажатия.
Пример кода
from selenium import webdriver # Создание экземпляра драйвера Selenium driver = webdriver.Chrome() # Переход на нужную веб-страницу driver.get("https://www.example.com") # Нахождение элемента кнопки по его селектору button = driver.find_element_by_css_selector("#button-id") # Нажатие на кнопку button.click() # Закрытие драйвера после выполнения действий driver.quit()
В этом примере мы создаем экземпляр драйвера Selenium, переходим на веб-страницу, находим элемент кнопки на странице по его CSS-селектору, а затем вызываем метод click() для нажатия на кнопку. Не забудьте закрыть драйвер после выполнения всех действий.
Детальный ответ
Как нажать на кнопку в Selenium с помощью Python?
Добро пожаловать в мир автоматизации веб-тестирования с использованием Selenium и Python! В этой статье мы рассмотрим, как нажать на кнопку на веб-странице с помощью Selenium и Python. Перед тем, как мы начнем, убедитесь, что у вас установлены Selenium и Python. Если нет, вы можете установить их, выполнив следующие команды:
pip install selenium pip install webdriver_manager
Итак, давайте перейдем к коду. Прежде всего, нам нужно импортировать необходимые модули:
from selenium import webdriver from selenium.webdriver.common.by import By
Затем мы должны указать путь к веб-драйверу. С помощью WebDriver Manager мы можем автоматически установить и настроить драйвер для выбранного браузера:
from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager service = Service(ChromeDriverManager().install())
Теперь мы можем создать экземпляр класса WebDriver, указав путь к браузеру и службу:
driver = webdriver.Chrome(service=service)
Отлично! Теперь, когда у нас есть экземпляр веб-драйвера, мы можем открыть веб-страницу, на которой находится кнопка, которую мы хотим нажать:
driver.get("https://www.example.com")
Чтобы найти кнопку на странице, мы должны использовать селектор, например, css-селектор или xpath. Давайте рассмотрим пример с использованием css-селектора:
button = driver.find_element(By.CSS_SELECTOR, "button.button-class")
В приведенном выше примере мы ищем элемент кнопки с классом «button-class» с использованием css-селектора. Вы можете изменить селектор в соответствии со страницей, на которой вы работаете. Теперь, когда у нас есть элемент кнопки, мы можем нажать на нее с помощью метода «click()»:
button.click()
Отлично! Вы только что научились нажимать на кнопку на веб-странице с помощью Selenium и Python. Используя этот подход, вы можете автоматизировать нажатие на любую кнопку на веб-странице в своих автоматизированных тестах. Не забывайте, что перед использованием функции «find_element» вам необходимо дождаться, когда кнопка станет видимой на странице. Для этого вы можете использовать явные ожидания с помощью метода «WebDriverWait».
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # Ждем, пока кнопка не будет видимой на странице wait = WebDriverWait(driver, 10) button = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "button.button-class"))) # Нажимаем на кнопку button.click()
Теперь у вас есть полный набор инструментов для тестирования кнопок на веб-страницах с использованием Selenium и Python. Удачи в ваших автоматизированных тестах!
