使用 Scrapy 获取 JavaScript 函数的参数

Posted

技术标签:

【中文标题】使用 Scrapy 获取 JavaScript 函数的参数【英文标题】:Get the parameters of a JavaScript function with Scrapy 【发布时间】:2014-03-27 12:22:41 【问题描述】:

我想知道是否可以使用 Scrapy 从类似于此的代码中提取 javascript 函数的参数:

<script type="text/javascript">
    var map;
  function initialize() 
    var fenway = new google.maps.LatLng(43.2640611,2.9388228);
  ;

</script>

我想提取坐标43.26406112.9388228

【问题讨论】:

“提取”是什么意思。您可以定义var lat=43.26, lng=2.93 并将其传递给方法吗? @AamirAfridi OP的意思是-使用Python爬虫引擎Scrapy进行提取。 【参考方案1】:

这就是re() 方法的用武之地。

这个想法是通过xpath()定位script标签,并使用re()script标签的内容中提取latlng。来自scrapy shell的演示:

$ scrapy shell index.html
>>> response.xpath('//script').re(r'new google\.maps\.LatLng\(([0-9.]+),([0-9.]+)\);')
[u'43.2640611', u'2.9388228']

其中index.html 包含:

<script type="text/javascript">
    var map;
  function initialize() 
    var fenway = new google.maps.LatLng(43.2640611,2.9388228);
  ;

</script>

当然,在你的情况下,xpath 不仅仅是//script

仅供参考,new google\.maps\.LatLng\(([0-9.]+),([0-9.]+)\); 正则表达式使用saving groups ([0-9.]+) 来提取坐标值。

另见Using selectors with regular expressions。

【讨论】:

【参考方案2】:

免责声明:我没有尝试过这种方法,但是如果我被限制使用 Scrapy 并且不想按照 alecxe 上面建议的方式解析 JavaScript,我会这样想。这是一个挑剔、脆弱的 hack :-)

您可以尝试使用scrapyjs 从您的scrapy 爬虫执行JavaScript 代码。为了捕获这些参数,您需要执行以下操作:

    加载原始页面并将其保存到磁盘。 修改页面以将 google.maps.LatLng 函数替换为您自己的函数(见下文)。确保在加载 google js 后运行您的脚本。 使用scrapyjs(或它创建的webkit实例)加载修改后的页面 解析页面,查找由您的虚假 LatLng 函数创建的两个特殊 div,其中包含提取的 lat 和 lng 变量。

关于第 2 步的更多信息:让您的虚假 LatLng 函数修改 HTML 页面以公开 lat 和 lng 变量,以便您可以使用 Scrapy 解析它们。下面是一些粗略的代码来说明:

var LatLng = function LatLng(lat, lng) 
  var latDiv = document.createElement("div");
  latDiv.id = "extractedLat";
  latDiv.innerHtml = lat;
  document.body.appendChild(latDiv);

  var lngDiv = document.createElement("div");
  lngDiv.id = "extractedLng";
  lngDiv.innerHtml = lng;
  document.body.appendChild(lngDiv);


google = 
  map: 
    LatLng: LatLng
  
;

总的来说,这种方法听起来有点痛苦,但尝试起来会很有趣。

【讨论】:

以上是关于使用 Scrapy 获取 JavaScript 函数的参数的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想(156):使用Scrapy抓取天气预报数据

Python爬虫编程思想(156):使用Scrapy抓取天气预报数据

Python爬虫编程思想(156):使用Scrapy抓取天气预报数据

在python中使用scrapy执行Javascript提交表单函数

在 Scrapy 响应中执行内联 JavaScript

如何使用scrapy中的CrawlSpider单击带有javascript onclick的链接?