Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.89/111: Рейтинг темы: голосов - 111, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
1

Как нажать на кнопку на сайте?

15.08.2013, 17:31. Показов 22746. Ответов 32
Метки нет (Все метки)

День добрый. использую Python 2.7 и библиотеку Grab. никак не могу нажать кнопку на сайте. "Name" у кнопки нет, по "Type" не получается единственное чего смог добиться:

Python
1
2
3
4
5
6
7
8
9
10
11
from grab import Grab
import logging
 
 
logging.basicConfig(level=logging.DEBUG)
 
g=Grab(log_file='out.html')
g.go('http://ya.ru//')
g.set_input('text', '22')
 
g.submit(submit_name='submit')
(поэксперементировал на ya.ru)

но такой метод работает только если есть поле куда надо вводить текст (с этим проблем обычно не возникает) а вот если нужно нажать на кнопку (просто нажать (например предлогается в форме регистрации выбрать ваш пол)) возникает фэйл

например если из приведеного выше скрипта исключить строчку
Python
1
g.set_input('text', '22')
то выдаст ошибку
Python
1
TypeError: object of type 'InputGetter' has no len()
хотя по идее должно перейти на страничку http://yandex.ru/yandsearch?text=&lr=21

Спросил знакомого програмиста на PHP, он сказал что это может быть связанно с джавой (попробывали заполнить один сайт отключив джава скрипты и потерпели закономерный фэйл) хотелось-бы узнать так-ли это. Ведь если так то идея с пост запросами заранее практически обречена ибо на многих сайтах используют яву Вобмещем подскажите как нажать на кнопку, и действительно-ли джава влияет на этот процесс. Заранее спасибо. извиняюсь за ужасный слог но голова уже не варит совсем от всего этого
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2013, 17:31
Ответы с готовыми решениями:

Как нажать кнопку на сайте и скачать архив по ссылке из ответа?
Добрый день. У меня вопрос, кто нибудь когда нибудь сталкивался с задачами на скачивания архива с...

Найти кнопку на сайте и нажать ее
Такая тема на странице у кнопки постоянно изменяется id при прохождении теста и мне нужно нажать ее...

Как с использованием post запрос нажать на кнопку на сайте в python?
Мне надо нажать на кнопку на сайте. Я разобрался как это сделать с помощью selenium webdriver, но...

Нажать кнопку на сайте не используя Selenium
Пытаюсь из вк спарсить документ .docx получаю ссылку на него, перехожу, но вместо скачивания...

32
15 / 15 / 2
Регистрация: 15.07.2011
Сообщений: 49
15.08.2013, 18:00 2
Никогда не понимал, зачем такие муки?
Почему нельзя взять сниффер и посмотреть какие запросы куда посылаются по нажатию кнопки, а потом уже реализовать это программно. Через urllib или curl.
1
4856 / 3277 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
15.08.2013, 22:17 3
Как нажать кнопку на сайте и скачать архив по ссылке из ответа?
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
17.08.2013, 12:09  [ТС] 4
Всем спасибо попробую и напишу о результатах
0
52 / 51 / 15
Регистрация: 27.06.2013
Сообщений: 189
Записей в блоге: 1
19.08.2013, 07:54 5
Python
1
2
3
4
5
6
7
8
9
10
from twill.commands import *
 
 
go("http://www.google.com")
showforms()
 
 
fv('1','q', 'dog')
 
submit()
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
30.08.2013, 22:21  [ТС] 6
вобщем пока дело продвинулось мало

но появились вопросы:
1 реально нажать кнопку используя чисто Grab (не юзая при этом остальных библиотек, вот только не надо мне сейчас рассказывать про то что это просто обертка к другим библиотекам, итак в курсе, просто не хочется использовать лишних модулей)
2 "Никогда не понимал, зачем такие муки?
Почему нельзя взять сниффер и посмотреть какие запросы куда посылаются по нажатию кнопки, а потом уже реализовать это программно. Через urllib или curl."
я тоже никогда не понимал почему не написать норм доки на русском языке. Вы правда думаете что я не пытался? у меня есть и фаер баг и реквест маркер. другое дело что не понятно как писать код и примеров я найти не могу. Если для Вас все так просто и очевидно то приведите пример плиз вот для яндекса если все так просто то ведь не отнимет у Вас много времени так ведь?
3. как отправить с помощью Grab raw ?

