<p>你不能只使用Python。您需要一个JavaScript引擎API,比如<a href="http://phantomjs.org/" rel="nofollow">PhantomJS</a></p>
<p>使用Phantom,将非常容易地设置所有页面内容的web抓取,静态和动态JavaScript内容(如Ajax调用结果在您的情况下)。事实上,您可以像(这是一个节点.js+ 幻影.js示例)</p>
<pre><code>/*
* Register Page Handlers as functions
{
onLoadStarted : onLoadStarted,
onLoadFinished: onLoadFinished,
onError : onError,
onResourceRequested : onResourceRequested,
onResourceReceived : onResourceReceived,
onNavigationRequested : onNavigationRequested,
onResourceError : onResourceError
}
*/
registerHandlers : function(page, handlers) {
if(handlers.onLoadStarted) page.set('onLoadStarted',handlers.onLoadStarted)
if(handlers.onLoadFinished) page.set('onLoadFinished',handlers.onLoadFinished)
if(handlers.resourceError) page.set('onResourceError', handlers.resourceError)
if(handlers.onResourceRequested) page.set('onResourceRequested',handlers.onResourceRequested)
if(handlers.onResourceReceived) page.set('onResourceReceived',handlers.onResourceReceived)
if(handlers.onNavigationRequested) page.set('onNavigationRequested',handlers.onNavigationRequested)
if(handlers.onError) page.set('onError',handlers.onError)
}
</code></pre>
<p>此时,您可以完全控制正在进行的操作,以及在页面中何时需要下载,如:</p>
^{pr2}$
<p>如您所见,您可以定义页面处理程序并控制流以及加载到该页面上的资源。因此,在获取整个页面源之前,您可以确保所有数据都已准备好并设置好,例如:</p>
<pre><code>var Parser = {
parse : function(page) {
var onSuccess = function (page) { // page loaded
var pageContents=page.evaluate(function() {
return document.body.innerText;
});
}
var onError = function (page,elapsed) { // error
}
page.evaluate(function(func) {
return func(document);
}, function(dom) {
return true;
});
}
} // Parser
</code></pre>
<p>在这里您可以看到onSuccess回调中加载的整个页面内容:</p>
<pre><code>var pageContents=page.evaluate(function() {
return document.body.innerText;
});
</code></pre>
<p>该页面直接来自Phantomjs,如下代码片段所示:</p>
<pre><code>phantom.create(function (ph) {
ph.createPage(function (page) {
Parser.parse(page)
})
},options)
</code></pre>
<p>当然,这是给你和你的想法,你可以做什么节点.js+幻影,当结合在一起的时候是超级强大的。在</p>
<p>可以在Python环境中运行phantomjs,将其称为</p>
<pre><code>try:
output = ''
for result in runProcess([self.runProcess,
self.runScript,
self.jobId,
self.protocol,
self.hostname,
self.queryString]):
output += '' + result
print output
except Exception as e:
print e
print(traceback.format_exc())
</code></pre>
<p>使用子进程Popen执行二进制文件的位置:</p>
<pre><code>def runProcess(exe):
p = subprocess.Popen(exe, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
while(True):
retcode = p.poll() #returns None while subprocess is running
line = p.stdout.readline()
yield line
if(retcode is not None):
break
</code></pre>
<p>当然,要运行的过程是节点.js在这种情况下</p>
<pre><code>self.runProcess='node'
</code></pre>
<p>用你需要的参数作为参数。在</p>