Механизм и Javascript
Я хочу использовать Mechanize для имитации просмотра на веб-странице с активным JavaScript, включая DOM Events и AJAX, и до сих пор я не нашел способа сделать это.
Я посмотрел на некоторые клиентские браузеры Python, которые поддерживают JavaScript, такие как Spynner и Zope, и никто из них действительно не работает для меня. Spynner все время терпит крах PyQt, и Zope не поддерживает JavaScript, как кажется.
Есть ли способ имитировать просмотр только с помощью Python, никаких дополнительных процессов, таких как WATIR или библиотеки, которые управляют Firefox или Internet Explorer, при полной поддержке Javascript, как будто на самом деле просматривает страницу?
Ответы
Ответ 1
Я играл с этой новой альтернативой Mechanize (которой я люблю), называемой Phantom JS.
Это полный браузер веб-комплекта, такой как Safari или Chrome, но безголовый и сценарий. Вы script с javascript, а не с python (насколько я знаю, по крайней мере).
Есть несколько примеров сценариев, которые помогут вам начать работу. Это очень похоже на использование Firebug. Я потратил несколько минут на это, но обнаружил, что с самого начала я был достаточно продуктивным.
Ответ 2
Из http://wwwsearch.sourceforge.net/mechanize/faq.html#general
Если вы столкнетесь с этим на странице, которую хотите автоматизировать, у вас есть четыре варианта. Здесь они примерно в порядке простоты.
Посмотрите, что делает JavaScript, и эмулируйте его в коде Python: например, вручную добавляя файлы cookie в ваш экземпляр CookieJar, вызывая методы в HTMLForms, вызывая urlopen и т.д. См. выше re forms.
Использовать Javas HtmlUnit или HttpUnit из Jython, поскольку они знают какой-то JavaScript.
Вместо использования механизации вместо этого автоматизируйте браузер. Например, используйте MS Internet Explorer через свои интерфейсы автоматизации COM, используя расширения Python для Windows, aka pywin32, aka win32all (например, простая функция, pamie; глава pywin32 из книги OReilly) или ctypes (пример). Подобные вещи также могут оказаться полезными в Windows для случаев, когда API автоматизации отсутствует. Для Firefox есть PyXPCOM.
Получите амбициозность и автоматически делегируйте работу соответствующему интерпретатору (например, интерпретатор Mozillas JavaScript). Это то, что делают HtmlUnit и httpunit. Я сделал шип вдоль этих строк несколько лет назад, но я думаю, что (все же) будет довольно много работы, чтобы преуспеть.
Ответ 3
В принципе, если вы хотите что-то, что связано с javascript, тогда вам нужен настоящий механизм javascript, это неизбежно включает автоматизацию реального браузера (я включаю в него безголовые).
Javas HtmlUnit не делает очень хорошую работу, так как не использует механизм javascript из реального браузера. Phantom JS звучит идеально (как отмечает newz2000), однако я считаю, что при манипулировании страницами с javascript может быть очень сложно отладить ваш script, если вы не можете увидеть страницу, с которой имеете дело.
Это приводит к таким решениям, как Selenium Webdriver, который имеет полный API-интерфейс python для автоматизации различных браузеров, однако вы должны запускать java-банку, и на самом деле запускает браузер, так что не чистое решение python, за которым вы после (но я думаю это как можно ближе).
Ответ 4
Пример использования PyV8 для запуска JS на DOM с помощью python можно найти здесь:
https://github.com/buffer/thug
Это должно быть довольно легко заставить его работать вместе с mechanize.
Ответ 5
Вы можете использовать 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);")
Вы можете запустить код в REPL Python и использовать автозаполнение, чтобы обнаружить доступные методы browser
или любой другой элемент, который вы выбрали. Или сделайте что-нибудь вроде print(dir(browser))
, чтобы увидеть, что доступно.