Добавлено через 9 минут
и еще не маловажный момент у меня питон версии 2.7
0
135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 399
30.08.2013, 23:51 7
Цитата Сообщение от Glebmanager@mai Посмотреть сообщение

Python
1
2
3
4
5
6
7
8
9
10
11
from grab import Grab
import logging
 
 
logging.basicConfig(level=logging.DEBUG)
 
g=Grab(log_file='out.html')
g.go('http://ya.ru//')
g.set_input('text', '22')
 
g.submit(submit_name='submit')
Странно, если закомментировать строчку с set_input(), то у меня всё работает нормально, без ошибок

Добавлено через 32 минуты
Такой вариант тоже рабочий:
Python
1
g.set_input('text', '')
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
31.08.2013, 23:19  [ТС] 8
а у меня увы нет( пишет :

Python
1
2
3
4
5
6
7
8
9
10
  File "C:\Python27\lib\site-packages\grab-0.4.8-py2.7.egg\grab\ext\form.py", line 238, in submit
    post = self.form_fields()
  File "C:\Python27\lib\site-packages\grab-0.4.8-py2.7.egg\grab\ext\form.py", line 320, in form_fields
    fields = dict(self.form.fields)
  File "C:\Python27\lib\site-packages\grab-0.4.8-py2.7.egg\grab\ext\form.py", line 95, in form
    forms = [(idx, len(x.fields)) for idx, x in enumerate(self.tree.forms)]
  File "C:\Python27\lib\site-packages\lxml\html\__init__.py", line 931, in __len__
    return len(self.inputs)
TypeError: object of type 'InputGetter' has no len()
>>>
я уже просто весь мозг сломал себе с этими кнопками
просто отправлять данные в стандартное текстовое поле я могу, но дело в том что мне нужно нажимать на кнопки или просто выбирать из предложенного списка нужный вариант, например при регистрации на энном сайте, и чтобы сделать это мне нужен хотя-бы один работающий пример, с норм библиотеками, тоесть с ГРАБ-ом или на крайний случай с УРЛИБ-ом
0
135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 399
31.08.2013, 23:56 9
python 2.7.3, grab 0.4.8, lxml 2.3.6, pycurl-ssl-7.19.0.
1
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2013, 06:31 10
К чему такие сложности? Делай GET-запрос на http://yandex.ru/yandsearch, параметр text передавай в строке запроса.

Твой пример скорее всего не работал из-за ограничений robots.txt. Вот рабочий пример с mechanize:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# -*- coding: utf-8 -*-
#!/usr/bin/env python
 
import mechanize
import sys
 
browser = mechanize.Browser()
 
browser.set_handle_robots(False)
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.62 Safari/537.36')]
 
browser.open('http://ya.ru')
browser.select_form(nr=0)
 
browser['text'] = 'answer to the ultimate question of life, the universe, and everything'
 
browser.submit()
 
def filter_answers(link):
    attrs = link.attrs
    klass = None
    for attr in attrs:
        if attr[0] == 'class':
            klass = attr[1]
            break
 
    return klass and klass == 'b-serp-item__title-link'
 
for link in browser.links(predicate=filter_answers):
    print link.url
Кстати, у Yandex вроде есть XML API для поиска.
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
02.09.2013, 13:46  [ТС] 11
Цитата Сообщение от pashtet-kun Посмотреть сообщение
python 2.7.3, grab 0.4.8, lxml 2.3.6, pycurl-ssl-7.19.0.
переустановил полностью питон и граб несколько раз не помогло

может скините по емэйлу Вашу папку Python27? попробую просто заменить её в с вдруг заработает

Добавлено через 2 часа 20 минут
Цитата Сообщение от Nameless One Посмотреть сообщение
Твой пример скорее всего не работал из-за ограничений robots.txt.
что за ограничение за такое?) и как его обойти?) кстати я в самом начале спрашивал про защиту от роботов и её влияние на скрипты.

