【发布时间】:2016-02-06 13:58:32
【问题描述】:
如何从 JavaScript 呈现的网页上的链接下载? Python 是首选语言。
到目前为止,我已经尝试在无头服务器上使用Python bindings for Selenium。这种方法非常缓慢,充满错误,并且无法可靠地确定下载进度或成功。此外,无头服务器干扰了我的剪贴板(这是一个问题)。我使用 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')
如果不是因为我需要下载在同一个会话中,这将是很棒的。有没有办法保留用于呈现页面的会话? 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 中执行它。真是恶心的东西……
有什么方法可以安全地呈现网页并保持会话?
如果 Python 不合适或 JavaScript 替代方案更优雅,我也愿意完全在节点中完成它。看起来node-dom 可能就足够了?我对它还不是很熟悉,但我对任何建议都很感兴趣。
【问题讨论】:
-
也许您可以使用 Chrome 中的“开发人员工具”来分析浏览器和服务器之间的流量,以找到 javascript 用于从服务器获取数据的 url。然后你可以在 Python 脚本中使用这个 url 而无需渲染页面。
-
btw:添加网页网址以获得更好的答案。
-
URL 是通过嵌入式 JS 在浏览器客户端确定的,例如
<script type="text/javascript">.*</script>并且不与服务器交互。因此,接受页面的 HTML 源代码并返回呈现的源代码(如 WebKit)的工具将是完美的。也许我会看看我是否可以让 WebKit 接受页面源而不是页面 URL...
标签: javascript python node.js web-scraping