javascript - 如何从 JavaScript 渲染的网页下载?

标签 javascript python node.js web-scraping

如何从 JavaScript 呈现的网页上的链接进行下载? Python 是首选语言。

到目前为止,我已经尝试使用 Python bindings for Selenium在 headless 服务器上。这种方法非常慢,充满错误,并且无法可靠地确定下载进度或成功。此外, headless 服务器会干扰我的剪贴板(这是一个问题)。我使用 Firefox,因为它可以配置为下载到默认目录,但我认为 Chrome 的情况也没有更好。

或者,我尝试使用 WebKit。

def render(url):
    """Fully render a webpage (JavaScript and all) and return the HTML."""

    import subprocess
    from textwrap import dedent

    script = dedent("""\
    import sys
    from PyQt4.QtCore import QUrl
    from PyQt4.QtGui import QApplication
    from PyQt4.QtWebKit import QWebPage

    class Render(QWebPage):

        def __init__(self, url):
            self.app = QApplication(sys.argv)
            QWebPage.__init__(self)
            self.loadFinished.connect(self._loadFinished)
            self.mainFrame().load(QUrl(url))
            self.app.exec_()

        def _loadFinished(self, result):
            self.frame = self.mainFrame()
            self.app.quit()

    render = Render(sys.argv[1])
    print render.frame.toHtml().toAscii()""").encode()

    process = subprocess.Popen(['python2', '-', url],
                               stderr=subprocess.PIPE,
                               stdin=subprocess.PIPE,
                               stdout=subprocess.PIPE)

    # pipe script into Python's stdin
    return process.communicate(script)[0].decode('latin1')

如果不是因为我需要在同一 session 中进行下载,那就太好了。有什么方法可以保留用于渲染页面的 session 吗? PyQt4 和 WebKit 只是一堆共享库。我不知道如何撕碎他们的内脏,也不知道这样的事情是否可能。

现在我只是做以下事情:

with requests.Session() as session:
    html = session.get(url).text
    link = get_url(html)
    download(link, session=session)

无需深入了解细节,get_url(html, url) 只是从页面中提取 JavaScript,消除对 DOM 的任何调用,然后在 node 中执行它。真是恶心的东西...

有什么方法可以安全地渲染网页并保持 session ?

如果 Python 不合适或者 JavaScript 替代方案更优雅,我也愿意完全在 Node 中完成此操作。看起来也许 node-dom可能就足够了?我对它还不太熟悉,无法判断,但我对任何建议都很感兴趣。

最佳答案

如果直接命令行选项适合您而不是通过 Python 和/或 Selenium,Google Chrome 可以在 headless 模式下运行。它将在转储 DOM 之前完成所有 JavaScript 渲染。

/usr/local/bin/google-chrome \
  --headless \
  --virtual-time-budget=10000 \
  --timeout=10000 \
  --run-all-compositor-stages-before-draw \
  --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36" \
  --disable-gpu \
  --dump-dom "https://example.com/index.html" > rendered.html

关于javascript - 如何从 JavaScript 渲染的网页下载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35241872/

相关文章:

node.js - 使用 `@zeit/ncc`将Node.js(github Action )编译为单个文件

javascript - 如何使用 Greasemonkey 选择没有标识符的 div?

python - Pandas Groupby 值范围

python - 一段时间后 Discord api websocket 网关连接断开

python - 如何验证pandas.read_csv读取的csv数据?

javascript - 您可以使用 browserify 来请求 node-bcrypt 客户端,然后将哈希发送到服务器吗?

javascript - Mongoose 保存空数组

javascript - 限制div中的字符数具有特定类

javascript - 为 TestBed 提供 "entryComponents"

javascript - AngularJS 自定义指令访问范围数据