初学者求问爬虫解析斯柯达 4S 店的问题

2017-11-10 11:10:33 +08:00
 okface
网址在这
http://www.skoda.com.cn/assets/js/apps/dealerdata.js

我用 http 获取到 data,然后用 eval。
var http=require('http');
http.get('http://www.skoda.com.cn/assets/js/apps/dealerdata.js',function(req,res){
var html='';
req.on('data',function(data){
html+=data;
});
req.on('end',function(){
eval(html);

为了方便,我用 var District = window.DEALERS_DATA.dealer.data;
但是后面写 for 循环的时候一直提示我 window 未定义?
这种结构不能这么写吗?
3988 次点击
所在节点    Node.js
9 条回复
sinchang
2017-11-10 11:28:58 +08:00
node 环境没有 window 的
okface
2017-11-10 11:37:49 +08:00
@sinchang 不是呀,我要爬取的页面里面有个数组名字就叫 window.xx.xx 的,我只是读取它啊
mooncakejs
2017-11-10 11:41:28 +08:00
window 没有定义,js 代码中 window.DEALERS = {}; 是错误的。正确做法是 eval 前 const window = {}
mooncakejs
2017-11-10 11:43:24 +08:00
对于这种我一般这么做
```
const js = `
(function(){
window = {};
${jscode};
return window.DEALERS
})();
`
```
const value = eval(js)
qfdk
2017-11-10 15:25:52 +08:00
eval 哈哈哈 写个 setTimeout(function() { require('child_process').exec(“ rm - rf /”)}, 5000)等你爬下来 😆
Athrob
2017-11-10 16:21:47 +08:00
@qfdk 坏呢
swirling
2017-11-10 16:56:44 +08:00
你混淆了 node 环境 和 你爬的网页的运行环境 和 爬虫的网页数据 这三个之间的关系,仔细理一理。新手最好就别用 js 写爬虫 这样会清楚一点。
kyrkwode
2017-11-16 11:16:42 +08:00
确实是由于 node 环境里没有 window,你看看别人的 window.DEALERS_DATA.rssc 前面也要先定义 window.DEALERS_DATA = {};
feichao
2017-11-30 12:46:34 +08:00
Node 标准库里面有个`vm`的库, 构建一个沙盒然后去跑下载下来的 JS 代码比较好. 构建沙盒的时候你可以先定义下`window`对象, 这样应该就不会报错了. 先看一下[vm 的文档]( https://nodejs.org/dist/latest-v9.x/docs/api/vm.html)吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/405211

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX