【问题标题】:scrape table using google app scripts使用谷歌应用脚​​本刮表
【发布时间】:2017-09-26 01:55:26
【问题描述】:

我很想从这个网站获取数据:https://finviz.com/screener.ashx?v=141&f=sh_avgvol_o500,sh_curvol_o2000,sh_price_u50&o=-volume

我想刮掉整张桌子。我试过用这个:

function myFunction(start) {
    var url = "https://finviz.com/screener.ashx?
v=141&f=sh_avgvol_o500,sh_curvol_o2000,sh_price_u50&o=-volume&r="+ 
start;
    var fromText = '<tbody>';
    var toText = '</tbody>';
    var content = UrlFetchApp.fetch(url).getContentText();
    var scraped = Parser
              .data(content)
              .from(fromText)
              .to(toText)
              .iterate();
}

我可以使用 xpath 抓取每个元素,但我认为它会很慢。

这是 html 和表格:

我可以得到整张桌子吗? 谢谢

【问题讨论】:

  • Parser 不是内置的 Google Apps 脚本类。你在使用accepted answer提到的库吗?

标签: google-apps-script web-scraping google-sheets urlfetch


【解决方案1】:

下面的修改怎么样?检索到的数据被导入到电子表格中。

注意:Parser 是一个 GAS 库。你可以在https://www.kutil.org/2016/01/easy-data-scrapping-with-google-apps.html看到详细信息

修改后的脚本:

function myFunction(start) {
  var url = "https://finviz.com/screener.ashx?v=141&f=sh_avgvol_o500,sh_curvol_o2000,sh_price_u50&o=-volume&r="+ start;
  var content = UrlFetchApp.fetch(url).getContentText();
  var scraped = Parser.data(content).from('class=\"screener-body-table-nw\"').to('</td>').iterate();
  var res = [];

  // If you don't want column titles, please remove this part.
  var temp = [];
  var titles = Parser.data(content).from("style=\"cursor:pointer;\">").to("</td>").iterate();
  titles.forEach(function(e){
    if (!~e.indexOf('\">')) {
      temp.push(e);
    } else if (~e.indexOf('img')) {
      temp.push(e.replace(/<img.+>/g, ''));
    }
  });
  res.push(temp);
  // -----

  var temp = [];
  var oticker = "";
  scraped.forEach(function(e){
    var ticker = Parser.data(e).from("<a href=\"quote.ashx?t=").to("&").build();
    var data1 = Parser.data(e).from("screener-link\">").to("</a>").build();
    var data2 = Parser.data(data1).from(">").to("<").build();
    if (oticker == "") oticker = ticker;
    if (ticker != oticker) {
      temp.splice(1, 0, oticker);
      res.push(temp);
      temp = [];
      oticker = ticker;
      temp.push(data1);
    } else {
      if (!~(data2 || data1).indexOf('<')) temp.push(data2 || data1);
    }
  });
  var ss = SpreadsheetApp.getActiveSheet();
  ss.getRange(ss.getLastRow() + 1, 1, res.length, res[0].length).setValues(res);
}

结果:

【讨论】:

  • 非常感谢!我不明白为什么当页面有 20 个时它只得到前 19 个结果。
  • @VincFort 欢迎。也谢谢你。是的。尽管它可能是该站点的规范,但我不知道。对不起。
  • @Tanaike 收到此错误。 ReferenceError:未定义“解析器”。 (第 4 行,文件“代码”)
  • @Md. Khairul Islam 对不起。在我的回答中,我忘记解释“解析器”。这是一个 GAS 库。您可以在此处查看详细信息。 kutil.org/2016/01/easy-data-scrapping-with-google-apps.html
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多