Phantomjs禁用页面中的JavaScript,但启用包含的JavaScript

时间:2015-06-07 11:19:06

标签: javascript phantomjs

我正在使用phantomjs从页面检索CSS信息而不执行其javascript。例如,这里是代码段。

val lines = sc.textFile("s3://{bucket}/whatever/2015/05/*.*")
  //add the map
  .map(line => line.replaceAll("\",\"", ";"))
  .map(_.split(","))
  .map(p=> zahiro(p(0),p(1),p(2),p(3),p(4),p(5),p(6),p(7)))

如果我禁用了javascript,则evaluate函数始终返回null。但是当我尝试启用javascript时,evaluate函数将返回一些值。是否有任何想法禁用页面中的JavaScript,但我包含的JavaScript必须工作?

2 个答案:

答案 0 :(得分:4)

page.evaluate()在页面上执行JavaScript。如果您在PhantomJS中禁用JavaScript,那么您实际上无法再使用page.evaluate()了。随之而来的是访问DOM元素的各种方式。 page.includeJs()也不起作用,因为脚本无法在页面上执行。

您仍然可以访问page.content,它可以访问当前页面源(计算源)。您可以尝试使用某些DOM库将源解析为DOM对象 1 ,或者如果任务很简单,您可以尝试使用正则表达式。

1 请注意,PhantomJS和node.js具有不同的执行环境,因此大多数处理DOM的node.js模块都无法工作

答案 1 :(得分:1)

作为suggested by Artjom,没有禁用PhantomJS在页面上执行JavaScript的能力,就无法禁用目标网站JavaScript的执行。但是,有一种简单的方法可以确保目标网站不会执行任何脚本(最终会获得相同的结果)。

  1. 创建一个拦截所有请求的HTTP代理。
  2. 使用Content-Type: text/html检测回复。
  3. 从文档中删除所有<script>标记。
  4. 您可以使用配置--proxy configuration以使用代理。

    使用http-proxy创建代理服务器。

    使用cheerio删除,注释或以其他方式使<script>代码无效。