Механизировать и Javascript - PullRequest
26 голосов
/ 26 апреля 2011

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

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

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

Ответы [ 5 ]

24 голосов
/ 26 апреля 2011

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

Это полнофункциональный веб-браузер, такой как Safari или Chrome, но в нем нет скриптов и скриптов. Вы пишете это с помощью JavaScript, а не Python (насколько я знаю, по крайней мере).

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

16 голосов
/ 26 апреля 2011

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

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

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

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

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

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

6 голосов
/ 13 мая 2011

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

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

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

4 голосов
/ 04 октября 2015

Вы можете использовать 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)), чтобы посмотреть, что доступно.

3 голосов
/ 08 декабря 2012

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

https://github.com/buffer/thug

Это должно быть довольно легко сделать так, чтобы он работал вместе с Mechanize.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...