Подтвердить что ты не робот

Механизм и Javascript

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

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

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

4b9b3361

Ответ 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)), чтобы увидеть, что доступно.