使用 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.2640611
和2.9388228
。
【问题讨论】:
“提取”是什么意思。您可以定义var lat=43.26, lng=2.93
并将其传递给方法吗?
@AamirAfridi OP的意思是-使用Python爬虫引擎Scrapy进行提取。
【参考方案1】:
这就是re()
方法的用武之地。
这个想法是通过xpath()
定位script
标签,并使用re()
从script
标签的内容中提取lat
和lng
。来自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抓取天气预报数据