Google apps script 如何使用GoogleApps脚本从延迟加载(通过API)的网页中抓取数据?

Google apps script 如何使用GoogleApps脚本从延迟加载(通过API)的网页中抓取数据?,google-apps-script,web-scraping,xmlhttprequest,Google Apps Script,Web Scraping,Xmlhttprequest,我正在尝试使用Google apps脚本创建一个自动过程,用于从如下页面中抓取价格数据: 具有挑战性的部分是,网页上的数据是“延迟加载”的,因此我在其他网页上使用的“传统”跳过方法在这里不起作用 我已经考虑过解决这个问题的其他方法,但是: 条形图不通过http提供$AVVN等数据: //marketdata.websol.barchart.com/getHistory 我不想使用“下载”按钮,因为这需要 自动登录 ImportXML()不起作用(它适用于网页上的其他表, 但不是为了我想要的那

我正在尝试使用Google apps脚本创建一个自动过程,用于从如下页面中抓取价格数据:

具有挑战性的部分是,网页上的数据是“延迟加载”的,因此我在其他网页上使用的“传统”跳过方法在这里不起作用

我已经考虑过解决这个问题的其他方法,但是:

  • 条形图不通过http提供$AVVN等数据: //marketdata.websol.barchart.com/getHistory
  • 我不想使用“下载”按钮,因为这需要 自动登录
  • ImportXML()不起作用(它适用于网页上的其他表, 但不是为了我想要的那个)
我在下面的帖子中发现了一个类似的问题——从omegastripes那里得到了非常详细和信息丰富的回复:

-但当我运行代码时:

function test(){
  var url = 'https://www.barchart.com/proxies/core-api/v1/historical/get?symbol=%24AVVN&fields=tradeTime.format(m%2Fd%2Fy)%2CopenPrice%2ChighPrice%2ClowPrice%2ClastPrice%2CpriceChange%2Cvolume%2CsymbolCode%2CsymbolType&startDate=2019-04-15&endDate=2019-07-15&type=eod&orderBy=tradeTime&orderDir=desc&limit=2000&meta=field.shortName%2Cfield.type%2Cfield.description&raw=1'; 
  var options = {
     "muteHttpExceptions": false
  };
  var response   = UrlFetchApp.fetch(url, options);   
  Logger.log(response);
}
-然后我得到以下错误:

Request failed for https://www.barchart.com/proxies/core-api/v1/historical/get?symbol=%24AVVN&fields=tradeTime.format(m%2Fd%2Fy)%2CopenPrice%2ChighPrice%2ClowPrice%2ClastPrice%2CpriceChange%2Cvolume%2CsymbolCode%2CsymbolType&startDate=2019-04-15&endDate=2019-07-15&type=eod&orderBy=tradeTime&orderDir=desc&limit=2000&meta=field.shortName%2Cfield.type%2Cfield.description&raw=1 returned code 500. Truncated server response: <!doctype html> <html itemscope itemtype="http://schema.org/WebPage" lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="wi... (use muteHttpExceptions option to examine full response) (line 57, file "DS#1")

请求的请求失败https://www.barchart.com/proxies/core-api/v1/historical/get?symbol=%24AVVN&fields=tradeTime.format(m%2Fd%2Fy)%2CopenPrice%2ChighPrice%2ClowPrice%2ClastPrice%2CpriceChange%2Cvolume%2CsymbolCode%2CsymbolType&startDate=2019-04-15&endDate=2019-07-15&type=eod&orderBy=tradeTime&orderDir=desc&limit=2000&meta=field.shortName%2Cfield.type%2Cfield.description&raw=1返回代码500。截断的服务器响应:我找到的获取数据的唯一方法是使用您的变通方法,从控制台获取请求URL,但另外,在使用fetch()方法[1]时,您必须将“x-xsrf-token”和“cookie”头添加到选项中

您也可以从控制台获取“x-xsrf-token”和“cookie”请求头。唯一的问题是cookie和xsrf-token的有效期长达2小时,这是因为它们实现了跨站点请求伪造保护[2]:

以下是我测试和使用的代码:

function testFunction() {
  var url = 'https://www.barchart.com/proxies/core-api/v1/historical/get?symbol=%24AVVN&fields=tradeTime.format(m%2Fd%2Fy)%2CopenPrice%2ChighPrice%2ClowPrice%2ClastPrice%2CpriceChange%2Cvolume%2CsymbolCode%2CsymbolType&startDate=2019-04-16&endDate=2019-07-16&type=eod&orderBy=tradeTime&orderDir=desc&limit=2000&meta=field.shortName%2Cfield.type%2Cfield.description&raw=1';

  var map = {
    "x-xsrf-token": "XXXXX",
    "cookie": "XXXXX"
  }

  var options = {
     "method": "get", 
     "muteHttpExceptions": false,
     "headers": map
  };
  var response = UrlFetchApp.fetch(url, options);   
  Logger.log(response);

  var json = JSON.parse(response);
  Logger.log(json.data[0]);
}
[1]


[2]

您不能使用Google Apps脚本延迟加载网页,因为它们只返回网页的HTML内容,而不会在返回内容之前等待JavaScript加载


一个可能的解决方案是使用Google Cloud函数和Puppeter加载页面。Cloud函数提供了一个HTTP API,可以通过URLFetch服务直接从应用程序脚本调用。

Thx Andres感谢您花时间和精力回复我的帖子。当我将当前的“cookie”和“x-xsrf-token”粘贴到代码中时我只能(通过response.getAllHeaders()['Set-Cookie'])检索有关“市场”、“xsrf令牌”和“laravel_会话”的信息……但这是针对“响应头”的——我需要请求头中的“Cookie”和“x-xsrf-token”(如屏幕截图所示).所以我被困在解决方案的这一部分…(尽管它似乎偶尔通过使用从“响应头”中提取的信息来工作-非常奇怪(??)。