Спасибо за пример но не хочется учить еще одну библиотеку (во первых довольно долго + проблемы с установкой, во вторых у меня довольно много написано уже на грабе)
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
02.09.2013, 14:03 12
Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
что за ограничение за такое?) и как его обойти?) кстати я в самом начале спрашивал про защиту от роботов и её влияние на скрипты.
В файле robots.txt прописаны правила, которые позволяют ограничить доступ к частям сайта или к сайту целиком различным роботам (поисковым индексаторам, кравлерам и т.д.), в их число входит и питоновский urllib, на котором основам Mechanize. Чтобы обойти (игнорировать) robots.txt, нужно явно указать это Mechanize (строка 9). Как это делается на Grab — не знаю, гугл и документация в помощь.

Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
Спасибо за пример но не хочется учить еще одну библиотеку
Чего там учить-то?

Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
проблемы с установкой
Устанавливается одной строчкой из терминала:
Bash
1
$ sudo pip install mechanize
1
135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 399
02.09.2013, 22:48 13
судя по ошибке - проблема в модуле lxml

Добавлено через 16 минут
папку питон скинул
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
03.09.2013, 20:58  [ТС] 14
Цитата Сообщение от pashtet-kun Посмотреть сообщение
судя по ошибке - проблема в модуле lxml

Добавлено через 16 минут
папку питон скинул
Все работает благодаря Вашему архиву!) спасибо большое!!!

но теперь я вернулся к первоначальному вопросу: как нажать на кнопку если не известен её name?
вот код кнопки:
HTML5
1
2
</ul>
<b class="caret"/>
я уже реально все перепробывал эта кнопка открывает список со значениями из которых нужно одно выбрать. Я подозреваю что это из-за Джавы (ну я писал о своих подозрениях в самом начале этой темы)
если и тут подскажите то будет вобще супер

Добавлено через 2 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
В файле robots.txt прописаны правила, которые позволяют ограничить доступ к частям сайта или к сайту целиком различным роботам (поисковым индексаторам, кравлерам и т.д.), в их число входит и питоновский urllib, на котором основам Mechanize. Чтобы обойти (игнорировать) robots.txt, нужно явно указать это Mechanize (строка 9). Как это делается на Grab — не знаю, гугл и документация в помощь.
Спасибо за инфу начал читать но в основсном доки для разработчиков сервера мало где сказанно как обойти их клиенту

если с ГРАБ-ом не получится то придется механиз учить
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
03.09.2013, 21:02 15
Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
Я подозреваю что это из-за Джавы (ну я писал о своих подозрениях в самом начале этой темы)
Не из-за Джавы, а из-за Джаваскрипта (это разные языки).

Если там Javascript, то, как мне кажется, никакое стандартное решение для питона не подойдет. Нужно брать headless browser (типа phantom.js) и плясать уже от него.
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
03.09.2013, 22:42  [ТС] 16
Цитата Сообщение от Nameless One Посмотреть сообщение
Не из-за Джавы, а из-за Джаваскрипта (это разные языки).

Если там Javascript, то, как мне кажется, никакое стандартное решение для питона не подойдет. Нужно брать headless browser (типа phantom.js) и плясать уже от него.
для меня все эти java скрипты лес не то чтобы темный а вобще беспросветный но видимо таки придется учиться

всмысле с помощью браузера посмотреть исходные файлы и как-то подогнать программу под них? или прописать в проге значение агента для этого браузера?

кстати на некоторые кнопки на этом сайте таки получается нажимать но при этом выползает в отслеживании адресная строка сайта с окончанием "edit-ad/Check"

а в выходном файле при открытии выдает
Javascript
1
{"Errors":[60,193,195,61,62,64,65,67,54,55]}
вместо макета сайта

Добавлено через 1 час 28 минут
эмм.... почитал чучуть про фантом....

Вы, я так понял, предлогаете мне новый язык выучить? Оо
0
135 / 120 / 37
Регистрация: 30.09.2012
Сообщений: 399
03.09.2013, 22:51 17
вместо set_input(), который требует имя кнопки, можно попробовать использовать set_input_by_xpath(xpath, value),
- кнопку выберем по xpath (по названию класса) или set_input_by_number(number, value) - кнопку выберем по ее порядковому номеру в форме.
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
03.09.2013, 23:50  [ТС] 18
Цитата Сообщение от pashtet-kun Посмотреть сообщение
вместо set_input(), который требует имя кнопки, можно попробовать использовать set_input_by_xpath(xpath, value),
- кнопку выберем по xpath (по названию класса) или set_input_by_number(number, value) - кнопку выберем по ее порядковому номеру в форме.
пробовал уже только вот в номере элемента я не уверен но все-же вроде третий судя по порядку и фаербагу код :

