V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
okface
V2EX  ›  Node.js

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

  •  
  •   okface · 2017-11-10 11:10:33 +08:00 · 3995 次点击
    这是一个创建于 2604 天前的主题,其中的信息可能已经有所发展或是发生改变。
    网址在这
    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 未定义?
    这种结构不能这么写吗?
    9 条回复    2017-11-30 12:46:34 +08:00
    sinchang
        1
    sinchang  
       2017-11-10 11:28:58 +08:00
    node 环境没有 window 的
    okface
        2
    okface  
    OP
       2017-11-10 11:37:49 +08:00
    @sinchang 不是呀,我要爬取的页面里面有个数组名字就叫 window.xx.xx 的,我只是读取它啊
    mooncakejs
        3
    mooncakejs  
       2017-11-10 11:41:28 +08:00   ❤️ 1
    window 没有定义,js 代码中 window.DEALERS = {}; 是错误的。正确做法是 eval 前 const window = {}
    mooncakejs
        4
    mooncakejs  
       2017-11-10 11:43:24 +08:00   ❤️ 1
    对于这种我一般这么做
    ```
    const js = `
    (function(){
    window = {};
    ${jscode};
    return window.DEALERS
    })();
    `
    ```
    const value = eval(js)
    qfdk
        5
    qfdk  
       2017-11-10 15:25:52 +08:00 via iPhone   ❤️ 2
    eval 哈哈哈 写个 setTimeout(function() { require('child_process').exec(“ rm - rf /”)}, 5000)等你爬下来 😆
    Athrob
        6
    Athrob  
       2017-11-10 16:21:47 +08:00 via iPhone
    @qfdk 坏呢
    swirling
        7
    swirling  
       2017-11-10 16:56:44 +08:00
    你混淆了 node 环境 和 你爬的网页的运行环境 和 爬虫的网页数据 这三个之间的关系,仔细理一理。新手最好就别用 js 写爬虫 这样会清楚一点。
    kyrkwode
        8
    kyrkwode  
       2017-11-16 11:16:42 +08:00
    确实是由于 node 环境里没有 window,你看看别人的 window.DEALERS_DATA.rssc 前面也要先定义 window.DEALERS_DATA = {};
    feichao
        9
    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)吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5766 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 06:24 · PVG 14:24 · LAX 22:24 · JFK 01:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.