Механизация и Javascript

Я хочу использовать Mechanize для имитации просмотра веб-страницы с активным JavaScript, включая события DOM и AJAX, и пока я не нашел способа сделать это.

Я посмотрел на некоторые клиентские браузеры Python, которые поддерживают JavaScript, такие как Spynner и Zope, и ни один из них мне не подходит. Spynner постоянно крашит PyQt, а Zope не поддерживает JavaScript, как кажется.

Есть ли способ имитировать просмотр только с помощью Python (без дополнительных процессов), таких как WATIR или библиотеки, которые управляют Firefox или Internet Explorer, при этом полностью поддерживая Javascript, как если бы они действительно просматривали страницу?


person Jeff Klip    schedule 26.04.2011    source источник
comment
Тестовый браузер Zope (построенный на chanize) никогда не заявлял о поддержке JavaScript; где вы прочитали, что может?   -  person Martijn Pieters    schedule 26.04.2011
comment
Не могли бы вы объяснить проблему, которую вы пытаетесь решить? Возможно, вам все-таки не нужен включенный JavaScript.   -  person Jordan    schedule 26.04.2011
comment
Расскажите нам, что вы пытаетесь сделать, и мы скажем вам, если мы можем вам помочь!   -  person jathanism    schedule 26.04.2011
comment
Я пытаюсь имитировать просмотр, используя строго python. Я не могу использовать что-либо еще, потому что мне нужно использовать некоторые специальные настройки и хуки, которые я могу (в настоящее время) делать только в python. Я даже готов приложить усилия и попытаться соединить Mechanize и PyV8, но понятия не имею, с чего начать... Кто-нибудь когда-нибудь делал что-то подобное раньше?   -  person Jeff Klip    schedule 28.04.2011


Ответы (5)


Я играл с этой новой альтернативой Mechanize (которая мне нравится) под названием Phantom JS.

Это полноценный веб-браузер, такой как Safari или Chrome, но без заголовка и с поддержкой сценариев. Вы пишете его с помощью javascript, а не python (насколько я знаю, по крайней мере).

Есть несколько примеров сценариев, с которых можно начать. Это очень похоже на использование Firebug. Я потратил всего несколько минут на его использование, но обнаружил, что с самого начала был довольно продуктивным.

person newz2000    schedule 26.04.2011
comment
Хороший инструмент! С какой стати люди минусуют без объяснения причин? - person Antony Hatchkins; 01.02.2012
comment
Это потому, что 1) это инструмент Javascript, когда вопрос явно запрашивает инструмент Python, и 2) манипулирование этим инструментом через JS API из Python было бы в лучшем случае хакерским PITA. - person Cerin; 23.05.2012
comment
+1 Я думаю, что phnatomjs — это то, что нужно, а JavaScript — это язык веб-сайтов. - person Anurag Uniyal; 27.10.2012
comment
Действительно ли PhantomJS запускает javascript на загружаемых страницах? (В отличие от javascript в сценарии phantomjs.) Я думаю, что да, но трудно сказать наверняка. - person LarsH; 29.08.2014
comment
Да, PhantomJS запускает страницу так же, как обычный веб-браузер, но без пользовательского интерфейса. - person newz2000; 03.09.2014

Из http://wwwsearch.sourceforge.net/mechanize/faq.html#general

Если вы столкнетесь с этим на странице, которую хотите автоматизировать, у вас есть четыре варианта. Вот они, примерно в порядке простоты.

Выясните, что делает JavaScript, и эмулируйте его в своем коде Python: например, вручную добавляя файлы cookie в ваш экземпляр CookieJar, вызывая методы в HTMLForms, вызывая urlopen и т. д. См. выше формы.

Используйте HtmlUnit из Java или HttpUnit из Jython, поскольку они немного знают JavaScript.