Python
1
g.set_input_by_number(3,'260')
не выдает ошибки (тоесть форму вроде аполняет)
но стоит попробывать отправить её сабмитом как тут-же происходит то о чем я писал выше. тоесть ошибку не выдает но и не работает при этом и аутпут открывать не хочет

по xpath-у как только не пробывал всеравно не выходит (тут пример с другой кнопкой уже на этой-же форме)

Python
1
g.set_input_by_xpath('//div[@class="btn-group radio-list "]','3974')
и

Python
1
g.set_input_by_xpath('btn',3974)
и

Python
1
2
r=g.xpath('//button[@value="3974"]')
g.submit(submit_name=r)
0
Эксперт С++
5820 / 3472 / 357
Регистрация: 08.02.2010
Сообщений: 7,448
04.09.2013, 05:30 19
Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
всмысле с помощью браузера посмотреть исходные файлы и как-то подогнать программу под них? или прописать в проге значение агента для этого браузера?
Нет, с помощью этого браузера надо описать те шаги, которые ты выполняешь вручную в обычном браузере.

Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
кстати на некоторые кнопки на этом сайте таки получается нажимать но при этом выползает в отслеживании адресная строка сайта с окончанием "edit-ad/Check"
а в выходном файле при открытии выдает
Javascript
1
{"Errors":[60,193,195,61,62,64,65,67,54,55]}
вместо макета сайта
Мне всё больше и больше кажется, что мы имеем дело с джаваскриптом.

Гадать о возможных причинах можно долго, ты же не можешь дать внятный ответ. Кинь ссылку на страницу, тогда можно будет сказать точно.

Цитата Сообщение от Glebmanager@mai Посмотреть сообщение
Вы, я так понял, предлогаете мне новый язык выучить? Оо
Ну так ищи аналоги под Python, погуглить-то ты сам сможешь?
1
2 / 2 / 0
Регистрация: 08.02.2013
Сообщений: 52
04.09.2013, 13:16  [ТС] 20
Цитата Сообщение от Nameless One Посмотреть сообщение
Нет, с помощью этого браузера надо описать те шаги, которые ты выполняешь вручную в обычном браузере.



Мне всё больше и больше кажется, что мы имеем дело с джаваскриптом.

Гадать о возможных причинах можно долго, ты же не можешь дать внятный ответ. Кинь ссылку на страницу, тогда можно будет сказать точно.


Ну так ищи аналоги под Python, погуглить-то ты сам сможешь?
ссылку на сайт дать увы не могу. Мы ТОЧНО имеем дело с джава скиптом об этом я писал в самом начале. Чтобы проверить я даже в свое время открывал сайт с помощью оперы и отключал поддержки джаваскриптов как итог с сайта пропадали многие кнопки и функции

то что ты кинул больше похоже на язык программирования нежели на браузер внятной инструкции на русском опять таки нет. как на нем описывать шаги когда при передаче ссылки он выдает следующее:
undefined

Добавлено через 1 час 22 минуты
а понятно кажется начинаю разбираться в фантоме. блин придется еще и прогу скачивать для того чтобы хоть примеры открыть (расширение не стандартное) вот поэтому и не люблю учить лишние вещи
но в целом вроде прикольная штука

Добавлено через 3 минуты
хотя вроде в обчном блокноте открылось... странно что не определилось по умолчанию
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.09.2013, 13:16

Как нажать на кнопку на сайте?
я юзаю cURL я понимаю что посути надо вызвать функцию которую запускает кнопка? как найти эту...

Как нажать кнопку на сайте?
Ребята, срочно нужна помощь: как нажать кнопку на сайте? &lt;a...

Как нажать кнопку на сайте
Вот кусок кода от кнопки: &lt;div class=&quot;market_listing_right_cell market_listing_action_buttons&quot;&gt;...

Как программно нажать кнопку на сайте?
Добрый день. Есть необходимость написать программку которая будет вводить данные на определенный...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.