如何从 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/