Вместо того, чтобы использовать механизацию, автоматизируйте браузер. Например, используйте MS Internet Explorer через интерфейсы автоматизации COM, используя расширения Python для Windows, также известные как pywin32, также известные как win32all (например, простая функция, pamie; глава о pywin32 из книги O’Reilly) или ctypes (пример). Подобные вещи также могут пригодиться в Windows в случаях, когда отсутствует API автоматизации. Для Firefox есть PyXPCOM.

Будьте амбициозны и автоматически делегируйте работу соответствующему интерпретатору (например, интерпретатору JavaScript от Mozilla). Это то, что делают HtmlUnit и httpunit. Я сделал всплеск в этом направлении несколько лет назад, но я думаю, что (все еще) будет довольно много работы, чтобы сделать это хорошо.

person Jordan    schedule 26.04.2011
comment
Варианты №1 и №3 полностью написаны на Python. - person Jordan; 27.04.2011
comment
№ 1 — это действительно Python, и это может быть то, с чем мне придется столкнуться, но мне также интересно, как я могу обобщить этот процесс в будущем. № 3 действительно использует COM и IE... - person Jeff Klip; 28.04.2011
comment
@Джефф, почему возникают проблемы с использованием безголового браузера или браузера-автомата? - person Jordan; 28.04.2011

По сути, если вы хотите что-то, что связано с javascript, вам нужен настоящий движок javascript, который неизменно включает автоматизацию реального браузера (я включаю в это безголовые).

HtmlUnit в Java работает не очень хорошо, поскольку не использует движок javascript из реального браузера. Phantom JS звучит идеально (как указывает newz2000), однако я обнаружил, что при манипулировании страницами с помощью javascript может быть очень сложно отладить ваш скрипт, если вы на самом деле не видите страницу, с которой имеете дело.

Это приводит к таким решениям, как Selenium Webdriver, который имеет полный API-интерфейс Python для автоматизации различных браузеров, однако вы должны запустить java jar, и он фактически запускает браузер, поэтому это не чистое решение Python, которое вам нужно (но я думаю, что это как близко, как вы можете получить).

person cerberos    schedule 13.05.2011
comment
Я использовал Selenium для автоматизации Firefox через Python API. Это немного глючит, но в целом работает и, вероятно, является лучшим решением, которое я видел. - person Cerin; 23.05.2012
comment
Я тоже прибегал к Selenium, чтобы автоматизировать просмотр веб-страниц для проекта, где требовался запуск Javascript. Для локальной разработки я использовал chromedirver, а для производства использовал Selenium Server. документы по связыванию Selenium Python весьма полезны. - person Dave Crumbacher; 03.08.2012

Вы можете использовать Selenium с Python. Затем вы можете очищать содержимое, созданное с помощью JavaScript, а также манипулировать страницей с помощью дополнительного JavaScript (а также Python).

# In your virtualenv: pip install selenium
from selenium import webdriver

# Launch Firefox GUI
browser = webdriver.Firefox()

# Alternatively, you can drive PhantomJS without a GUI
# With Node.js installed: `npm install -g phantomjs`
# browser = webdriver.PhantomJS()

# Fetch a webpage
browser.get('http://example.com')

# If you need the whole HTML document
# just like inspecting the rendered page with the console
html = browser.page_source

# Get an element, even if it was created with JS
button = browser.find_element_by_css_selector('div.some-class > \
                                               input.the-submit-button')

# Click on something
button.click()

# Execute some JavaScript (assumes jQuery is loaded on the page)
browser.execute_script("$('html, body').animate({ scrollTop: 500 }, 50);")

Вы можете запустить код в Python REPL и использовать автозаполнение, чтобы обнаружить методы, доступные для browser или любого другого элемента, который вы выбрали. Или сделайте что-нибудь вроде print(dir(browser)), чтобы увидеть, что доступно.

person R891    schedule 03.10.2015

Пример использования PyV8 для запуска JS в DOM с помощью python можно найти здесь:

https://github.com/buffer/thug

Это должно быть довольно легко заставить его работать вместе с механизировать.

person Michael    schedule 08.12.2012