gpt4 book ai didi

python - 如何使用Python解析网页[html]上的Java脚本包含[动态]?

转载 作者:行者123 更新时间:2023-12-01 06:11:19 29 4
gpt4 key购买 nike

我正在构建一个蜘蛛,并使用 Beautiful soup 来解析特定 URL 的包含内容。现在,一些网站正在使用 JavaScript 来显示动态内容,一旦发生某些操作 [点击或时间],就会向用户显示动态内容。Beautiful soup 只是解析 java 脚本标签运行之前的静态包含。我想要在java脚本运行后包含。有什么办法可以做到这一点吗?

我可以想到一种方法:获取 url,打开浏览器并运行该 URL 和 java 脚本标签。然后将此 url 传递给 Beautiful soup,它可以看到包含哪些 java-script[dynamic contains] 生成的内容。但是,如果我抓取数百万个链接,那么这个解决方案就没用了。如果有一些可用的内置模块可以预先生成 Html 页面的动态包含。

最佳答案

准确解析网页中 Javascript 增强内容的最佳选择是通过浏览器引擎加载页面。幸运的是,有一些方法可以在 Python 中自动执行此操作。

我最成功的方法是使用 pywebkitgtk project它允许您在 Python 应用程序中以编程方式创建和控制 Webkit 浏览器引擎的实例。我还使用jswebkit module简化页面上下文中 Javascript 的执行。

另一个选项是 PyQt4's QtWebKit class我仅用于实验。

这是一个使用 pywebkitgtk 和 jswebkit 一起从 Webkit 渲染的页面中提取数据的工作示例。在生产环境中,您需要并行运行多个这样的处理器,每个处理器渲染到它自己的 X virtual framebuffer (Xvfb) 实例。 .

import os

import gtk
import jswebkit
import lxml.html
import pygtk
import webkit

def load_finished(view, frame):
# called when the document finishes loading
if frame != view.get_main_frame():
return
ctx = jswebkit.JSContext(frame.get_global_context())
res = ctx.EvaluateScript('window.location.href')
print res
res = ctx.EvaluateScript('document.body.innerHTML')
tree = lxml.html.fromstring(res)
print tree.xpath('//input[@type="submit"]')

# initialization
pygtk.require20()
gtk.gdk.threads_init()

# create the webview and hook up callbacks to signals
view = webkit.WebView()
view.set_size_request(1024, 768)
view.connect('load-finished', load_finished)

# configure the webview
props = view.get_settings()
props.set_property('enable-java-applet', False)
props.set_property('enable-plugins', False)
props.set_property('enable-page-cache', False)

# create a window to host the webview
win = gtk.Window()
win.add(view)
win.show_all()

# open google front page
view.open('http://www.google.com')

# spin, processing gtk events
while True:
try:
while gtk.events_pending():
gtk.main_iteration(False)
except KeyboardInterrupt:
break

示例输出:

http://www.google.com/
[<InputElement 2a64a78 name='btnG' type='submit'>, <InputElement 2a64bb0 name='btnG' type='submit'>, <InputElement 2a64ae0 name='btnI' type='submit'>]

关于python - 如何使用Python解析网页[html]上的Java脚本包含[动态]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5738024/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com