【问题标题】:node.js scrape html data values from external websitenode.js 从外部网站抓取 html 数据值
【发布时间】:2018-05-11 01:24:18
【问题描述】:

由于这是我的第一个问题,首先我想向 stackoverflow 社区问好:)

我最近开始学习 node.js。我想从这里废弃货币值:https://www.dailyfx.com/forex-rates,然后将它们保存在 .txt 文件中作为练习。

我找到了cheerio.js 框架并尝试了它。

该页面的 HTML 代码:

<tbody>
  <tr id="EURUSD" data-market-id="EURUSD" class="rates-now">
    <td>
      <span title="EURUSD">
        <a href="eur-usd">EURUSD</a>
      </span>
    </td>
    <td class="text-right rates-row-td">
      <span data-symbol="EURUSD" data-type="bid" data-value="1.19016" data-changescale="-1"></span>
    </td>
    <td class="text-right rates-row-td">
      <span data-symbol="EURUSD" data-type="ask" data-value="1.21016" data-changescale="-1"></span>
    </td>
    <td class="text-right rates-row-td">
      <span id="EURUSD-spread">0.60</span>
    </td>
    <td class="text-right rates-row-td">
      <span class="calendar-toggle-btn"></span>
    </td>
</tbody>

我的 node.js 代码:

var request = require('request');
var cheerio = require('cheerio');
var fs = require('fs');

request("https://www.dailyfx.com/forex-rates", function(error, response, body) {
  if(error) {
    console.log("Error: " + error);
  }
  console.log("Status code: " + response.statusCode);

  var $ = cheerio.load(body);

  $('tr.rates-row').each(function( index ) {
    var title = $(this).attr('data-market-id');
    console.log("Title: " + title);
    var value = $(this).find('td.rates-row-td > span').attr('data-value');
    console.log(" Value= " + value);
    fs.appendFileSync('stara.txt', value + '\n');
  });
});

输出如下:

Status code: 200
Title: EURUSD
 Value= undefined
Title: USDJPY
 Value= undefined
Title: AUDUSD
 Value= undefined
Title: GBPUSD
 Value= undefined
Title: USDCAD
 Value= undefined

等等。我不知道为什么属性 data-value 的值是未定义的。

【问题讨论】:

  • 您可以简单地以 json 格式加载数据:content.dailyfx.com/…
  • 你能解释一下吗?
  • 因为我相信这些值是异步检索的,所以我认为您可能会错过一些价值,但是如果您检查开发人员工具的网络选项卡,您可以看到一个 ajax 调用,您的值在该响应中json格式。万事如意
  • 我相信它是未定义的,因为它不断地用 jquery 更新请求。此外,当调用数据值时,它看起来像 var value = $(this).find('.rates-row-td > span').data('value');

标签: javascript jquery html node.js


【解决方案1】:

内容正在使用 javascript 动态插入。 Cheerio 只能读取 HTML,因此它始终是未定义的。

您可能需要使用 Puppeteer、jSDom、phantomjs 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-06
    • 2018-05-23
    • 2020-06-07
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    相关资源
    最近更新 更多