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

casperjs 不能操作导入的数据?

  •  
  •   evenIfAlsoGo · 2018-03-26 22:46:04 +08:00 · 4045 次点击
    这是一个创建于 2433 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我用 fs 读取一个 json,里面存的网址数据,一直没找到操作 json 的途径。 官网找到一个 each() 方法,可以读取数组,但是数组放在外部通过 fs 读取就又用不了了! 是这个工具本事就不适合导入数据,还是我 fs 没用好?

    19 条回复    2018-03-28 22:03:37 +08:00
    evenIfAlsoGo
        1
    evenIfAlsoGo  
    OP
       2018-03-26 22:54:45 +08:00
    忘记加“请问”了,不好意思:

    请问是这个工具本事就不适合导入数据,还是我 fs 没用好?
    murmur
        2
    murmur  
       2018-03-26 22:59:20 +08:00
    casperjs 也是 phantom 吧 直接注入个外部 js 就可以了 不要写成 json 格式 json 数据直接给到一个全局变量上就可以
    evenIfAlsoGo
        3
    evenIfAlsoGo  
    OP
       2018-03-26 23:01:04 +08:00 via Android
    @murmur 对的,casper 是基于 phantom 的。我去试试~!
    murmur
        4
    murmur  
       2018-03-26 23:01:18 +08:00
    忘了问你的作用域了 如果是 page 里需要注入 js 如果是在外面 不是有个 node 环境么
    evenIfAlsoGo
        5
    evenIfAlsoGo  
    OP
       2018-03-26 23:10:59 +08:00 via Android
    @murmur 我是想将数据作为参数赋值给 capser 的方法。我试过写一个页面,把数据绑定到 dom 节点,开启本地服务器,再用 casper 访问这个网页,但是没有成功,获取不到数据。
    POPOEVER
        6
    POPOEVER  
       2018-03-26 23:14:21 +08:00
    我都是直接读啊,难道你不行吗?

    ```javascript
    fs.readFile('json/sources.json', 'utf8', (err, data) => {
    if (err) throw err
    SOURCES = JSON.parse(data)
    })
    ```
    POPOEVER
        7
    POPOEVER  
       2018-03-26 23:15:08 +08:00
    咦,不是吃 MD 吗

    ```
    fs.readFile('json/sources.json', 'utf8', (err, data) => {
    if (err) throw err
    SOURCES = JSON.parse(data)
    })
    ```
    evenIfAlsoGo
        8
    evenIfAlsoGo  
    OP
       2018-03-26 23:16:35 +08:00 via Android
    @murmur 我用 node xx.js 不可以运行,因为这方面不太熟,不知道该怎么在这个库外面运行 node 环境。。 我还写一个 js,然后想用 js 来解析 json,再调用写了 casper 的 js...这些问题不知道该查什么资料学习...
    evenIfAlsoGo
        9
    evenIfAlsoGo  
    OP
       2018-03-26 23:19:08 +08:00 via Android
    @POPOEVER 没事没事 能看明白~我用的是
    fs.read(filePath),会不会是我 fs 方法没调用对。。
    POPOEVER
        10
    POPOEVER  
       2018-03-27 00:32:38 +08:00
    嗯,fs.read(fd) 里面不是传路径的,fd 是文件的描述符, 要先通过 fs.open 设置,而且 fs.read() 主要是用来灵活滴读取文件数据,要读取整个文件直接用 fs.readFile(),如果需要同步版本 fs.readFileSync()。

    P.S: 文档是好帮手
    evenIfAlsoGo
        11
    evenIfAlsoGo  
    OP
       2018-03-27 08:35:22 +08:00 via Android
    @POPOEVER 会提示 Unexpected token > 可能这个库真的不支持。。 忘记 fs 模块文档了...只查库文档...谢谢~
    evenIfAlsoGo
        12
    evenIfAlsoGo  
    OP
       2018-03-27 10:08:17 +08:00 via Android
    @POPOEVER @murmur 感谢,问题已经解决。我更换了库:使用谷歌官方的封装库 puppeteer,不但 json 问题迎刃而解,而且在开启本地服务器后,也能获取数据了!
    POPOEVER
        13
    POPOEVER  
       2018-03-27 20:20:14 +08:00
    @evenIfAlsoGo 你的 fs 是 require('fs') 的吗?还是你 require 的第三方库? fs 是 node 默认的库,应该不会有你说的那种报错吧。你要用到 puppeteer 是要跑单元测试还是其他特殊操作,比如截屏?因为他毕竟要跑一个浏览器实例起来,个人觉得在服务器端跑一个 headless Chrome 如果只为了读页面文档结构的话还不如 axio 把页面 data chunk 拿回来直接 cheerio.js 分析文档树了,我自己写爬虫就是这么干的
    evenIfAlsoGo
        14
    evenIfAlsoGo  
    OP
       2018-03-28 09:46:33 +08:00 via Android
    @POPOEVER 用的是默认的 fs 库。我只是读取一个 dom 节获取 exe 下载链接。用 puppetter 的时候我还引入一个第三方库 download,因为用 goto(下载链接) 每次下载完成都会提示是否保存,需要写额外的代码,就直接找了一个下载文件的库。按照你说的,只读取一个链接确实有点大材小用了...这是我第一次爬虫哈哈
    POPOEVER
        15
    POPOEVER  
       2018-03-28 13:04:08 +08:00
    @evenIfAlsoGo 哦,我简单查了一下,好像说是在 Windows 生成的 json 文件的 BOM 头标记导致的那个报错,这样改一下就可以了

    data = JSON.parse(data.toString('utf8').replace(/^\uFEFF/, ''));

    或者直接用 BOMStrip: https://www.npmjs.com/package/bomstrip

    抓下载链接用单元测试工具有点过了。。。
    evenIfAlsoGo
        16
    evenIfAlsoGo  
    OP
       2018-03-28 15:13:19 +08:00 via Android
    @POPOEVER cheerio 不能抓动态生成的渲染的网页...要渲染好像只能用无头浏览器。非常感谢~我去试试。
    POPOEVER
        17
    POPOEVER  
       2018-03-28 19:09:08 +08:00
    @evenIfAlsoGo php 这些后端渲染的页面还是可以的,带异步数据的 H5 页面的话肯定不行的,cheerio 不是浏览器,它只是个文档树遍历工具,从 jQ 内核剥离出来的,不能执行 js
    evenIfAlsoGo
        18
    evenIfAlsoGo  
    OP
       2018-03-28 21:59:09 +08:00 via Android
    @POPOEVER 明白了~赞!
    POPOEVER
        19
    POPOEVER  
       2018-03-28 22:03:37 +08:00
    @evenIfAlsoGo 不客气,一起学习
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2645 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 11:16 · PVG 19:16 · LAX 03:16 · JFK 06:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.